我们使用时把这段代码保存成.h的头文件,在主程序中包括这个头文件就行
依据你们液晶电路更改下面的端口宏界说即可
//CPU:ATmega128; 时钟频率为16MHz
//编译环境为ICCAVR
//头文件
#include
#include
#include
//数据端口界说
#define Dat_Port_Write PORTA
#define Dat_Port_Read PINA
//操控端口及相应的位
#define RS_RW_EN_Control PORTG
#define LCM_RS 0
#define LCM_RW 1
#define LCM_EN 2
#define uchar unsigned char
#define uint unsigned int
//延时函数
void Delay_Ms(unsigned int ms)
{
for(;ms>1;ms–);
}
//写数据
void Write_Data_LCM(unsigned char WDLCM)
{
Read_Status_LCM(); //检测忙
Delay_Ms(100);
RS_RW_EN_Control|=BIT(LCM_RS); //RS=1
Delay_Ms(100);
RS_RW_EN_Control=~BIT(LCM_RW); //RW=0
Delay_Ms(100);
RS_RW_EN_Control|=BIT(LCM_EN); //EN=1
Delay_Ms(100);
Dat_Port_Write=WDLCM; //输出数据
Delay_Ms(100);
RS_RW_EN_Control=~BIT(LCM_EN); //EN=0
Delay_Ms(100);
}
//写指令
void Write_Command_LCM(unsigned char WCLCM)
{
Read_Status_LCM(); //依据需要检测忙
Delay_Ms(100);
RS_RW_EN_Control=~BIT(LCM_RS); //RS=0
Delay_Ms(100);
RS_RW_EN_Control=~BIT(LCM_RW); //RW=0
Delay_Ms(100);
RS_RW_EN_Control|=BIT(LCM_EN); //EN=1
Delay_Ms(100);
Dat_Port_Write=WCLCM; //输出指令
Delay_Ms(100);
RS_RW_EN_Control=~BIT(LCM_EN); //EN=0
Delay_Ms(100);
}
//读状况:检测忙
void Read_Status_LCM(void)
{
uchar temp;
uchar flag = 1;
while(flag==1)
{
DDRA=0x00; //端口A改为输入
Dat_Port_Write = 0xff;
Delay_Ms(100);
RS_RW_EN_Control=~BIT(LCM_RS); //RS=0
Delay_Ms(100);
RS_RW_EN_Control|=BIT(LCM_RW); //RW=1
Delay_Ms(100);
RS_RW_EN_Control|=BIT(LCM_EN); //EN=1
Delay_Ms(100);
temp = Dat_Port_Read; //读端口A
Delay_Ms(100);
DDRA=0xff; //端口A改为
Delay_Ms(100);
RS_RW_EN_Control=~BIT(LCM_EN); //EN=0
Delay_Ms(100);
if(temp>>7==0)
flag = 0;
}
}
//LCM初始化
void LCM_Init(void)
{
Write_Command_LCM(0x38); //三次显现形式设置,不检测忙信号
Delay_Ms(1000);
Write_Command_LCM(0x38);
Delay_Ms(1000);
Write_Command_LCM(0x38);
Delay_Ms(1000);
Write_Command_LCM(0x38); //显现形式设置,开端要求每次检测忙信号
Write_Command_LCM(0x08); //封闭显现
Write_Command_LCM(0x01); //显现清屏
Write_Command_LCM(0x06); //显现光标移动设置
Write_Command_LCM(0x0C); //显现开及光标设置
}
/