原文:http://blog./wentao/26142.html lcd.h: /********************************************************************* * 标题: 基于HD44780的1602简单驱动(C51) * 文件: lcd.h * 作者: wentao http://blog. http://wentao. * 参考: AVR单片机与CPLD/FPGA综合应用入门 * 日期: 2007.5.10 * 修改: 2007.5.26 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 硬件连接定义及函数原型声明,此处P0,P2,P2_0等在AT89X51.h中定义, 也可用sfr, sbit自行定义。 * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! *********************************************************************/ #ifndef LCD_H #define LCD_H #include <AT89X51.h> #define LCD_DATA_PORT P0 // 液晶BD0~BD7与P0口相连 #define LCD_RS P2_0 // 液晶 RS 引脚与P2.0相接 #define LCD_RW P2_1 // 液晶 R/W 引脚与P2.1相接 #define LCD_E P2_2 // 液晶 E 引脚与P2.2相接 #define LCD_BF P0_7 // 液晶 DB7 引脚与P0.7相接 Busy Flag // 函数原型 // 向LCD写命令字 extern void lcd_command(unsigned char cmd); // 设置显示位置(即写入显示地址),行列均从0开始 extern void lcd_goto_xy(unsigned char x, unsigned char y); // 写字符(传入的参数实际为所需显示字符的地址,即液晶字符产生器中字符的地址) extern void lcd_putc(unsigned char c); // 指定位置写字符 extern void lcd_xy_putc(unsigned char x, unsigned char y, unsigned char c); // 写字符串 extern void lcd_puts(unsigned char *s); // 指定位置写字符串 extern void lcd_xy_puts(unsigned char x, unsigned char y, unsigned char *s); // LCD初始化 extern void lcd_init(void); #endif //LCD_H lcd.c: /********************************************************************* * 标题: 基于HD44780的1602简单驱动(C51) * 文件: lcd.c * 作者: wentao http://blog. http://wentao. * 参考: AVR单片机与CPLD/FPGA综合应用入门 * 日期: 2007.5.10 * 修改: 2007.5.26 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 硬件连接定义在lcd.h中 * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! *********************************************************************/ #include "lcd.h" // 本地函数 void lcd_delay_us(unsigned char us) // 延时微秒@12M,ms最大值255 { while(--us) { ; } } void lcd_delay_ms(unsigned char ms) // 延时毫秒@12M,ms最大值255 { unsigned char i; while(ms--) { for(i = 0; i < 124; i++) { ; } } } // 产生一个使能脉冲 void lcd_e_toggle(void) { LCD_E = 1; lcd_delay_us(3); LCD_E = 0; } // 循环检测LCD忙标志(BF),直到其值为0,方可执行下一指令 void lcd_wait_until_finish(void) { LCD_RW = 1; // RW置1,状态为读 LCD_RS = 0; // RS置0,读状态时RS需置低电平 LCD_E = 1; // E 置1,读取信息 while(LCD_BF) // 循环直至BF=0 { ; } LCD_E = 0; // E重置为0 } // 公共函数 // 向LCD写命令字 void lcd_command(unsigned charcmd) { LCD_RW = 0; // RW置0,状态为写 LCD_RS = 0; // RS置0,写入命令字 LCD_DATA_PORT = cmd; // 将命令字cmd送入LCD的数据端口 lcd_e_toggle(); // 产生使能脉冲,在下降沿开始执行,将命令字读入 lcd_wait_until_finish(); // 等待执行完毕 } // 设置显示位置(即写入显示地址),x,y均从0开始 void lcd_goto_xy(unsigned char x, unsigned char y) { unsigned char p; // p为字符显示位置,即DDRAM中的地址 if (y==0) { p = 0x00 + x; // (0,0)显示位置为0x00 } else { p = 0x40 + x; // (0,1)显示位置为0x40 } lcd_command(p + 0x80);// 写入显示地址时DB7须为高电平,加0x80 } // 写字符(传入的参数实际为所需显示字符的地址,即液晶字符产生器中字符的地址) void lcd_putc(unsigned char c) { LCD_RW = 0; // RW置0,状态为写 LCD_RS = 1; // RS置1,写入数据 LCD_DATA_PORT = c; // 将字符c(实际上是字符的地址)送入LCD数据端口 lcd_e_toggle(); // 使能脉冲 lcd_wait_until_finish(); // 等待完成 } // 指定位置写字符 void lcd_xy_putc(unsigned char x, unsigned char y, unsigned char c) { lcd_goto_xy(x,y); lcd_putc(c); } // 写字符串 void lcd_puts(unsigned char *s) { while(*s) { lcd_putc(*s); s++; } } // 指定位置写字符串 voidlcd_xy_puts(unsigned char x, unsigned char y, unsigned char *s) { lcd_goto_xy(x, y); lcd_puts(s); } // LCD初始化 void lcd_init(void) { lcd_delay_ms(12); // 上电后适当延时 lcd_command(0x38); // 设为8位接口模式,显示2行字符 lcd_command(0x06); // 写入新数据后光标右移 lcd_command(0x0c); // 显示功能开,不显示光标 lcd_command(0x01); // 清屏 } 测试: #include "lcd.h" void main(void) { while(1) { lcd_init(); // 初始化LCD lcd_goto_xy(0,0); // 字符位置:(0,0) lcd_putc('a'); // 显示字符"a" lcd_putc(0x62); // 在(1,0)显示字符"b"(在CGROM中的地址为0x62,与ASCII码对应) lcd_xy_putc(3,0,'c'); // 在(3,0)显示字符"c" lcd_goto_xy(0,1); // 字符位置:(0,1) lcd_puts("Hello world!"); // 显示字符串"Hello world!" lcd_xy_puts(16-3,1,"^_^"); // 在(13,1)列显示字符串"^_^" } } |
|