#include <reg52.h>
/* CMD begin*/
#define LCD1602_SET writeCD_1602(0x38, 0) // 1602设置
#define LCD1602_CLOSE writeCD_1602(0x01, 0) // 显示清屏
#define LCD1602_ENTER writeCD_1602(0x02, 0) // 显示回车
#define LCD1602_LMOVE writeCD_1602(0x18, 0) // 屏幕左移
#define LCD1602_RMOVE writeCD_1602(0x1c, 0) // 屏幕右移
#define LCD1602_LCURSOR writeCD_1602(0x10, 0) // 光标左移
#define LCD1602_RCURSOR writeCD_1602(0x14, 0) // 光标右移
/* CMD end*/
/* CMD 0x08 begin*/
#define LCD1602_08(CMD) writeCD_1602(0x08 | CMD, 0)
// 指令
#define LCD1602_SHOW 0x04 // 屏幕显示开关
#define LCD1602_CURSOR 0x02 // 光标显示开关
#define LCD1602_TWINKLE 0x01 // 光标闪烁开关
// 预设
#define LCD1602_08PRESET LCD1602_SHOW
/* CMD 0x08 end*/
/* CMD 0x04 begin*/
#define LCD1602_04(CMD) writeCD_1602(0x04 | CMD, 0)
// 指令
#define LCD1602_DIRECTION 0x02 // 地址增减方向
#define LCD1602_MSTATE 0x01 // 屏幕写入状态
// 预设
#define LCD1602_04PRESET LCD1602_DIRECTION
/* CMD 0x04 end*/
// 1602 接口定义
sbit LCDen = P3 ^ 4;
sbit LCDrs = P3 ^ 5;
sbit LCDrw = P3 ^ 6;
/*
功能 :阻塞延时
参数 :<unsigned int>每毫秒每单位
返回值 :<void>
*/
void blockDelay(unsigned int ms) {
unsigned char number;
while (ms--) {
number = 110;
while (number--);
}
}
/*
功能 :将指令/数据写入1602液晶
参数 :<unsigned char>数据<unsigned char>0为写指令 1为写数据
返回值 :<void>
*/
void writeCD_1602(unsigned char dat, unsigned char cmd) {
LCDrs = cmd;
LCDrw = 0;
P0 = dat;
LCDen = 1;
blockDelay(32);
LCDen = 0;
}
/*
功能 :1602液晶初始化
参数 :<void>
返回值 :<void>
*/
void lcdInit_1602() {
LCD1602_SET;
LCD1602_08(LCD1602_08PRESET);
LCD1602_04(LCD1602_04PRESET);
LCD1602_CLOSE;
}