您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 总结资料_1602显示方法
1602显示方法先写指令构成LCD初始化。(RS端为低电平,RW端为低电平,为选择指令寄存器)1.第一个指令功能设定指令2.第二个指令显示开关控制指令3.第三个指令进入模式设置指令4.第四个指令清屏指令这些指令就构成了LCD的初始化。5.写数据(RS端为高电平,RW端为低电平,为选择数据寄存器)6.使能端E,通过使能端的电平变化把指令送入(忙检测用延时来代替)7.注意点:(在写字符显示位置时,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)00000001B(00H)+10000000B(80H))一.最简单的显示方法:最直接把要显示的内容写在数组里,程序开始lcd初始化,写字符显示位置指令,然后根据显示的字符所占的位数,写个for循环语句,放入数据函数,这样就可以在指定位置开始显示要显示的内容。程序如下:#includereg52.h/*程序中没有用到忙检测,而是用的是延时函数来替代忙检测*/#defineucharunsignedchar#defineuintunsignedintucharcodetable[]=LCD1602A;//要显示的内容1放入tableucharcodetable1[]=zhengzhibin;//要显示的内容放入table1sbitrs=P0^7;//数据、指令选择控制线sbitrw=P0^6;//读写信号控制线sbiten=P0^5;//使能信号端voiddelay(uinta)//延时函数{ucharb;while(a--){for(b=5000;b0;b--);}}voidlcd_wcom(ucharcom)//写指令函数{rs=0;//选择指令寄存器rw=0;//选择写操作P2=com;//把指令送入P2口delay(100);//延时一小会,让1602准备接受数据en=1;//使用端电平变化,把指令送入1602delay(100);en=0;}voidlcd_wdat(uchardat)//写数据函数{rs=1;//选择数据寄存器rw=0;//选择写操作P2=dat;//把要显示的数据送入P2口delay(100);//延时一小会,让1602准备接受数据en=1;//使用端电平变化,把数据送入1602delay(100);en=0;}voidlcd_init()//1602初始化{lcd_wcom(0x38);//选择8位数据总线,双列显示,5*7字形lcd_wcom(0x0c);//开启显示屏,关光标,光标不闪烁lcd_wcom(0x06);//显示地址递增,即写一个数据后,显示位置右移一位lcd_wcom(0x01);//清屏}voidmain()//主函数{ucharn,m;lcd_init();//初始化lcd_wcom(0x80+0x04);//显示地址设为84H,上排第4位for(n=0;n9;n++)//将table[]中的数据依次写入1602显示{lcd_wdat(table[n]);delay(100);}lcd_wcom(0x80+0x42);//重新设定显示地址为0xc4,即下排第3位for(m=0;m12;m++)//将table1[]中的数据依次写入1602显示{lcd_wdat(table1[m]);delay(100);}while(1);}二.滚动的显示方法:之前设定步骤一样,只是在某些指令做更改,如果要使字符向右或向左滚动的话,在初始化中的第三指令(进入模式设置指令)要根据实际情况做更改调整。然后在完整的程序后添加一个指令函数,就是添加(设定显示屏或光标移动方向指令)使产生滚动效果。添加指令为:设定显示屏或光标移动方向指令1.如果要显现显示屏整体右移就是滚动效果,如果没把初始化函数中的第三条(进入模式设置指令)指令做更改调整,显示效果会变成开始没滚动效果,等所有字符都显示出来后,才整体的向右移,产生滚动效果。就是把第三指令改为(写入新数据后显示屏整体右移1个字)。然后在完整的程序中主函数中最后面添加一个(设定显示屏或光标移动方向指令)指令,就可以显示向右滚动的效果了。2.如果要显示向左滚动的效果,在之前初始化函数中的第三条(进入模式设置指令)指令中选择(写入新数据后显示屏不移动)指令,然后在完整的程序中主函数中最后面添加一个(设定显示屏或光标移动方向指令)指令,就可以显示向右滚动的效果了。向右滚动程序:#includereg52.h/*程序中没有用到忙检测,而是用的是延时函数来替代忙检测*/#defineucharunsignedchar#defineuintunsignedintucharcodetable[]=LCD1602A;//要显示的内容1放入tableucharcodetable1[]=zhengzhibin;//要显示的内容放入table1sbitrs=P0^7;//数据、指令选择控制线sbitrw=P0^6;//读写信号控制线sbiten=P0^5;//使能信号端voiddelay(uinta)//延时函数{ucharb,c;while(a--){for(b=5000;b0;b--)for(c=5000;c0;c--);}}voidlcd_wcom(ucharcom)//写指令函数{rs=0;//选择指令寄存器rw=0;//选择写操作P2=com;//把指令送入P2口delay(1);//延时一小会,让1602准备接受数据en=1;//使用端电平变化,把指令送入1602delay(1);en=0;}voidlcd_wdat(uchardat)//写数据函数{rs=1;//选择数据寄存器rw=0;//选择写操作P2=dat;//把要显示的数据送入P2口delay(1);//延时一小会,让1602准备接受数据en=1;//使用端电平变化,把数据送入1602delay(1);en=0;}voidlcd_init()//1602初始化{lcd_wcom(0x38);//选择8位数据总线,双列显示,5*7字形lcd_wcom(0x0c);//开启显示屏,关光标,光标不闪烁lcd_wcom(0x07);//光标右移,显示屏整体右移lcd_wcom(0x01);//清屏}voidmain()//主函数{ucharn,m,d;while(1){lcd_init();//初始化lcd_wcom(0x80);//显示地址设为84H,上排第4位for(n=0;n9;n++)//将table[]中的数据依次写入1602显示{lcd_wdat(table[n]);delay(1);}lcd_wcom(0x80+0x40);//重新设定显示地址为0xc4,即下排第3位for(m=0;m12;m++)//将table1[]中的数据依次写入1602显示{lcd_wdat(table1[m]);delay(1);}for(d=0;d37;d++)(添加滚动的指令){lcd_wcom(0x1c);//显示器上字符全部右移一格,但光标不动delay(50);}}}向左滚动的程序:#includereg52.h/*程序中没有用到忙检测,而是用的是延时函数来替代忙检测*/#defineucharunsignedchar#defineuintunsignedintucharcodetable[]=LCD1602A;//要显示的内容1放入tableucharcodetable1[]=zhengzhibin;//要显示的内容放入table1sbitrs=P0^7;//数据、指令选择控制线sbitrw=P0^6;//读写信号控制线sbiten=P0^5;//使能信号端voiddelay(uinta)//延时函数{ucharb,c;while(a--){for(b=5000;b0;b--)for(c=5000;c0;c--);}}voidlcd_wcom(ucharcom)//写指令函数{rs=0;//选择指令寄存器rw=0;//选择写操作P2=com;//把指令送入P2口delay(1);//延时一小会,让1602准备接受数据en=1;//使用端电平变化,把指令送入1602delay(1);en=0;}voidlcd_wdat(uchardat)//写数据函数{rs=1;//选择数据寄存器rw=0;//选择写操作P2=dat;//把要显示的数据送入P2口delay(1);//延时一小会,让1602准备接受数据en=1;//使用端电平变化,把数据送入1602delay(1);en=0;}voidlcd_init()//1602初始化{lcd_wcom(0x38);//选择8位数据总线,双列显示,5*7字形lcd_wcom(0x0c);//开启显示屏,关光标,光标不闪烁lcd_wcom(0x04);//光标左移,显示屏不移动lcd_wcom(0x01);//清屏}voidmain()//主函数{ucharn,m,d;while(1){lcd_init();//初始化lcd_wcom(0x80+0x0f);//显示地址设为84H,上排第4位for(n=0;n9;n++)//将table[]中的数据依次写入1602显示{lcd_wdat(table[n]);delay(1);}lcd_wcom(0x80+0x4f);//重新设定显示地址为0xc4,即下排第3位for(m=0;m12;m++)//将table1[]中的数据依次写入1602显示{lcd_wdat(table1[m]);delay(1);}for(d=0;d37;d++)(添加滚动的指令){lcd_wcom(0x18);//显示器上字符全部左移一格,但光标不动delay(50);}}}三.任意字符显示:1602中内部有个存储器CGROM;CGRAM中有一个可以供用户自义定的CGRAM,我们从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位无效,4-7全为零。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000X111,X为无效位,最后三位为000-111共8个。就可以显示这8个用户自定义的字符了。可以显示任意字符图案。(其实1602每个显示格是由5*7或5*10的点阵显示的,所以可以自己定义什么图案或者字符,然后依次写出显示图案或字符的代码,就可以显示了)。具体方法就是在程序主函数中初始化LCD后写个写个设定CGRAM的地址的指令,然后利用(CGRAM或DDRAM读出数据的指令)指令在将代码写入CGRAM中,在设定显示位置,然后显示,就可以了。指令:显示任意字符程序:(在0x4f的地方显示字母C)从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。例如第一个自定义字符的字模地址为01000000-01000111八个地址。我们向这8个字节写入字模数据,让它能显示出“℃”#includereg52.h/*程序中没有用到忙检测,而是用的是延时函数来替代忙检测*/#defineucharunsignedchar#defineuintunsignedintucharcodetable[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00//字符C字};sbitrs=P0^7;//数据、指令选择控制线sbitrw=P0^6;//读写信号控制线sbiten=P0^5;//使能信号端voiddelay(uinta)//延时函数{ucharb,c;while(a--){for(b=500;b0;b--)for(c=500;c0;c--);}}voidlcd_w
本文标题:总结资料_1602显示方法
链接地址:https://www.777doc.com/doc-2396485 .html