⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 【046】基于hd44780的1602简单驱动(c51).txt

📁 1602驱动的详细资料,包括完整源码,我刚刚完成的工程中用到的
💻 TXT
字号:
[相关] (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)列显示字符串"^_^"    
    }    
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -