📄 avr_1602.h
字号:
#include"avr/io.h"
#include"util/delay.h"
//---------------------------定义接口-----------------------//
//数据线接口
#define LCM_DDR_N DDRD
#define LCM_DataW PORTD
#define LCM_DataR PIND
//RS RW E用到的接口
#define LCM_DDR_S DDRB
#define LCM_PORT_S PORTB
#define LCM_RW 0
#define LCM_RS 1
#define LCM_E 2
//-----------------------------读状态-----------------------//
unsigned char ReadStatusLCM(void)
{
LCM_DDR_N=0x00; //数据总线接口为输入口
LCM_PORT_S&=~(1<<LCM_RS); //LCM_RS=0
LCM_PORT_S|=1<<LCM_RW; //LCM_RW=1
LCM_PORT_S|=1<<LCM_E; //LCM_E=1
while(LCM_DataR&0x80); //检测忙信号
LCM_PORT_S&=~(1<<LCM_E); //LCM_E=0
return LCM_DataR;
}
//-----------------------------写数据--------------------------//
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙,直到不忙返回
LCM_DDR_N=0xff; //数据总线接口为输出口
LCM_PORT_S|=1<<LCM_RS; //LCM_RS=1
LCM_PORT_S&=~(1<<LCM_RW); //LCM_RW=0
LCM_PORT_S&=~(1<<LCM_E); //LCM_E=0
LCM_DataW=WDLCM;
LCM_PORT_S|=1<<LCM_E; //下降沿写操作
LCM_PORT_S&=~(1<<LCM_E); //LCM_E=0
}
//---------------------------写指令------------------------------//
void WriteCommandLCM(unsigned char WCLCM,unsigned char BusyC)
{
if(BusyC) ReadStatusLCM(); //根据需要检测忙
LCM_DDR_N=0xff; //数据总线接口为输出口
LCM_PORT_S&=~(1<<LCM_RS); //LCM_RS=0
LCM_PORT_S&=~(1<<LCM_RW); //LCM_RW=0
LCM_PORT_S&=~(1<<LCM_E); //LCM_E=0
LCM_DataW=WCLCM;
LCM_PORT_S|=1<<LCM_E; //下降沿写操作
LCM_PORT_S&=~(1<<LCM_E); //LCM_E=0
}
//---------------------------读数据------------------------------//
unsigned char ReadDataLCM(void)
{
LCM_DDR_N=0x00; //数据总线接口为输入口
LCM_PORT_S|=1<<LCM_RS; //LCM_RS=1
LCM_PORT_S|=1<<LCM_RW; //LCM_RW=1
LCM_PORT_S|=1<<LCM_E; //LCM_E=1
return LCM_DataR;
}
//-------------------LCM初始化------------------------------------//
void LCMInit(void)
{
LCM_DDR_N=0xff; //数据总线接口为输出口
LCM_DDR_S=(1<<LCM_RW)|(1<<LCM_RS)|(1<<LCM_E); //设置RW RS E 口为输出
LCM_DataW=0;
//固定模式
WriteCommandLCM(0x38,0); //3次显示模式设置,不检测忙信号
_delay_ms(5);
WriteCommandLCM(0x38,0);
_delay_ms(5);
WriteCommandLCM(0x38,0);
_delay_ms(5);
WriteCommandLCM(0x38,1); //功能设置(8位,2行,5*7),开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); //显示光标移动设置
WriteCommandLCM(0x0F,1); //显示开及光标设置
WriteCommandLCM(0x80,1); //起始位置行1列1
}
//---------------------------按指定位置显示一个字符-----------------------//
void DisplayOneChar(unsigned char x,unsigned char y,unsigned char DData)
{
y&=0x01; //限制x不能大于15,y不能大于1
x&=0x0F;
x= (y==1)? 0x40:0x00; //测试显示第几行
x|=0x80; //算出指令
WriteCommandLCM(x,1);
WriteDataLCM(DData);
}
//-------------------------在指定位置显示一个字符串-----------------------//
void DisplayListChar(unsigned char x,unsigned char y,unsigned char *DData)
{
unsigned char k=0;
y&=0x01; //限制x不能大于15,y不能大于1
x&=0x0F;
x= (y==1)? 0x40:0x00; //测试显示第几行
x|=0x80; //算出指令
WriteCommandLCM(x,1);
while(*(DData+k)!='\0')
{
WriteDataLCM(*(DData+k));
k++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -