原创 【046】基于HD44780的1602简单驱动(C51)

2008-10-16 11:42 2776 6 6 分类: 电源/新能源
【046】基于HD44780的1602简单驱动(C51)
点击数:1963    发布日期:2007-5-26 1:36:00  
【收藏】 【评论】 【打印】 【编程爱好者论坛】 【关闭】


 




[相关] (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)列显示字符串"^_^"   
    }   
}
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条