📄 lcd1602.c
字号:
#ifndef _LCD_H_
#define _LCD_H_
#define LCD_REG P1 // 液晶BD0~BD7与P0口相连
sbit LCD_RS = P3^7; // 液晶 RS 引脚与P2.0相接
sbit LCD_RW = P3^6; // 液晶 R/W 引脚与P2.1相接
sbit LCD_E = P3^5; // 液晶 E 引脚与P2.2相接
sbit LCD_BF = P1^7; // 液晶 DB7 引脚与P0.7相接 Busy Flag
/*
// LCD初始化
void lcd_init(void);
// 设置显示位置(即写入显示地址),行列均从0开始
void lcd_goto_xy(unsigned char x, unsigned char y);
// 写字符(传入的参数实际为所需显示字符的地址,即液晶字符产生器中字符的地址)
void lcd_putc(unsigned char c);
// 写字符串
void lcd_puts(unsigned char *s);
// 指定位置写字符
void lcd_xy_putc(unsigned char x, unsigned char y, unsigned char c);
// 指定位置写字符串
void lcd_xy_puts(unsigned char x, unsigned char y, unsigned char *s);
*/
// 产生使能脉冲
void lcd_e_toggle()
{
LCD_E = 1;
delay_2us(10);
LCD_E = 0;
}
// 循环检测LCD忙标志(BF),直到其值为0,方可执行下一指令
void lcd_wait_until_finish(void)
{
LCD_RW = 1; // 读
LCD_RS = 0; // 指令
LCD_E = 1; // 读取信息
while(LCD_BF); // 循环直至BF=0
LCD_E = 0; // E重置为0
}
//读光标地址
Uint8 lcd_get_loc(void)
{
unsigned char loc;
LCD_RW = 1; // 读
LCD_RS = 0; // 指令
LCD_E = 1; // 读取信息
while(LCD_BF); // 循环直至BF=0
loc = LCD_REG;
LCD_E = 0;
return loc;
}
// 公共函数
// 向LCD写命令字
void lcd_command(unsigned char cmd)
{
LCD_RW = 0; // 写
LCD_RS = 0; // 指令
LCD_REG = 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 = x; // p为字符显示位置,即DDRAM中的地址,(0,0)显示位置为0x00
if (y==1)
p += 0x40; // (0,1)显示位置为0x40
lcd_command(p + 0x80); // 写入显示地址时DB7须为高电平,加0x80
}
// 写字符(传入的参数实际为所需显示字符的地址,即液晶字符产生器中字符的地址)
void lcd_putc(unsigned char c)
{
LCD_RW = 0; // 写
LCD_RS = 1; // 数据
LCD_REG = 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++);
}
// 指定位置写字符串
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_E = 0;
delay_50us(200); //上电后适当延时,10ms
lcd_command(0x38); //00111000 8位,双行,5x7
lcd_command(0x06); //00000110 光标右移,文字移动无效
lcd_command(0x0c); //00001100 显示功能开,显示光标关,光标闪烁关
lcd_command(0x01); //00000001 清屏,光标复位
lcd_goto_xy(0,0);
}
#endif //LCD_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -