分享

基于HD44780的1602简单驱动(C51)

 共同成长888 2015-04-19

原文: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)列显示字符串"^_^"       }   } 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多