完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1. 参考资料:
本文在此LCD1602中文资料的基础上修改完成。 2. 中文资料 2.1. 液晶显示器各种图形的显示原理 2.1.1 基本原理 点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16=1024个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=FFH,……(00EH)=FFH,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。 2.1.2 字符的显示 用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。 2.1.3 汉字的显示 汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字 2.2 1602字符型LCD简介
2.3.1 DDRAM : 显示用RAM直接和屏幕上的点相对应,屏幕上的一个点和DDRAM中的一个位对应,字符屏的DDRAM和图形屏的DDRAM有一点点区别。 2.3.2 CGROM: 字模存储用空间。你要显示某个ASCII字符时,要显示字符的字模就存在这里,对于字符屏,要显示某个字符时,往DDRAM里写字符的索引(一般都是ASCII码)就可以完成显示。比如你写0x38,则显示为数字8。 字符屏的DDRAM一般和IC能显示的最大字符数相同。有的IC可以控制显示80个字符,但屏幕只显示20个字符。对于图形屏,往DDRAM里写什么样的数据,屏幕上就会显示什么样的点,比如你写0x38, 则显示00111000。图形屏的DDRAM一般都会比屏幕显示大个2倍以上,为的是简化翻屏,以及实现其他特殊显示效果 。 CGRAM是用户自建字模区,有时ASCII码表不能满足个人对字符的要求,则需要在这里写入字模。字模的方式和CGROM中的一样。 一般写入到这里的字模,其索引值为(0x00~0x07),建立好字模后,往DDRAM中写索引0x00,新建的字符就会显示出来。 2.4 1602控制指令 1602液晶模块内部的控制器共有11条控制指令 如下表所示: [tr]序号指令RSR/WD7D6D5D4D3D2D1D0[/tr]
与HD44780相兼容,时序表如下: [tr]读状态输入RS=L,R/W=H,E=H输出D0—D7=状态字[/tr]
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在,哪里显示字符,图是1602的内部显示地址。 图:LCD1602内部显示地址 例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。 在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。 LCD1602程序详见:http://www.51hei.com/mcu/2210.html 3. 51单片机驱动LCD1602的电路图+程序 3.1 编程思路:
我的电路图 ![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Fja3RvbWFz,size_16,color_FFFFFF,t_70 =80*120) 以下内容来源于:单片机教程网 上图是仿真效果 显示2行字符. /***************************************** 电路连接 P0------DB0~DB7 P2.6------RS P2.5------RW P2.7------E *****************************************/ 3.2 代码: #include <intrins.h> ***it rs= P2^0; ***it rw = P2^1; ***it ep = P2^2; unsigned char code dis1[] = {"www.hificat.com"}; unsigned char code dis2[] = {"0571-85956028"}; void delay(unsigned char ms) { unsigned char i; while(ms--) { for(i = 0; i< 250; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } bit lcd_bz() { bit result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0 & 0x80); ep = 0; return result; } void lcd_wcmd(unsigned char cmd) { while(lcd_bz());//判断LCD是否忙碌 rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; } void lcd_pos(unsigned char pos) { lcd_wcmd(pos | 0x80); } void lcd_wdat(unsigned char dat) { while(lcd_bz());//判断LCD是否忙碌 rs = 1; rw = 0; ep = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; } void lcd_init() { lcd_wcmd(0x38); delay(1); lcd_wcmd(0x0c); delay(1); lcd_wcmd(0x06); delay(1); lcd_wcmd(0x01); delay(1); } void main(void) { unsigned char i; lcd_init();// 初始化LCD delay(10); lcd_pos(0x01);//设置显示位置 i = 0; while(dis1 != '\0') { lcd_wdat(dis1);//显示字符 i++; } lcd_pos(0x42);// 设置显示位置 i = 0; while(dis2 != '\0') { lcd_wdat(dis2);// 显示字符 i++; } |
|||||||||||
|
|||||||||||
只有小组成员才能发言,加入小组>>
有网友可以分享一款基于51单片机和MCP23017的IO扩展方案吗?谢谢!
1040浏览 4评论嵌入式开发工具Keil 5的安装方法介绍(C51与MDK共存)
3154浏览 4评论小黑屋| 手机版| Archiver| 电子发烧友 ( 粤ICP备14022951号 )
GMT+8, 2022-8-24 15:14 , Processed in 0.538081 second(s), Total 74, Slave 55 queries , Memcache On.
Powered by 电子发烧友网
© 2015 www.ws-dc.com