历史上的今天
返回首页

历史上的今天

今天是:2025年04月15日(星期二)

正在发生

2021年04月15日 | 通用型51单片机lcd1602驱动

2021-04-15 来源:eefocus

文件: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);


}


推荐阅读

史海拾趣

联捷(Elinker)公司的发展小趣事

1999年,联捷(Elinker)在浙江的一个小镇上悄然成立,创始人凭借其敏锐的市场洞察力和对电子行业的热情,开始了艰难的创业之旅。初期,公司主要从事低端电子产品的生产和销售,面临着资金短缺、技术落后等重重困难。然而,创始人凭借着坚韧不拔的精神和不断的学习创新,逐渐在市场中站稳了脚跟。

Guerrilla RF公司的发展小趣事
避免灰尘和异物进入硬盘内部,定期清理硬盘周围的环境。
Connective Peripherals Pte Ltd公司的发展小趣事
硬盘在工作时应避免受到震动和冲击,以免损坏电动机驱动电路和其他部件。
芯海科技(CHIPSEA)公司的发展小趣事

近年来,随着新能源汽车市场的快速崛起,BMS(电池管理系统)技术成为关键。芯海科技凭借在“模拟信号链+MCU”领域的技术积累,成功开发出应用于BMS锂电管理的高精度模拟信号链芯片。这一技术的突破使得芯海科技能够切入新能源汽车市场,为行业的发展提供了有力支持。

Cables To Go公司的发展小趣事

在电子行业的激烈竞争中,Cables To Go公司以其卓越的产品品质和创新精神脱颖而出。公司从成立之初就注重产品研发,不断推出符合市场需求的高品质线缆产品。通过严格把控原材料采购和制造工艺,Cables To Go确保了每一根线缆都具备出色的性能和稳定性。同时,公司还积极投入研发,推出了一系列具有创新性的线缆解决方案,满足了客户多样化的需求。

FDK AMERICA公司的发展小趣事

随着全球电子市场的不断发展,FDK AMERICA公司意识到单靠国内市场已无法满足其发展需求。于是,公司积极寻求国际合作机会,与全球知名电子企业建立战略合作伙伴关系。通过合作,公司成功将产品打入国际市场,进一步扩大了市场份额。

问答坊 | AI 解惑

各种交换机的数据接口类型一览

作为局域网的主要连接设备,以太网交换机成为应用普及最快的网络设备之一,同时,也是随着这种快速的发展,交换机的功能不断增强,随之而来则是交换机端口的更新换代以及各种特殊设备连接端口不断的添加到交换机上,这也使得交换机的接口类型变得非 ...…

查看全部问答>

求“走进嵌入式开发的大门_刘贤玉”PPT版本资料一份

哪位朋友有这个版本的资料啊?能否共享出来啊!在下先 了…

查看全部问答>

顶尖创意来自高度好奇心

客户包括微软、苹果及百事可乐等业界巨头的顶尖创意管理公司IDEO的执行长兼总裁布朗(Tim Brown)把问题看得比答案更重要。 他回忆自己的第一份专业设计工作是在英格兰北部的一家小公司,那是一家从工业大革命时期开始营运,生产木工机械的老公司 ...…

查看全部问答>

SD卡问题

最近在调试SD卡驱动。。。。我在卡刚插入时用了很多打印,发现。。。在我插入时读取卡的分区表时突然把卡拔掉。。这是机器死掉了。。。。。问下有过SD卡经验的人。。。这里有什么大的问题呢…

查看全部问答>

vxworks模块加载

我用Tornado2.2(vxworks5.5),在虚拟机上建立文件系统FAT16格式,通过ftp从windows向目标机vxworks传递应用模块api.o,文件 可以用ls查看到,在目标机sell上运行ld(1,0,\"C:/api.o\"),报错\"error loading,errno=0x3d0001\".该文件在Tornado用target se ...…

查看全部问答>

Windows Mobile vs Windows CE

公司要做个项目,现在在确定平台,是使用windows mobile还是wince,主要是从研发周期和成本方面考虑,恳请大家给点建议。 目前只知道用mobile需要微软评估,另外开发工具费用、授权费用都很贵,但具体成本是多少没有概念;而用wince相对便宜些,网 ...…

查看全部问答>

高价求购 Tornado V 2.2.1的序列号

高价求购 Tornado V 2.2.1的序列号 联系方式:站内消息.…

查看全部问答>

咨询下版主:IAR仿真调试问题!

最近开始学习STM32,手头也有块板。 昨天晚上跑了下demo测试程序,用的是IAR4.42编译软件(第一次用IAR,不熟悉)。 现在问题是:跑原demo程序....debug....没问题; 但是在原demo上修改下程序后:rebuild all  没反应。 今天在 ...…

查看全部问答>

12月3号的颁奖什么情况啊

本帖最后由 paulhyde 于 2014-9-15 03:41 编辑 2011电子设计大赛,12月3号的颁奖什么情况啊  …

查看全部问答>