通用型51单片机lcd1602驱动

文件:lcd_1602.h
#ifndef _LCD1602_TRAVELER_H_
	#define _LCD1602_TRAVELER_H_


/*************************待配置项*******************************/

	#define DATA_LCD P0 //液晶与MCU 数据口
	sbit RS_LCD = P2^5; // 液晶的RS、RW、E 端在 MCU端的连线
	sbit RW_LCD = P2^6;
	sbit E_LCD = P2^7;
/****************************************************************/


	void lcdInit(void);
	//lcdInit() 液晶初始化、所有对液晶的操作之前均需要调用此函数

	void lcdDelayMs(const unsigned char ms);
	// lcdDelayMs(ms) 液晶内部使用的毫秒级延时函数 如不需要请自行删除
	// 该驱动函数须在不超过12MHz的晶振频率下才能正常工作

	void lcdDelayUs(const unsigned char us);
	// lcdDelayMs(ms) 液晶内部使用的微秒级延时函数 如不需要请自行删除
	// 该驱动函数须在不超过12MHz的晶振频率下才能正常工作
	
	void lcdWriteCmd(const unsigned char cmd);
	// lcdWriteCmd(cmd) 向液晶写命令字函数
	
	void lcdWriteChar(const unsigned char chr);
	// lcdWriteChar(chr) 向液晶写字符函数
	
	void lcdWriteData(const unsigned char pos,const unsigned char dat);
	//lcdWriteData(pos,dat)向液晶板上指定位置写字符函数

	void lcdWriteString(const unsigned char line,unsigned  char *str,const unsigned char offset);
	//lcdWriteString(line,*str,offset) 向液晶面板指定行、写字符串 可指定首字符偏移量 所显示的区域限制在当前行内

	bit lcdReadBusy();
	//读lcd的忙标志 忙 返回1 不忙 返回0

	void lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset);
	//lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset)写无符号整形数 到lcd (占位 5 字符)
	//line 指明所在行、c要写的数据、offset 距首列偏移量 
	

#endif
文件:lcd_1602.c
#include <reg52.h>
#include "lcd_1602.h"

/*************************************************************************/

/***********************12MHz晶振下微秒级延时*****************************/
void lcdDelayUs(const unsigned char us){
	unsigned char cin = us>>1; //prepare for clause while calculating time
	cin++;
	while(--cin);// 'dec cin' and 'jnz cin' 2 circles 
}
/*************************************************************************/

/***********************12MHz晶振下毫秒级延时*****************************/
void lcdDelayMs(const unsigned char ms){
	unsigned char cin = ms+1;
	while(--cin){
		lcdDelayUs(250);
		lcdDelayUs(250);
		lcdDelayUs(250);
		lcdDelayUs(250);
	}
}
/*************************************************************************/

/**************************写命令字***************************************/
void lcdWriteCmd(const unsigned char cmd){
	while(lcdReadBusy());
	E_LCD = 0;
	RS_LCD = 0;
	RW_LCD = 0;
	DATA_LCD = cmd;
	lcdDelayUs(40);
	E_LCD = 1;
	lcdDelayUs(250);
	E_LCD = 0;
	lcdDelayUs(250);
}
/*************************************************************************/

/************************写字符********************************************/
void lcdWriteChar(const unsigned char chr){
	while(lcdReadBusy());
	E_LCD = 0;
	RS_LCD = 1;
	RW_LCD = 0 ;
	DATA_LCD = chr;
	lcdDelayUs(40);
	E_LCD = 1;
	lcdDelayUs(250);
	E_LCD = 0;
	lcdDelayUs(250);

}
/*************************************************************************/

/*******************向指定位置写字符**************************************/
void lcdWriteData(const unsigned char pos,const unsigned char dat){
	unsigned char p;
	if(pos>=16) p = 0xb0 + pos ;
	else p = 0x80 + pos ;
	lcdWriteCmd(p);
	lcdWriteChar(dat);
}
/*************************************************************************/

/**************************写字符串***************************************/
void lcdWriteString(const unsigned char line,unsigned  char *str,const unsigned char offset){
	unsigned char p;
	unsigned char curlineend = (line)?32:16;	//每次写字符串最多允许写完单行,不允许跨行写
	unsigned char i=0;
	if(line) p = 16;else p = 0;
	p = p  + offset;
	while(p!=curlineend){
		if(!str[i])break;//如果到字符尾则退出
		lcdWriteData(p++,str[i++]);
	}
}
/*************************************************************************/

/************************初始化液晶***************************************/
void lcdInit(void){
	lcdDelayMs(15);
	lcdWriteCmd(0x38);
	lcdWriteCmd(0x38);
	lcdWriteCmd(0x38);
	lcdWriteCmd(0x06);
	lcdWriteCmd(0x0c);
	lcdWriteCmd(0x01);

	lcdWriteData(1,' ');//此为驱动的bug,未消除bug之前请勿删除此行及下行两行
	lcdWriteCmd(0x0c);
}
/*************************************************************************/

bit lcdReadBusy(){
	bit i = 1;
	E_LCD = 0;
	RS_LCD = 0;
	RW_LCD = 1;
	E_LCD = 1;
	i = DATA_LCD & 0x80;
	return i;
}

//lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset)写无符号整形数 到lcd (占位 5 字符)
//line 指明所在行、c要写的数据、offset 距首列偏移量 
void lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset){

	unsigned char i,j;
	unsigned char arrTmp[6] = {"     "};
	j = 0;
	do{
		i = c % 10;
		arrTmp[4 - j] = i + '0';
		j ++ ;
		c /= 10;
	}while(c);
	lcdWriteString(line,arrTmp,offset);
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanzhong104204

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值