通用型51单片机lcd1602驱动

来源:本站
导读:目前正在解读《通用型51单片机lcd1602驱动》的相关信息,《通用型51单片机lcd1602驱动》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《通用型51单片机lcd1602驱动》的详细说明。
简介:通用型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

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

}

提醒:《通用型51单片机lcd1602驱动》最后刷新时间 2024-03-14 01:14:26,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《通用型51单片机lcd1602驱动》该内容的真实性请自行鉴别。