如何利用51单片机控制液晶显示

发布者:脑洞狂想最新更新时间:2021-03-02 来源: eefocus关键字:51单片机  人机交互 手机看文章 扫描二维码
随时随地手机看文章

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


这里用到的液晶为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--);


}


}


关键字:51单片机  人机交互 引用地址:如何利用51单片机控制液晶显示

上一篇:51单片机学习单片机之路总结
下一篇:如何使用AT89C51单片机控制LED显示屏的电路设计

推荐阅读最新更新时间:2024-11-08 18:10

基于51单片机和ADC0808 ADC0809的自动数字电压表设计
前言: 之前讲过基于数码管显示的自动数字电压表,接下来讲一下基于LCD1602显示的相关设计,分别利用的是TI公司的ADC0808和ADC0809。 硬件和软件设计 基于51单片机+ADC0808+LCD1602 测试电压范围为2.1~25V(超出这个范围,程序会卡死),精度<0.05 仿真图如下: 部分代码如下: #include AT89X52.H #define LEDDATA P0 #define v20_on {s3=0;s2=0;s1=1;} //宏定义不同量程,不同的开关状态 #define v2_on {s3=0;s2=1;s1=0;} #define v02_on {s3=1;s2=0;s
[单片机]
基于<font color='red'>51单片机</font>和ADC0808 ADC0809的自动数字电压表设计
Proteus通过虚拟串口程序仿真51单片机串口的实现
1.参考文章下载地址: http://download.csdn.net/source/1927624 2. 虚拟串口 3. 串口调试助手 4. Proteus 7.5 sp3 实现方法 1.参考文章(参考文章是从CSDN下载的一篇PDF文件)已经很详细的说明了怎么实现,我就不想啰嗦了,我只提供几个关键的截图和串口调试程序代码 如果参考文章打不开我提供参考文章的下载连接 2.提供Proteus的连线图如下:(值得注意的是单片机的RXD和TXD分别和串口的RXD和TXD一一对应相连,这和用Proteus的虚拟终端给串口输入信号时,单片机和串口的连接方式是不一样的,用Proteus的虚拟终端作为串口输入信号的时候单片机的RX
[单片机]
Proteus通过虚拟串口程序仿真<font color='red'>51单片机</font>串口的实现
AT89C2051单片机制作的六位数显多路定时电子钟
这里介绍的电子钟,电路可称得上极简,它仅使用单片的20引脚单片机完成电子钟的全部功能,而笔者见到的其它设计方案均采用二片以上的多片IC实现。 一片20引脚的单片机STC2032(引脚排列与AT89C2051完全相同)为电子钟主体,其显示笔画数据从P1口分时输出,P3口则输出对应的六位选通信号。由于LED数码管点亮时耗电较大,故不能使用AT89C2051单片来完成,但是可以可以用STC89C2032来完成。另外,本站制作时用超高亮的发光二极管代替昂贵的大数码管,成本低,效果独特。 本电子钟设计有三个轻触式按键,这里我们分别命名为:模式设定键K1、加调整键K2、减调整键K3。由于STC89C2032内部已经集成有复位电阻,所以,
[单片机]
AT89C20<font color='red'>51单片机</font>制作的六位数显多路定时电子钟
51单片机学习笔记5 -- 外部中断
1.外部中断概念 外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。 2.引脚功能复用 51单片机芯片内部有很多外设,这些外设的引脚都是与IO口复用的。也就是说,一个IO口如果可以复用为内置外设的功能引脚,那么当这个IO口作为内部外设使用的时候,就叫做复用(一般来说,当某个引脚作为复用功能使用时,它将不能作为其他复用功能和普通IO来使用,即单个引脚只能作为普通IO或单个复用功能来使用)。 51单片机也有引脚具备复用功能,如下图P3端口的引脚可复用成串口收发或外部中断 3.中
[单片机]
<font color='red'>51单片机</font>学习笔记5 -- 外部中断
51单片机-UART口发送一串字符
昨天说的是如何通过UART口发送一个英文字母,其实对照那个ASCII码表,大小写字母、数字、标点,还有一些符号都可以发送,只要你找到它对应的编码就行。 今天说一下如何用UART口发送字符串和汉字。 如果按照昨天的思路,发送一串字母或者数字也很好实现,我只要把这串字母或者数字对应的ASCII码找出来,写进一个数组就行了。但是这样还要查表,有点麻烦,今天说一个更简单的方法。 假如我想发送5个字母 A,用昨天的方法,怎么实现?定义一个数组: Uchar table = {0x41,0x41,0x41,0x41,0x41}; //五个字母 A 显得很傻,这次的方法:
[单片机]
学<font color='red'>51单片机</font>-UART口发送一串字符
51单片机制作的波形发生器
相信很多朋友都可能接触到一个波型发生器的制作,可能刚刚入门,做的东西也不会说是很复杂。可能就一个矩形波,或者是三角波。但是网上的很多资料是忽悠人的,就此,我也提供一个比较完整的波型发生器 C51 原代: 该系统的软件比较典型:包括键盘的应用,显示的应用和 DA 转换器的应用。本设计中,输出的波形有三种:正弦波,方波,三角波。 方波的输出最为简单,只要按照设定的周期值将输出的电压改变即可。 三角波的输出也比较简单,单片机的输出只要完成数字量递增和递减交替进行即可。、 正弦波的输出最麻烦,如果在软件中计算出输出的各点电压值,将会浪费很多的 CPU 时间,以至于无法满足频率的要求。通常最简单的方法是通过手动的方法计算出输出各点的电压
[单片机]
51单片机的中断系统
有关单片机中断系统的概念:什么是中断,我们从一个生活中的例程引入。你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。仔细研究一下生活中的中断,对于我们学习单片机的中断也很有好处。 第一、什么可经引起中断,生活中很多事件能引起中断:有人按了门铃了,电话铃响了,你的闹钟闹响了,你烧的水开了….等等诸如此类的事件,我们把能引起中断的称之为中断源,单片机中也有一些能引起中断的事件,8031中一共有5个:两个外部中断,两个计数/定时器中断,一个串行口中断。 第二、中断的嵌套与优先级处理:设想一下,我们正在看书,电话铃
[单片机]
<font color='red'>51单片机</font>的中断系统
51单片机设计方案TOP10(五)
基于51单片机的空气净化机的设计    引言   随着工业和社会的发展,全球空气污染很严重,人类健康正面临着“室内空气污染”的威胁。因此,人们需要专门的空气净化装置一空气净化机。空气净化机发展至今,先后经历了两代产品。第一代产品采用物理方法,即通过过滤、吸附、磁化、负离子等消除烟尘,其缺点在于无法消除由异味、病原菌、微生物等造成的污染。第二代产品利用化学反应产生臭氧负离子来净化空气,但是臭氧有令人难以容忍的刺鼻味道,并且臭氧作为强氧化剂对人体有一定的伤害。国内目前大量使用的空气净化机是以砍伐木材为代价,生产特殊纸张做成过滤器,给生态环境造成很大破坏,也增加了消费成本。若过滤器未能及时更换,空气净化机不仅无法实现空气净化功能
[模拟电子]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved