第7讲自己动手学习单片机系列-LCD1602液晶显示总结.ppt_第1页
第7讲自己动手学习单片机系列-LCD1602液晶显示总结.ppt_第2页
第7讲自己动手学习单片机系列-LCD1602液晶显示总结.ppt_第3页
第7讲自己动手学习单片机系列-LCD1602液晶显示总结.ppt_第4页
第7讲自己动手学习单片机系列-LCD1602液晶显示总结.ppt_第5页
免费预览已结束,剩余26页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7讲I/O口高级应用-时序读写-以JHD162A液晶为例,主讲:王泽华电话岛科技大学,本章重点,时序时序编程要点,材料清单,最小系统板。+5V电源。JHD162A液晶1个;10K可调电阻1个。圆孔插座若干(2.54mm);单列直插(2.54mm)排针若干。排线若干;焊锡丝,助焊剂若干。,LCD1602介绍,LCD1602是指162,表示显示2行,每行16个字符。是点阵型LCD,控制芯片为HD44780。可显示ASCII码字符表中的任意字符,是目前除了数码管以外,使用最广泛显示设备。优点是很少的外围设备,使用方便,价格便宜(15元左右),编程简单;其缺点是显示的字符较小,占用多个I/O口(11个)。,JHD162A液晶针脚排列及外围电路,针脚排列和焊接外围电路如下图所示;从左到右为1-16;针脚功能如左表所示。,实际焊接正面图,实际焊接反面图,1602显示原理,HD44780内置了DDRAM(显示数据存储RAM);CGROM(字符存储ROM);CGRAM(用户自定义RAM),显示效果不好,一般不用。1、DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,1602只用32个字节,其地址和屏幕(屏幕2行,每行16字节)的对应关系如下表:,2、CGROM:共存储了160个点阵字符图形,每一字符存储到一个8bit地址中,比如字母“A”的代码是0B0100,0001=0 x41,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。表中的字符代码与我们PC中的字符代码是一致的。因此我们在向DDRAM字符代码程序时甚至可以直接用PORTXA这样的方法。PC在编译时就把“A”先转为41H代码了。,HD44780指令集,1、清屏-(写命令),功能:清除液晶显示器,即将DDRAM的内容全部填入“空白”的字符码20H;光标归位,即将光标撤回液晶显示屏的左上方;将地址计数器(AC)的值设为0。,2、光标归位-(写命令),功能:把光标撤回到显示器的左上方;把地址计数器(AC)的值设置为0;保持DDRAM的内容不变,3、输入模式设置-(写命令),4、显示开关控制-(写命令),功能:设定每次写入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:位名设置I/D0=写入新数据后光标左移1=写入新数据后光标右移S0=写入新数据后显示屏不移动1=写入新数据后显示屏整体右移1个字,功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:位名设置D0=显示功能关1=显示功能开C0=无光标1=有光标B0=光标不闪烁1=光标闪烁,5、设定显示屏或光标移动方向-(写命令),功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:S/CR/L设定情况00光标左移1格,且AC值减101光标右移1格,且AC值加110显示器上字符全部左移一格,但光标不动11显示器上字符全部右移一格,但光标不动,6.功能设定-(写命令),功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:位名设置DL0=数据总线为4位1=数据总线为8位N0=显示1行1=显示2行F0=57点阵/每字符1=510点阵/每字符,7、设定CGRAM地址-(写命令),功能:设定下一个要存入数据的CGRAM的地址。,8.设定DDRAM地址指令-(写命令),功能:设定下一个要存入数据的DDRAM的地址。DDRAM地址对应屏幕上标出的地址,第一行是0 x00-0 xFF,第二行是0 x40-0 x4F(注意这里我们送地址的时候应该是0 x80+Address),9.读取忙信号或AC地址-(读状态),功能:读取忙碌信号FB的内容,FB=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;当FB=0时,液晶显示器可以接收单片机送来的数据或指令;读取地址计数器(AC)的内容。,10.数据写入DDRAM或CGRAM指令-(写数据),功能:将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符;将用户自己设计的图形存入CGRAM。,11.从CGRAM或DDRAM读出数据-(读数据),功能:读取DDRAM或CGRAM中的内容。,HD44780指令集总结和时序图,共11条指令(时序图是jhd162A给出的时序)读指令读状态输入:RS=0,R/W=1,E=1输出:DB7-DB0,输出状态读数据输入:RS=1,R/W=1,E=1输出:DB0DB7=数据写指令写命令输入:RS=0,R/W=0,E=下降沿脉冲,DB0DB7=指令码输出:无写数据输入:RS=1,R/W=0,E=下降沿脉冲,DB0DB7=数据输出:无,读时序,读命令实际中使用的仅仅是读LCD是否忙(参见指令9),读数据几乎不用。/*/LCD控制端口定义#defineLCD_CTRL_PORTPORTC#defineLCD_CTRL_DDRDDRC/LCD控制端口/LCD数据端口定义#defineLCD_PORTPORTB/发送LCD数据端口#defineLCD_PINPINB/读取LCD数据端口#defineLCD_DDRDDRB/LCD数据端口方向/*好处是改变MCU的控制口和数据口只需要修改以上代码,不需要修改以下函数*/*/LCD忙等待voidLCD_BUSY_WAIT()LCD_CTRL_DDR|=0 x07;/设定控制端为cpu出LCD_PORT=0 xFF;LCD_DDR=0 x00;/上拉输入RS_0();RW_1();EN_1();_NOP();_NOP();_NOP();/延时360ns等待数据建立。while(LCD_PIN,写时序,写操作有写命令和写数据两种,通过RS电平来区分,0写指令,1写数据/写LCD命令寄存器voidWrite_LCD_Comm(unsignedcharcmd)LCD_BUSY_WAIT();LCD_CTRL_DDR|=0 x07;/设定控制端为cpu出LCD_DDR=0 xFF;/lcd数据引脚输入RS_0();RW_0();EN_1();LCD_PORT=cmd;_NOP();_NOP():EN_0();/写LCD数据寄存器voidWrite_LCD_Data(unsignedchardat)LCD_BUSY_WAIT();LCD_CTRL_DDR|=0 x07;/设定控制端为cpu出LCD_DDR=0 xFF;/lcd数据引脚输入RS_1();RW_0();EN_1();LCD_PORT=dat;_NOP();_NOP():EN_0();,液晶显示程序,/PB0-PB7接DB0-DB7;PC0(RS),PC1(RW),PC2(E)#defineF_CPU8000000UL#include#include#include#define_NOP()_asm_volatile_(nop:)/*/LCD定义/*/LCD1602写指令;#defineclear_scr0 x01/清屏#definecursor_return0 x02/光标回左上角#definedata_cur_right0 x06/数据写入光标右移,AC+1#definedisp_on0 x0C/显示开#definedisp_off0 x08/显示关#definecursor_right0 x14/整体显示,光标右移,AC+1#definedisp_line0 x38/两行显示,5*7点阵,/LCD控制端口定义#defineLCD_CTRL_PORTPORTC#defineLCD_CTRL_DDRDDRC/LCD控制端口/LCD数据端口定义#defineLCD_PORTPORTB/发送LCD数据端口#defineLCD_PINPINB/读取LCD数据端口#defineLCD_DDRDDRB/LCD数据端口方向/LCD控制功能定义PC0(RS),PC1(RW),PC2(E)#defineRS_0()LCD_CTRL_PORT/设定控制端为cpu出LCD_PORT=0 xFF;LCD_DDR=0 x00;/上拉输入RS_0();RW_1();EN_1();_NOP();_NOP();_NOP();/针脚赋予一定电平后,加空延时再读针脚电平while(LCD_PIN,/写LCD数据寄存器voidWrite_LCD_Data(unsignedchardat)LCD_BUSY_WAIT();LCD_CTRL_DDR|=0 x07;/设定控制端为cpu出LCD_DDR=0 xFF;RS_1();RW_0();EN_1();LCD_PORT=dat;_NOP();_NOP();EN_0();/LCD初始化voidInit_LCD()Write_LCD_Comm(disp_line);Write_LCD_Comm(clear_scr);Write_LCD_Comm(data_cur_right);Write_LCD_Comm(disp_on);,/显示字符串,cDDRAM取值为0 x00-0 x0F,0 x40-0 x4FvoidLCD_ShowStr(char*str,unsignedcharcDDRAM)unsignedinti;cDDRAM+=0 x80;for(i=0;stri!=0;i+)if(cDDRAM0 x8F,液晶显示程序运行演示,思考题,编写数位分解程序,将结果显示在液晶上。提示:若给出的数值为-,则前面显示-;若给出的数值为小数,要能显示小数点。若给出的数字1,显示的第一位应该是0后面跟小数点。,附录:数位分解源程序。能正确的显示正负数,小数点。#include#include#include/x要分解的数;ipoint保留几位小数点;cDisp_Buff显示缓冲区;iLen_Buff显示缓冲区长度voidDivision_Unit(intx,intiPoint,char*cDisp_Buff,intiLen_Buff)inti=0;/abs(x)+0中的字符数intj;/计数器intk;/小数点位置charsiLen_Buff;/abs(x)分解后字符串chardisp_buffiLen_Buff;/abs(x)添加小数点后的字符串/清空显示缓冲区for(j=0;jiLen_Buff-1;j+)cDisp_Buffi=0;itoa(abs(x),s,10);/10进制分解字符串/计算位数while(si!=0)i+;k=i-iPoint;,if(k1)/若x=36,保留3位小数,则应显示0.036,其前应添加0.0三个字符for(j=0;j=abs(k)+1;j+)if(j=1)disp_buffj=.;elsedisp_buffj=0;disp_buffj=0;strcat(disp_buff,s);elseif(k=i)/保留0位小数,直接显示sjfor(j=0;j=k;j+)disp_buffj=sj;,else/若x=36,保留1为小数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论