天天看点

基于51单片机的12864液晶演示器驱动

#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;
}
           

继续阅读