/****************************************************************************/
/* */
/* Copyright (c) 2012, pcwebmaster */
/* All rights reserved. */
/* */
/* Email:pcwebmaste@163.com */
/* */
/****************************************************************************/
/****************************************************************************/
/* 文件名:LCD12864.c */
/* 版 本:Version 1.0 */
/* 描 述:實現液晶和單片機的通訊協議,根據計算機發給的命令進行人機交互 */
/* 作 者:pcwebmaste */
/* 函 數: */
/* LCD12864_init */
/* LCD12864WriteCommand */
/* LCD12864WriteByte */
/* LCD12864_init */
/* LCD12864SetXY */
/* LCD12864PrintfString */
/* 歷史記錄: */
/* pcwebmaste 2008-07-10 Creat Inital version. (Version 1.0) */
/* 模塊化 2012-06-02 Creat Inital version. (Version 2.0) */
/****************************************************************************/
#include "12864.h"
#define LOW 0
#define HIGH 1
sbit wela = P2^6;
sbit dula = P2^7;
#define LCD12864_RS(x) {if((x))P3 |= 1<<LCD12864_RS_PIN;\
else P3 &=~(1<<LCD12864_RS_PIN);}//寄存器選擇輸入
#define LCD12864_RW(x) {if((x))P3 |= 1<<LCD12864_RW_PIN;\
else P3 &=~(1<<LCD12864_RW_PIN);}//液晶讀/寫控制
#define LCD12864_EN(x) {if((x))P3 |= 1<<LCD12864_EN_PIN;\
else P3 &=~(1<<LCD12864_EN_PIN);}//液晶使能控制
#define LCD12864_MD(x) {if((x))P3 |= 1<<LCD12864_MD_PIN;\
else P3 &=~(1<<LCD12864_MD_PIN);}//串/并方式控制
#define LCDWELA(x) {if((x))P2 |= 1<<6; else P2 &=~(1<<6);}
#define LCDDULA(x) {if((x))P2 |= 1<<7; else P2 &=~(1<<7);}
#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
/*********************************************/
/* */
/* 主程序 */
/* */
/*********************************************
void main()
{
DelayNOP(); //延時
wela=LOW;
dula=LOW;
LCD12864_init(); //初始化LCD
LCD12864PrintfString(0,1,dis1);
LCD12864PrintfString(1,0,dis2);
LCD12864PrintfString(2,0,dis3);
LCD12864PrintfString(3,1,dis4);
while(1);
}
/********************************************
*函數名稱:LCD12864_init
*輸 入:無
*輸 出:lcd_busy 為1時,忙,等待。
lcd-busy 為0時,閑,可寫指令與數據
*說 明:LCD12864LCD檢查忙狀態
/*******************************************/
bit LCD1286_busy()
{
bit result;
LCD12864_RS(LOW);
LCD12864_RW(HIGH);
LCD12864_EN(HIGH);
DelayNOP();
result = (bit)(LCD12864_PORT&0x80);
LCD12864_EN(LOW);
return(result);
}
/********************************************
*函數名稱:LCD12864WriteCommand
*輸 入:ucCmd 要寫入的命令
*輸 出:無
*說 明:LCD12864 寫命令
RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
********************************************/
void LCD12864WriteCommand(unsigned char ucCmd)
{
while(LCD1286_busy());
LCD12864_RS(LOW);
LCD12864_RW(LOW);
LCD12864_EN(LOW);
_nop_();
_nop_();
LCD12864_PORT = ucCmd;
DelayNOP();
LCD12864_EN(HIGH);
DelayNOP();
LCD12864_EN(LOW);
}
/********************************************
*函數名稱:LCD12864WriteByte
*輸 入:ucByte 要寫入的字節
*輸 出:無
*說 明:LCD12864 寫字節
RS=H,RW=L,E=高脈沖,D0-D7=數據。
********************************************/
void LCD12864WriteByte(unsigned char ucByte)
{
while(LCD1286_busy());
LCD12864_RS(HIGH);
LCD12864_RW(LOW);
LCD12864_EN(LOW);
LCD12864_PORT = ucByte;
DelayNOP();
LCD12864_EN(HIGH);
DelayNOP();
LCD12864_EN(LOW);
}
/********************************************
*函數名稱:LCD12864_init
*輸 入:無
*輸 出:無
*說 明:LCD12864LCD初始化設定
/*******************************************/
void LCD12864_init()
{
LCD12864_MD(HIGH); //并口方式
LCD12864WriteCommand(0x34); //擴充指令操作
LCD12864WriteCommand(0x30); //基本指令操作
LCD12864WriteCommand(0x0C); //顯示開,關光標
LCD12864WriteCommand(0x01); //清除LCD的顯示內容
}
/********************************************
*函數名稱:LCD12864SetXY
*輸 入:x 橫坐標 y 縱坐標
*輸 出:無
*說 明:LCD12864 設置坐標
********************************************/
void LCD12864SetXY(unsigned char X,unsigned char Y)
{
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
LCD12864WriteCommand(X+Y); //顯示地址
}
/********************************************
*函數名稱:LCD12864SetXY
*輸 入:x 橫坐標 y 縱坐標
*輸 出:無
*說 明:LCD12864 設置坐標
為什么這樣寫不行呢?
********************************************
void LCD12864SetXY(unsigned char x,unsigned char y)
{
switch(y)
{
case 1:
{
LCD12864WriteCommand(0x80+x);
}
break;
case 2:
{
LCD12864WriteCommand(0x90+x);
}
break;
case 3:
{
LCD12864WriteCommand(0x88+x);
}
break;
case 4:
{
LCD12864WriteCommand(0x98+x);
}
break;
default:break;
}
// LCD12864WriteCommand(x+y); //顯示地址
}
/********************************************
*函數名稱:LCD12864PrintfString
*輸 入:x 橫坐標 y 縱坐標 s字符串
*輸 出:無
*說 明:LCD12864 打印字符串
********************************************/
void LCD12864PrintfString(unsigned char x,unsigned char y,unsigned char *s)
{
LCD12864SetXY(x,y); //設置顯示坐標
while(s && *s)
{
LCD12864WriteByte(*s); //顯示逐個字符
s++;
}
}
/****************************************************************************/
/* */
/* Copyright (c) 2012, pcwebmaster */
/* All rights reserved. */
/* */
/* Email:pcwebmaste@163.com */
/* */
/****************************************************************************/
/****************************************************************************/
/* 文件名:LCD12864.c */
/* 版 本:Version 1.0 */
/* 描 述:實現液晶和單片機的通訊協議,根據計算機發給的命令進行人機交互 */
/* 作 者:pcwebmaste */
/* 函 數: */
/* LCD12864_init */
/* LCD12864WriteCommand */
/* LCD12864WriteByte */
/* LCD12864_init */
/* LCD12864SetXY */
/* LCD12864PrintfString */
/* 歷史記錄: */
/* pcwebmaste 2008-07-10 Creat Inital version. (Version 1.0) */
/* 模塊化 2012-06-02 Creat Inital version. (Version 2.0) */
/****************************************************************************/
#ifndef __12864_H__
#define __12864_H__
#include <reg52.h>
#include <intrins.h>
#define LCD12864_PORT P0 //數據口
#define LCD12864_RS_PIN 5
#define LCD12864_RW_PIN 6
#define LCD12864_EN_PIN 4
#define LCD12864_MD_PIN 7
unsigned char code dis1[] = {"中國昌樂是寶石"};
unsigned char code dis2[] = {"之都,西瓜之鄉!"};
unsigned char code dis3[] = {"中國昌樂寶石城"};
unsigned char code dis4[] = {"人民歡迎您!"};
/********************************************
*函數名稱:LCD12864_init
*輸 入:無
*輸 出:lcd_busy 為1時,忙,等待。
lcd-busy 為0時,閑,可寫指令與數據
*說 明:LCD12864LCD檢查忙狀態
/*******************************************/
bit LCD1286_busy();
/********************************************
*函數名稱:LCD12864WriteCommand
*輸 入:ucCmd 要寫入的命令
*輸 出:無
*說 明:LCD12864 寫命令
RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
********************************************/
void LCD12864WriteCommand(unsigned char ucCmd);
/********************************************
*函數名稱:LCD12864WriteByte
*輸 入:ucByte 要寫入的字節
*輸 出:無
*說 明:LCD12864 寫字節
RS=H,RW=L,E=高脈沖,D0-D7=數據。
********************************************/
void LCD12864WriteByte(unsigned char ucByte);
/********************************************
*函數名稱:LCD12864_init
*輸 入:無
*輸 出:無
*說 明:LCD12864LCD初始化設定
/*******************************************/
void LCD12864_init();
/********************************************
*函數名稱:LCD12864SetXY
*輸 入:x 橫坐標 y 縱坐標
*輸 出:無
*說 明:LCD12864 設置坐標
********************************************/
void LCD12864SetXY(unsigned char X,unsigned char Y);
/********************************************
*函數名稱:LCD12864PrintfString
*輸 入:x 橫坐標 y 縱坐標 s字符串
*輸 出:無
*說 明:LCD12864 打印字符串
********************************************/
void LCD12864PrintfString(unsigned char x,unsigned char y,unsigned char *s);
void LCD12864PrintfData(unsigned char x,unsigned char y,unsigned char DData);
/********************************************
*函數名稱:LCD12864PrintfNum
*輸 入:add ge shi bai
*輸 出:無
*說 明:此函數不好寫成通用函數,在連續地址里
連續寫數字半角顯示。根據情況修改
********************************************/
void LCD12864PrintfNum(unsigned char add,unsigned char ge,unsigned char shi,unsigned char bai)
{
LCD12864WriteCommand(add);
LCD12864WriteByte(bai+0x30);
LCD12864WriteByte(shi+0x30);
LCD12864WriteByte(ge+0x30);
}
#endif