1、ST7920 中文字库液晶显示模块 LCD12232 并行 8 位显示 C30 演示程序/*-ST7920 中文字库液晶显示模块 LCD12232 并行 8 位显示 C30 演示程序C30 菜鸟 HotP 2007.12.8 于雁塔菜地-*/#include “lcd.h“unsigned char LcdRowWriteEnable2 = 0, 0;/显示行刷新允许标志unsigned char LcdBuffer215;/LCD 显示缓冲区(2 行 15 个字符)unsigned char LcdRow = 0, LcdCol = 0;/虚拟光标void LcdInit(void)/LCD
2、 初始化LcdIOInit();/LCD 管脚初始化LcdClearBuffer();/清空 LCD 显示缓冲区/ LcdWriteCommand(0x20);/发送功能设定控制命令(4 位)LcdWriteCommand(0x30);/发送功能设定控制命令(8 位)LcdWriteCommand(0x02);/发送位址归位命令,设定 DDRAM 位址计数器为 0LcdWriteCommand(0x04);/发送进入点命令 LcdWriteCommand(0x0c);/发送开显示关光标命令LcdWriteCommand(0x01);/发送清除显示命令 LcdWriteCommand(0x80)
3、;/发送设定 DDRAM 地址 0x00 命令,光标定位到(0,0)/*-LcdWriteCommand(0x30);/发送功能设定控制命令(8 位)LcdWriteCommand(0x30);/发送功能设定控制命令(8 位)LcdWriteCommand(0x30);/发送功能设定控制命令(8 位)LcdWriteCommand(0x01);/发送清除显示命令 LcdWriteCommand(0x06);/发送进入点命令 0x06 LcdWriteCommand(0x0a);/发送开关显示关光标命令LcdWriteCommand(0x0c);/发送开显示关光标命令LcdWriteComman
4、d(0x02);/发送位址归位命令,设定 DDRAM 位址计数器为 0LcdWriteCommand(0x17);/游标或显示移位控制LcdWriteCommand(0x80);/发送设定 DDRAM 地址 0x00 命令,光标定位到(0,0)-*/LCD_BK = 0;/打开背光void LcdIOInit(void)/LCD 管脚初始化LCD_BK = 0;/打开背光LCD_E = 0;/不使能 LCD_RW = 1;/写读数据 TRIS_E = PORTOUTMODE;/定义 E 为输出 IOTRIS_RW = PORTOUTMODE;/定义 RW 为输出 IOTRIS_RS = POR
5、TOUTMODE;/定义 RS 为输出 IOTRIS_BK = PORTOUTMODE;/定义 BK 为输出 IOTRIS_DATA = 0;/定义 RE0RE7 为输出 IOvoid LcdWriteCommand(unsigned char Command)/写 LCD 命令字LCD_RS = 0;/命令 Nop(); LCD_RW = 0;/写命令 Nop(); LCD_E = 1;/使能 Nop(); LCD_BUS = Command;/发送 8 位命令 Nop(); LCD_E = 0;/不使能,读出数据 打入命令Nop(); LCD_RW = 1;/写命令结束 if (Comma
6、nd = 0x01)/清除显示命令,需要等待时间相对较长_delay_loop(1600);/st7920 要求等待 1.6mSelse_delay_loop(72);/st7920 要求等待 72uSvoid LcdWriteData(unsigned char data)/写 LCD 显示数据 LCD_RS = 1;/数据 Nop(); LCD_RW = 0;/写数据 Nop(); LCD_E = 1;/使能 Nop(); LCD_BUS = data;/发送 8 位数据 Nop(); LCD_E = 0;/不使能,打入数据 Nop(); LCD_RW = 1;/写数据结束 _delay_
7、loop(72);/st7920 要求等待 72uS void LcdWaitBusy(void)/LCD 忙标志测试(有时死机,故没用) TRIS_DATA = 0xff;/定义 RE0RE7 为输入 IO LCD_BUS = 0xff;Nop(); LCD_RS = 0;/命令 Nop(); LCD_RW = 1;/读数据Nop(); LCD_E = 1;/使能 Nop(); while(LCD_BF)/读取忙碌标志 BF(LCD_DATA.7)Nop();/搞不清有时死机在此处,所以用_delay_loop()代替LCD_E = 0;/不使能,读出状态 Nop(); TRIS_DATA
8、= 0;/定义 RE0RE7 为输出 IONop(); void LcdClearBuffer(void)unsigned char i, j;for (i = 0;i 2;i +)/2 行字符 /2 行汉字for (j = 0;j 15; j +)/15 个字符/每行 7 个半汉字 15 个字符LcdBufferj = ;/空白字符LcdRowWriteEnable = 1;/允许此行刷新汉字显示LcdRow = 0;/虚拟光标定位在 0 行LcdCol = 0;/虚拟光标定位在 0 列void LcdDisplayPos(unsigned char row, unsigned char c
9、ol)if (row 2) /刷新虚拟光标LcdCol = col;/刷新虚拟光标LcdRowWriteEnablerow = 1;/允许此行刷新汉字显示void LcdDisplay(const char * string)/不真的 LCD 显示while(*string)/0 字符结束LcdBufferLcdRowLcdCol + = *string +;/写入显示缓冲区unsigned char LcdDisplayBuffer(void)/显示刷新 LCD 缓冲区内的数据(一般 0.25S0.5S 刷新一次)unsigned char i, j;unsigned char num =
10、0;/刷新字符个数for (i = 0; i 2; i +)/2 行汉字if (LcdRowWriteEnable)/允许此行刷新汉字显示LcdWriteCommand(0x80 + (i 4);/移动真的 LCD 光标for (j = 0; j 15; j +)/每行 7 个半汉字 15 个字符LcdWriteData(LcdBufferj);/刷新显示字符num +;/刷新字符个数计数LcdRowWriteEnable = 0;/过后不允许此行刷新汉字显示return num;/返回实际刷新字符个数void _delay_loop(unsigned long count)/软件延时while(count -)/ClrWdt();/注意大延时要记住喂狗