从硬件到驱动程序完全掌握使用LED

上传人:js****6 文档编号:71719175 上传时间:2022-04-07 格式:DOC 页数:13 大小:1.13MB
返回 下载 相关 举报
从硬件到驱动程序完全掌握使用LED_第1页
第1页 / 共13页
从硬件到驱动程序完全掌握使用LED_第2页
第2页 / 共13页
从硬件到驱动程序完全掌握使用LED_第3页
第3页 / 共13页
点击查看更多>>
资源描述
.LCD1206实用概述 -by bangou 2013-7-14一、1602硬件架构主要特性如下: 8 位并行数据接口,适配 M6800 系列时序:可选 4 位并行数据方式 具有字符发生器 ROM,含 10880 位 192 种 58 点字体字符 64 种 510 点字体字符 具有字符发生器 RAM,含 512 位 8 种 58 点字体字符 4 种 510 点字体字符 低功耗,高可靠性对于单片机的学习而言,掌握1602的用法是每一个学习者必然要经历的过程。 所谓1602是指显示的容为16*2,即可以显示两行,每行16个字符。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全一样的,因此基于HD44780写的控制程序可以很方便地应用于市面上大局部的字符型液晶。 字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示: 二、概述1602DDRAM、CGROM和CGRAM及其指令集HD44780置了DDRAM、CGROM和CGRAM。一、 CGROM1602是一款最常用也是最廉价的液晶显示屏。最多可以显示两行标准字符,每行最多可以显示16个字符。1602可以显示部常用字符(包括阿拉伯数字,英文字母大小写,常用符号和日文假名等),也可以显示自定义字符(单或多个字符组成的简单汉字,符号,图案等,最多可以产生8个自定义字符)。1602液晶模块部的字符发生存储器CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比方大写的英文字母A的代码是01000001B41H,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母A . 上表中的字符代码与我们PC中的字符代码是根本一致的。因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1A这样的方法。PC在编译时就把A先转为41H代码了。 字符代码0*000*0F为用户自定义的字符图形RAM(对于5*8点阵的字符,可以存放8组,5*10点阵的字符,存放4组),就是CGRAM了。 0*200*7F为标准的ASCII码,0*A00*FF为日文字符和希腊文字符,其余字符码(0*100*1F及0*800*9F)没有定义。二、DDRAM (Display Data RAM) DDRAM就是显示数据RAM,用来存放待显示的字符代码。LCD控制器的指令系统规定,在送待显示字符代码的指令之前,先要送DDRAM的地址(即待显示的字符显示位置)。162的字符型LCD的DDRAM地址与显示位置的对应关系如下:共80个字节,其地址和屏幕的对应关系如下表:DDRAM地址与显示位置的对应关系设定DDRAM地址指令 0*80+*(00H-2FH,40H-67H) *0,63 27=128功能:设定下一个要存入数据的CGRAM的地址。 DDRAM地址与显示位置的对应关系 0*80 0*81 0*82 0*83 0*84 0*85 0*86 0*87 0*88 0*89 0*8A 0*8B 0*8C 0*8D 0*8E 0*8F0*C0 0*C1 0*C2 0*C3 0*C4 0*C5 0*C6 0*C7 0*C8 0*C9 0*CA 0*CB 0*CC 0*CD 0*CE 0*CF第一行的显示地址是0*800*8F,第二行的显示地址是0*C00*CF。0*C0=0*90+0*40=0*c0H(注意这里我们送地址的时候应该是0*80+Address,这也是前面说到写地址命令的时候要加上0*80的原因) 也就是说想要在LCD1602屏幕的第一行第一列显示一个A字,就要向DDRAM的00H地址写入A字的代码就行了。则一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下: 事实上我们往DDRAM里的00H地址处送一个数据,譬如0*31(数字1的代码)并不能显示1出来。这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM的00H地址处显示数据,则必须将00H加上80H,即80H,假设要在DDRAM的01H处显示数据,则必须将01H加上80H即81H。依次类推。三、CGRAM功能:设定下一个要存入数据的CGRAM的地址。设定CGRAM地址指令 0*40+* A5-A0=(0,3FH) *0,63 26=64将生成的点阵数组保存到CGRAM存储器中,生成自定义字符。1602部CGRAM用于自定义的字符点阵的存储,总共64字节。由点阵提取可知,每一个字符由8个字节数据组成。所以64字节CGRAM存储器,能够存储8组自定义字符的点阵数组。按照CGRAM地址划分为 07为第一组,815为第二组,依次类推5663为第8组数据 1、首先取得想要的中文或者图形的字模数组。通过字模软件不能直接提取5*8点阵的字模数据,可以通过手动提取的方法。如下列图所示,对应一个字符显示区域。每8个字节,组成一个点阵数组。日的点阵数组即为 0*1f,0*11,0*11,0*1f,0*11,0*11,0*1f,0*002个点阵组成一个汉字取模举例:车字取模数组为:0*00,0*0f,0*02,0*04,0*07,0*00,0*0f,0*00, 0*10,0*1e,0*00,0*10,0*1c,0*10,0*1e,0*10 将生成的点阵数组保存到CGRAM存储器中,生成自定义字符。1602部CGRAM用于自定义的字符点阵的存储,总共64字节。由上一步点阵提取可知,每一个字符由8个字节数据组成。所以64字节CGRAM存储器,能够存储8组自定义字符的点阵数组。按照CGRAM地址划分为 07为第一组,815为第二组,依次类推5663为第8组数据。把自定义字符的数组按8个字节一组存储到CGRAM中,程序代码参考如下。/功能:将自定义字符的编码数组写入到CGRAM中./输入:自定义字符的编码数组void Write_CGRAM(unsigned char *p)unsigned char i,j,kk,p=0*1f,0*11,0*11,0*1f,0*11,0*11,0*1f,0*00;unsigned char tmp=0*40; /操作CGRAM的命令码kk=0;for(j=0;j8;j+) /64 字节存储空间,可以生成 8 个自定义字符点阵 for(i=0;i8;i+) / 8 个字节生成 1 个字符点阵 Write_(tmp+i); /操作CGRAM的命令码+写入CGRAM地址. Write_dat(pkk); /写入数据 kk+; tmp += 8; 上一步中,自定义字符存储到CGRAM的任意一组以后,每一个组8个字节也有一个显示编码。按顺序依次为00H07H 。显示时,只要调用每一组的编码,即可以显示相应的字符。注:部常用字符显示时,显示编码是从0*20开场的。0*000*0f是专门留给自定义字符显示的。0*000*07和0*080*0f容是一样的。例如:调用0*01 位置和0*09位置,显示的容是一样的。直接按照单个字符的显示方式调用显示函数,就可以显示自定义字符了。代码参考如下: /在第1行,第7个位置显示自定义汉字 年 DisplayOneChar(6,00); /显示 年 /CGRAM 码 00说明:此时年的8个字节点阵数组,存储空间为CGRAM的 0007地址也就是CGRAM的第1组数据存储区域,编码为0。如果存储在CGRAM的0815地址,则编码就应该是 1了。很多资料中,都没有详细介绍过CGRAM和CGROM的区别和用法,在1602调试过程中经常会被搞混。四、1602指令集 则如何对DDRAM的容和地址进展具体操作呢,下面先说说HD44780的指令集及其设置说明,请浏览该指令集,并找出对DDRAM的容和地址进展操作的指令。共11条指令:1.清屏指令 0*01功能: 去除液晶显示器,即将DDRAM的容全部填入空白的ASCII码20H; 光标归位,即将光标撤回液晶显示屏的左上方; 将地址计数器(AC)的值设为0。 2.光标归位指令 0*02功能: 把光标撤回到显示器的左上方; 把地址计数器(AC)的值设置为0; 保持DDRAM的容不变 3. 输入方式设置Enter Mode Set,代码 04H07H=进入模式设置指令 该指令的功能在于设置显示字符的输入方式,即在 CPU 读/写 DDRAM 或 CGRAM 后,地址指针计数器 AC 的修改方式,反响在显示效果上,当写入一个字符后画面或光标的移动。该指令的两个参数 I/D 和 S 确定四种字符的输入方式,如下表所示:注意:画面滚动方式在 CPU 读 DDRAM 数据时,或在读/写 CGRAM 时无效,也就是说该指令主要应用在 CPU 写入 DDRAM 数据的操作时。功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示: 位名 设置 I/D 0=写入新数据后光标左移= AC自动-1 1=写入新数据后光标右移=AC自动+1 S 0=写入新数据后显示屏不移动=画面不动 1=写入新数据后显示屏整体右移1个字 =画面平移4. 显示开关设置Display on/off Control,代码 08H0FH5.显光标或画面滚动设置Cursor or Display Shift,代码 10H、14H、18H、1CH光标、画面移位执行该指令将产生画面或光标向左或右滚动一个字符位。如果定时间隔地执行该指令将关闭画面或光标的平滑滚动。画面滚动是在一行循环进展的,也就是说一行的第一个单元和最后一个人连接起来,形成闭环式滚动。画面滚动的显示效果如下所示:.当未开光标显示时,执行画面滚动指令时不修改地址指针计数器 AC 的值,当有光标显示时,由于执行任意一条滚动指令时都将使光标产生移位,所以地址指针计数器 AC 都需要被修改。如果用光标的指针-地址指针计数器 AC 加一和减一功能来解释,就能理解光标从第一显示位左移至第 80 显示位。或从第 80 显示位右移至第 1 显示位的原理。该指令与输入方式设置指令都可以产生光标或者画面的滚动,区别在于该指令专用于滚动功能,执行一次,显示呈现一次滚动效果。而输入方式设置指令仅是完成了一种字符输入方式的设置,仅在 CPU 对 DDRAM 等进展操作时才能产生滚动的效果。6.功能设定指令 0*30 DL=1,8bit,显示1行,57点阵/每字符0*31 DL=1,8bit,显示1行,510点阵/每字符0*32 DL=1,8bit,显示2行,57点阵/每字符*33 DL=1,8bit,显示1行,510点阵/每字符功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下: 位名 设置 DL 0=数据总线为4位 1=数据总线为8位 N 0=显示1行 1=显示2行 F 0=57点阵/每字符 1=510点阵/每字符 该指令设置了控制器的工作方式,是唯一的软件复位指令。SPLC780 虽然具有复位电路,但为了可靠的工作,SPLC780 要求 CPU 在操作时首先进展软件复位。也就是说控制字符型液晶显示模块工作时首先要进展软件复位。7. CGRAM 地址设置40H7FH设定CGRAM地址指令 0*40+ A5-A0=(0,3FH) *0,63功能:设定下一个要存入数据的CGRAM的地址。 该指令将 6 位的 CGRAM 地址写入地址指针计数器 AC ,随后计算机对数据的操作是对 CGRAM 的读/写。8. DDRAM 地址设置80HFFH 0*80+*(00H-2FH,40H-67H) *0,63功能:设定下一个要存入数据的CGRAM的地址。 (注意这里我们送地址的时候应该是0*80+Address,这也是前面说到写地址命令的时候要加上0*80的原因) 该指令将 7 位的 DDRAM 地址写入地址指针计数器 AC ,随后计算机对数据的操作是对DDRAM 的读/写。9.读取忙信号或AC地址指令 功能: 读取忙碌信号BF的容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令; 当BF=0时,液晶显示器可以接收单片机送来的数据或指令; 读取地址计数器(AC)的容。 计算机对指令存放器通道读操作即 RS 为 0R/W 为 1 时,将读出此格式的忙标志BF 值和 7 位地址指针计数器 AC 的值。10.数据写入DDRAM或CGRAM指令一览 功能: 将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符; 将使用者自己设计的图形存入CGRAM。 11.从CGRAM或DDRAM读出数据的指令一览 功能:读取DDRAM或CGRAM中的容。 根本操作时序: 读状态 输入:RS=L,RW=H,E=H 输出:DB0DB7=状态字 写指令 输入:RS=L,RW=L,E=下降沿脉冲,DB0DB7=指令码 输出:无 读数据 输入:RS=H,RW=H,E=H 输出:DB0DB7=数据 写数据 输入:RS=H,RW=L,E=下降沿脉冲,DB0DB7=数据 输出:无四、1602驱动程序void lcd_w(uchar ) /1602写命令函数 rs=0;rw=0; P2=;/ delay(5);/ en=1;/ en=0; void lcd_wdat(uchar dat) /1602写数据函数 rs=1;/ rw=0;/ P2=dat;/ delay(5);/ en=1;/ en=0; void_rdat(uchar data)2读数据函数 rs=1;/ rw=1;/ P2=dat;/ delay(5);/ en=1;/ en=0; 下面我们来驱动1602吧在1602的上排显示LCD1602 check ok下排显示study up程序中没有用到忙检测,而是用的是延时函数来替代忙检测 #include /包含头文件,这个嘛,就不用多说了 #define uint unsigned int /预定义一下 #define uchar unsigned char sbit rs=P35; /1602的数据/指令选择控制线 sbit rw=P36; /1602的读写控制线 sbit en=P37; /1602的使能控制线 /*P2口接1602的D0D7,注意不要接错了顺序,我以前可在这上面吃过亏*/ uchar code table=LCD1602 check ok; /要显示的容1放入数组tablel uchar code table1=study up; /要显示的容2放入数组table1 void delay(uint n) /延时函数 uint *,y; for(*=n;*0;*-) for(y=110;y0;y-); void lcd_w(uchar ) /1602写命令函数 rs=0; /选择指令存放器 rw=0; /选择写 P2=; /把命令字送入P2 delay(5); /延时一小会儿,让1602准备接收数据 en=1; /使能线电平变化,命令送入1602的8位数据口 en=0; void lcd_wdat(uchar dat) /1602写数据函数 rs=1; /选择数据存放器 rw=0; /选择写 P2=dat; /把要显示的数据送入P2 delay(5); /延时一小会儿,让1602准备接收数据 en=1; /使能线电平变化,数据送入1602的8位数据口 en=0; void lcd_init() /1602初始化函数 lcd_w(0*38); /8位数据,双列,5*7字形 lcd_w(0*0c); /开启显示屏,关光标,光标不闪烁 lcd_w(0*06); /显示地址递增,即写一个数据后,显示位置右移一位 lcd_w(0*01); /清屏 void main() /主函数 uchar n,m=0; lcd_init(); /液晶初始化 lcd_w(0*80); /显示地址设为80H即00H,上排第一位 for(m=0;m16;m+) /将table中的数据依次写入1602显示 lcd_wdat(tablem); delay(200); lcd_w(0*80+0*44); /重新设定显示地址为0*c4,即下排第5位 for(n=0;n8;n+) /将table1中的数据依次写入1602显示 lcd_wdat(table1n); delay(200); while(1); /动态停机 程序写好后烧写进单片机,现在让我们看看效果吧 这就是显示的效果,你做成功了吗? 五、熟练自定义字符CGRAM 下面让我们来看看如何显示一个自定义的字符吧 我们从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。它的字符码是0000000000000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定02位为地址,3位无效,47全为零。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000*111,*为无效位,最后三位为000111共8个。 如果我们要想显示这8个用户自定义的字符,操作方法和显示CGROM的一样,先设置DDRAM位置,再向DDRAM写入字符码,例如A就是41H。现在我们要显示CGRAM的第一个自定义字符,就向DDRAM写入00000000B(00H),如果要显示第8个就写入00000111(08H),简单吧! 好!现在我们来看怎么向这八个自定义字符写入字模。有个设置CGRAM地址的指令大家还记得吗?赶快再找出来看看。 从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。例如第一个自定义字符的字模地址为0100000001000111八个地址。我们向这8个字节写入字模数据,让它能显示出 地址:01000000数据:00010000 图示: 0100000100000110 0100001000001001 0100001100001000 0100010000001000 0100010100001001 0100011000000110 0100011100000000 下面我们写一段程序让这8个自定义字符显示出一个心的图案: 由于上面那个显示程序已经有很详细的注释了,因此这个程序只对与上个程序不同的地方写注释 #include #define uint unsigned int #define uchar unsigned char sbit rs=P35; sbit rw=P36; sbit en=P37; uchar code table=0*03,0*07,0*0f,0*1f,0*1f,0*1f,0*1f,0*1f, 0*18,0*1E,0*1f,0*1f,0*1f,0*1f,0*1f,0*1f, 0*07,0*1f,0*1f,0*1f,0*1f,0*1f,0*1f,0*1f, 0*10,0*18,0*1c,0*1E,0*1E,0*1E,0*1E,0*1E, 0*0f,0*07,0*03,0*01,0*00,0*00,0*00,0*00, 0*1f,0*1f,0*1f,0*1f,0*1f,0*0f,0*07,0*01, 0*1f,0*1f,0*1f,0*1f,0*1f,0*1c,0*18,0*00, 0*1c,0*18,0*10,0*00,0*00,0*00,0*00,0*00;/心图案 /*uchar code table1=0*10,0*06,0*09,0*08,0*08,0*09,0*06,0*00;/字符 */ void delay(uint n) uint *,y; for(*=n;*0;*-) for(y=110;y0;y-); void lcd_w(uchar ) rs=0; rw=0; P2=; delay(5); en=1; en=0; void lcd_wdat(uchar dat) rs=1; rw=0; P2=dat; delay(5); en=1; en=0; void lcd_init() lcd_w(0*38); lcd_w(0*0c); lcd_w(0*06); lcd_w(0*01); void main() char m=0; lcd_init(); lcd_w(0*40); /设定CGRAM地址 for(m=0;m64;m+) /将心型代码写入CGRAM中 lcd_wdat(tablem); lcd_w(0*85); /设定上排的显示位置 for(m=0;m4;m+) /显示心型图案的上半局部 lcd_wdat(m); lcd_w(0*c5); /将显示坐标转移到下排和上排相对应的地方 for(m=4;m
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!