正文

【046】基于HD44780的1602简单驱动(C51)2007-05-26 01:36:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/26142.html

分享到:


[相关] (001)基于HD44780液晶芯片的16×2字符型液晶(1602)简介。


lcd.h:

  • /*********************************************************************  
  • * 标题: 基于HD44780的1602简单驱动(C51)  
  • * 文件: lcd.h  
  • * 作者: wentao     http://blog.liuwentao.net  
  •                    http://wentao.programfan.com  
  • * 参考: 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.liuwentao.net  
  •                    http://wentao.programfan.com  
  • * 参考: 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 char cmd)   
  • {   
  •     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++;   
  •     }   
  • }   
  •   
  •   
  • // 指定位置写字符串   
  •   
  • void lcd_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)列显示字符串"^_^"   
  •     }   
  • }



    注意:由于仿真模型与实际硬件有差异,上述驱动直接仿真会有问题,有兴趣可以参考一下这个帖子
  • 阅读(9916) | 评论(4)


    版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

    评论

    loading...
    您需要登录后才能评论,请 登录 或者 注册