📄 【046】基于hd44780的1602简单驱动(c51).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 + -