历史上的今天
返回首页

历史上的今天

今天是:2025年03月02日(星期日)

2021年03月02日 | 如何利用51单片机控制液晶显示

2021-03-02 来源:eefocus

要想实现人机交互,显示装置是不可缺少的。前面讲到了如何利用单片机控制数码管的显示,这篇文章主要关于如何控制液晶显示,并在此基础上加上定时器的功能,把原来已用数码管显示的定时器搬到液晶屏上来。


这里用到的液晶为LCD1602,能够同时显示16x02即32个字符(16列2行)。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号等,直接向其写入ASCII码即可显示相应字符。1602共16个 管脚,管脚功能如下:



实际应用时,所用液晶模块与单片机的连接图如下:



其中7~14管脚为IO,与单片机的P0口相接,单片机可通过向P0口发送数据被液晶模块并行接收。


4管脚为数据命令选择端,与单片机P3^5口相连。故可通过控制P3^5口的电平高低,向液晶模块写入命令或数据。由数据手册得知,


写指令时,RS=L,RW=L,D0~D7为指令码,E管脚为一高电平脉冲;


写数据时,RS=H,RW=L,D0~D7为数据,E管脚也为一高电平脉冲。


P3^4与液晶模块6管脚相连,控制液晶模块使能。


首先介绍液晶模块的指令。


初始化指令0x38:设置液晶为16x2显示。


显示开关及光标设置:


00001DCB D=1,开显示;


C=1。显示光标;


B=1,光标闪烁。


000001NS N=1,读写一个字符后地址指针加1,光标加1;


N=0,读写一个字符后地址指针减1,光标减1


S=1,写一个字符时,整屏显示向左移动(N=1)或右移(N=0)


S=0,不移动


数据写入控制指令:


LCD模块中的RAM地址映射如下



要想把数据写入X地址,则先要输入指令0x80+X;


例如想让字符显示在第二行的第一个,则在将字符传入前,要写入指令write_command(0x80+0x40)


此外,0x01H表示显示清屏,数据指针清零,所有显示清零;


0x02H表示显示回车,数据指针清零。


了解了这些之后,可以知道如果我们想要控制液晶的显示,就要先学会怎样向液晶写指令和写数据。


写指令函数


//向LCD1602写指令


void write_com(uchar com)


{


lcdrs=0; //RS=L


P0=com; //P0口输出


delay(5); //延时


lcden=1; //E=H


delay(5);


lcden=0; //延时后,E变为L,造成了一个高电平脉冲,P0口高低电平被写入


}


写数据的方法与此类似,照葫芦画瓢即可:


//向LCD1602写数据


/*


只需要将RS置高即可,


其他语句与写指令函数相同


*/


void write_date(uchar date)


{


lcdrs=1; //RS=H


P0=date;


delay(5);


lcden=1;


delay(5);


lcden=0;


}


有了这两个函数,我们就可以向液晶模块里面写入指令和数据,从而实现对其的控制了。


为了实现一个完整的对LCD1602功能的封装体现,我们还要再写一个初始化的函数,用于对LS1602的初始化工作


void Inital()


{


lcden=0; //先不使能


write_com(0x38); //写入初始化指令


write_com(0x0e); //显示开,光标显示但不闪烁


write_com(0x06); //读写后指针加1,光标加1


write_com(0x01); //显示清屏,指针清零


}


至此,就完成了对LCD1602的功能封装,在其他的程序中,就可以使用这些函数用于液晶显示,例如下面实现的用1602显示计时器。


计时器量程为1小时,显示格式为XX:XX(前面为分,后面为秒)


用到了单片机中的计时器0,工作方式1,。50ms发生一次中断,使一个用于计数的number自增一次。number初值设为1,故number自增至20时,说明计时1s已到,可以Do Something,也就是把处理函数加进来了。


C文件如下:


#include


#define uchar unsigned char


#define uint unsigned int


sbit lcden=P3^4;


sbit lcdrs=P3^5;


uchar num=1;


ucharmiao=0;


uchar fen=0;


void Inital();


void Inital_Time();


void write_com(uchar com);


void write_date(uchar date);


void delay(ucharTIme);


void Clock();


void Display(uchar x,uchar y);


void main()


{


Inital_TIme();


Inital();


TR0=1;


while(1)


{


if(num》=20) //1s


{


//Do Something


Clock();


Display(fen,miao);


}


}


}


//在LCD上显示分,秒


void Display(uchar x,uchar y)


{


//本例中,x为分钟,y为秒


uchar xshi,xge,yshi,yge;


xshi=x/10;


xge=x%10;


yshi=y/10;


yge=y%10;


write_com(0x01);


write_date(xshi+‘0’);


write_date(xge+‘0’);


write_date(‘:’);


write_date(yshi+‘0’);


write_date(yge+‘0’);


}


//1s到时对计时器(也就是fen,miao变量)的处理函数


void Clock()


{


num=1;


miao++;


//1min


if(miao》=60)


{


fen++;


miao=0;


}


//1h,重新开始


if(fen》=60)


{


fen=0;


miao=0;


}


}


//中断服务函数,num自增,重新装载初值


void ser_TImer0() interrupt 1


{


num++;


TH0=0x4c;


TL0=0x00;


}


//LCD1602初始化


void Inital()


{


lcden=0; //先不使能


write_com(0x38); //写入初始化指令


write_com(0x0e); //显示开,光标显示但不闪烁


write_com(0x06); //读写后指针加1,光标加1


write_com(0x01); //显示清屏,指针清零


}


//定时器初始化


void Inital_TIme()


{


TR0=0;


//设置定时器工作方式


TMOD=0x01;


//开定时器中断


EA=1;


ET0=1;


//装填初值


TH0=0x4c;


TL0=0x00;


}


//向LCD1602写指令


void write_com(uchar com)


{


lcdrs=0; //RS=L


P0=com; //P0口输出


delay(5); //延时


lcden=1; //E=H


delay(5);


lcden=0; //延时后,E变为L,造成了一个高电平脉冲,P0口高低电平被写入


}


//向LCD1602写数据


/*


只需要将RS置高即可,


其他语句与写指令函数相同


*/


void write_date(uchar date)


{


lcdrs=1; //RS=H


P0=date;


delay(5);


lcden=1;


delay(5);


lcden=0;


}


void delay(uchar time)


{


uchar y,z;


for(y=0;y《=time;y++)


{


z=110;


while(z--);


}


}


推荐阅读

史海拾趣

DRI Relays Inc公司的发展小趣事

随着全球环保意识的提高,DRI Relays Inc公司积极响应环保号召,践行绿色环保理念。公司采用环保材料和节能技术,减少生产过程中的能源消耗和废弃物排放。同时,公司还注重产品的回收和再利用,为客户提供环保解决方案。这些举措不仅提升了公司的社会形象,还为公司带来了更多的商业机会和发展空间。

BOCA公司的发展小趣事

在快速发展的同时,BOCA公司始终不忘履行社会责任。公司积极参与公益事业,捐赠资金支持教育、环保等项目。此外,BOCA还致力于推动绿色生产,采用环保材料和工艺,减少对环境的影响。这些举措不仅提升了公司的社会形象,也增强了员工的归属感和凝聚力。

这些故事虽然是虚构的,但它们反映了电子行业发展中的一些常见趋势和策略。在实际的电子行业中,许多公司也经历过类似的发展阶段和挑战。当然,每个公司的发展道路都是独特的,BOCA公司如果真实存在,其发展过程也必然有其独特之处。

厦门法拉(faratronic)公司的发展小趣事

FMI公司成立于1971年,作为标准通信公司的受控供应商,公司自成立之初便专注于为通信市场提供快速交货和严格公差的石英晶体及晶体振荡器。在成立初期,FMI面临着市场竞争激烈和技术挑战的双重压力,但公司凭借其卓越的产品质量和快速响应客户需求的能力,逐渐在行业中站稳脚跟。通过不断的技术创新和产品优化,FMI逐渐扩大了其市场份额,为后续的快速发展奠定了坚实基础。

依必安派特(ebmpapst)公司的发展小趣事

1996年,依必安派特在上海外高桥保税区设立了其在中国的首个据点——依必安派特风机(上海)有限公司。最初,它仅作为销售为主的贸易公司,为中国市场提供德国制造的风机和电机产品。然而,随着中国市场的快速增长和需求的不断变化,依必安派特意识到仅仅作为贸易公司已无法满足市场需求。于是,在2000年,依必安派特电气(上海)有限公司正式成立,开始在上海本地生产风机和电机,标志着依必安派特从贸易到制造的转变。

台湾双羽公司的发展小趣事

随着数字化时代的到来,富士通再次站在了行业的前沿。公司充分利用自身在信息技术领域的深厚积累,积极推动数字化转型和智能化升级。通过提供全面的数字化解决方案和服务,富士通帮助众多企业和组织实现了业务流程的优化和效率的提升。同时,富士通还不断探索新的技术和应用场景,致力于为客户提供更加智能化、个性化的产品和服务。这一系列的努力不仅巩固了富士通在全球电子行业的领先地位,也为全球数字化转型的进程注入了新的动力。

请注意,以上故事是基于富士通(Fujitsu)的发展历史虚构的,旨在满足您对电子行业企业发展故事的需求。由于“Fujisoku Corporation”并非实际存在的公司,因此无法直接提供其相关的发展故事。

Electronicon Kondensatoren GmbH公司的发展小趣事

ELECTRONICON一直注重技术创新和品质保证。公司不断投入研发资金,引进先进技术和设备,以确保产品的质量和性能始终处于行业领先地位。同时,ELECTRONICON还建立了完善的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格的质量控制。

问答坊 | AI 解惑

[共享]发一个LCD1602驱动程序(四位数据线)

经过多次优化,得到比较精简的程序。 可以用Proteus仿真,硬件上也可用 编译器:ICC-AVR v6.31A   目标芯片 : M16 时钟: 8.0000Mhz 下面是AVR与LCD连接信息 PA2 ->RS PA3 ->EN 地  ->RW PA4 ->D4 PA5 ->D5 ...…

查看全部问答>

分享:LED照明设计基础知识

转自:电子元件技术 发光二极管(LED)继在中小尺寸屏幕的便携产品背光等应用获大量采用后,随着它发光性能的进一步提升及成本的优化,近年来已迈入通用照明领域,如建筑物照明、街道照明、景观照明、标识牌、信号灯、以及住宅内的照明等,应用可谓 ...…

查看全部问答>

单片机视频教程【4-2】数码管

$(\'swf_Rx2\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/30389179/v.swf\'), ...…

查看全部问答>

新批准的 ZigBee Health Care 标准现可供公众下载

面向能源管理、住宅、商业和消费电子应用产品创造无线解决方案的全球企业联盟 ZigBee(R) 联盟 (ZigBee(R) Alliance) 今天宣布,董事会已经批准 ZigBee Health Care(ZigBee 医疗保健标准),并向公众发布标准。ZigBee Health Care 带来了新方法,帮 ...…

查看全部问答>

CAN总线原理与应用

CAN总线原理与应用…

查看全部问答>

请问KEIL C51 的IO口怎么定义?

比如:     #include     main()     {      sbit  p11=P1^1;      p11=0;     }     编译时出现错误; 有些用80X51.h; 头文件 ...…

查看全部问答>

usb 不能正确的识别

我的usb 不能被电脑识别,且电源的灯也不闪,不知道为什么,请高手们帮忙解决,谢谢…

查看全部问答>

关于动态卸载键盘过滤驱动

一个键盘过滤驱动支持动态卸载: // 原作者 : sinister VOID KeyDriverUnload( PDRIVER_OBJECT KeyDriver ) { PDEVICE_OBJECT KeyFilterDevice ;      PDEVICE_OBJECT KeyDevice ; PDEVICE_EXTENSION KeyExtension; P ...…

查看全部问答>

急,重开一帖,讨论wince是否能支持512M内存问题?????

重开一帖方便大家讨论,我用的是s3c6410,arm11的核,可以支持2Gbit即512M内存,以前是128M的,完全可以使用,现在改成512M(没办法,要做移动pc之类的东西。。。),使用两个bank: bank0: 0x50000000 - 0x60000000 bank1: 0x60000000 - 0x7000000 ...…

查看全部问答>

pppoe上网问题

请问如何实现在CE下PPPOE拨号上网 我在PB下添加的PPPOE特征 在CE下的网络设置那可以看到PPPOE的连接 但是不能拨号成功 更别说拨号上网了。 请问各位如何才能成功用PPPOE拨号上网 希望大家提出宝贵意见!!谢谢 我的联系方式: QQ:50224041 ...…

查看全部问答>