📄 lcd.h
字号:
#include <avr/sfr_defs.h>
#define LCDPORT PORTB //数据总线接在PB口
#define LCDDDR DDRB
#define LCDPIN PINB
#define En_H sbi(PORTD,5) //En接PD5
#define En_L cbi(PORTD,5)
#define RW_R sbi(PORTD,4) //R/W接PD4
#define RW_W cbi(PORTD,4)
#define RS_H sbi(PORTD,3) //RS接PD3
#define RS_L cbi(PORTD,3)
#define DelaytE Delay(10)
#define Clear_Screen Write_Command(0x01) //定义清屏语句
void Delay(uint16_t time) //延时程序
{
while(time>0)
{
time--;
}
}
void En_Toggle(void) //产生一个使能脉冲
{
En_H; //拉高使能位
DelaytE; //保持高电平一定时间
En_L; //拉低使能位,产生一个下降沿
DelaytE; //保持电平一定时间
}
/*不断检测LCD的忙标志(BF),直到其为0,表示可以执行下一条指令*/
void Wait_Until_Ready(void)
{
RW_R; //设为读状态
RS_L; //所读为状态位
LCDDDR=0x00; //单片机设为输入,用以读取LCD的忙标志
LCDPORT=0x00;
En_H;
DelaytE;
loop_until_bit_is_clear(LCDPIN,7); //不断循环,直至BF=0
En_L;
}
void Write_Command(uint8_t Command) //向LCD写入命令字
{
RW_W; //置为写状态
RS_L; //写入的是命令字
LCDDDR=0xFF;
LCDPORT=Command; //写命令字
En_Toggle(); //产生使能脉冲,在下降沿开始执行指令
Wait_Until_Ready(); //等待指令执行完毕
}
void Write_Data(uint8_t Data)
{
RW_W;
RS_H; //写入的是数据
LCDDDR=0xFF;
LCDPORT=Data;
En_Toggle();
Wait_Until_Ready();
}
void Write_Position(uint8_t row,uint8_t colum) //设字符位置
{
uint8_t p;
if(row==1)
{
p=0x80+colum-1;
Write_Command(p);
}
else
{
p=0xC0+colum-1;
Write_Command(p);
}
}
void Write_String(uint8_t *s) //写入字符串
{
for(;*s!='\0';s++)
Write_Data(*s);
}
void Initialize_LCD(void) //LCD初始化
{
DDRD=0xFF; //LCD的控制线在PD口,所以将其设为输出
//此处可根据实际情况调整,或者在主程序中设置
Write_Command(0x38); //设为8位接口模式,显示两行字符
Write_Command(0x06); //写入新数据后光标右移
Write_Command(0x0C); //显示功能开,不显示光标
Clear_Screen; //清屏
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -