51单片机:proteus仿真1602LCD的显示

这是我自己用proteus仿真学习了1602的中英文显示后自己的一些感悟和经验总结,欢迎讨论交流。
工程文件下载

1602lcd的介绍

1.引脚定义

主要要注意RS、RW、E的作用

2.CGRAM,CGROM和DDRAM
CGROM:用于储存最常用的一些字符:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),在keil中可用0x41表示。

CGRAM:看起来有16个字节可供使用,但是CGRAM字符码规定0-2位为地址,第3位就为无效,4-7位为零,所以实际上只有0000X0000-0000X111(X为无效位,但表中有1,0)一共八个字节,也就是说如果一个自定义汉字占4个字节的话(一个字节代表DDRAM上的一个字模),CGRAM一次最多只能显示两个自定义汉字.

DDRAM:代表了放置符号的位置,例如要在图上00位置显示一个阿拉伯数字1该怎么做呢,首先确定显示的位置,如果把位置定义为00000000是错误的,因为写入显示地址时,要求最高位D7恒为高电平1,所以第一行第一个字符的位置是00000000B+1000000B=10000000B(0x80),同理,第二行第一列的字符位置为11000000B(0xc0),再把数字1的CGROM码00110001B(0x31)送入DDRAM地址即可

3.字模

一个字模由7x5的点阵组合而成,是1602lcd显示的最小单位,一块1602lcd就是由16x2个字模组合而成。
如图A的显示可用一个字模完成,但是对于复杂的汉字,就可能需要4个字模拼接而成。

4.内部指令介绍

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令 DL:高电平时为8位总线,低电平时为4位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。

指令主要体现在1602lcd初始化的过程中

主要模块介绍

1.自定义函数

void delay(uint n)    //延时函数
{ uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--);
}
void lcd_wcom(uchar com)    //指令写入函数
{ rs=0; //输入指令rw=0; P0=com; delay(5); en=1; en=0;
}
void lcd_wdat(uchar dat)  //数据写入函数
{ rs=1;  //输入数据rw=0; P0=dat; delay(5); en=1; en=0;
}
void lcd_init()    //1602lcd初始化函数
{ lcd_wcom(0x38);  //功能设定指令:1.数据总线8位  2.显示两行  3. 5*8总线字符           lcd_wcom(0x0c);   //控制整体显示并且关闭光标        lcd_wcom(0x06);   //屏幕上的文字左移或者右移无效          lcd_wcom(0x01);  //清显示,光标复位到地址00H位置
}

3.字模定义

uchar  code table2[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x00,  0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00};//月,日
uchar  code table3[]={0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x1f,0x07,0x0a,0x12,0x02,0x02,0x02,0x02,0x1f,0x1c,0x0a,0x09,0x08,0x08,0x08,0x08};//林
uchar  code table4[]={0x0a,0x1f,0x0a,0x0e,0x0a,0x0e,0x1f,0x1f,0x00,0x09,0x05,0x09,0x05,0x01,0x1f,0x1f,0x16,0x16,0x19,0x10,0x1f,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00};//斟
uchar code table5[]={ 0x04,0x16,0x0d,0x04,0x14,0x0f,0x04,0x00,0x11,0x15,0x19,0x11,0x11,0x1d,0x11,0x00,0x04,0x05,0x0e,0x14,0x04,0x04,0x00,0x00,0x11,0x1b,0x15,0x11,0x11,0x11,0x00,0x00};//渊
unsigned char code dis1[] = {"electrical"};
unsigned char code dis2[] = {"engineering"};
unsigned char code dis3[] = {"201736110116"};

2.主函数

void main()
{     char m,i,j,k=0; lcd_init();  //初始化lcd//日期显示while(key1==0&&key2==1&&key3==1&&key4==1) //如果key1按下{lcd_wcom(0x40);             //设定CGRAM地址 for(m=0;m<16;m++)    //将字符“日,月”代码写入CGRAM中 { lcd_wdat(table2[m]);           } lcd_wcom(0x86);//指定显示位置      lcd_wdat(0x33);//3lcd_wcom(0x87); //指定显示位置lcd_wdat(0);   //月lcd_wcom(0x88);//指定显示位置lcd_wdat(0x31);//1lcd_wcom(0x89);//指定显示位置lcd_wdat(0x38);//8lcd_wcom(0x8a);//指定显示位置lcd_wdat(1);   //日if(key1==1&&key2==1&&key3==1&&key4==1) break;}//专业显示  while(key1==1&&key2==0&&key3==1&&key4==1){lcd_wcom(0x80);while(dis1[i] != '\0'){lcd_wdat(dis1[i]);i++;}lcd_wcom(0xc0);while(dis2[j] != '\0'){lcd_wdat(dis2[j]);j++;}if(key1==1&&key2==1&&key3==1&&key4==1) break;}//学号显示while(key1==1&&key2==1&&key3==0&&key4==1)  {lcd_wcom(0x80);while(dis3[k] != '\0'){lcd_wdat(dis3[k]);k++;} if(key1==1&&key2==1&&key3==1&&key4==1) break;        }//姓名显示while(key1==1&&key2==1&&key3==1&&key4==0)   //如果key4按下{while(1){lcd_wcom(0x40);             //设定CGRAM地址 for(m=0;m<32;m++)    { lcd_wdat(table3[m]);           }   //显示“林” lcd_wcom(0x83);lcd_wdat(0);lcd_wcom(0x84);lcd_wdat(1);lcd_wcom(0xc3);lcd_wdat(2);lcd_wcom(0xc4);lcd_wdat(3);delay(500);//在原来显示“林”的位置用空字符代替,下面同理lcd_wcom(0x83);lcd_wdat(0x20);lcd_wcom(0x84);lcd_wdat(0x20);lcd_wcom(0xc3);lcd_wdat(0x20);lcd_wcom(0xc4);lcd_wdat(0x20);lcd_wcom(0x40); for(m=0;m<32;m++)    { lcd_wdat(table4[m]);           }     lcd_wcom(0x86);lcd_wdat(0);lcd_wcom(0x87);lcd_wdat(1);lcd_wcom(0xc6);lcd_wdat(2);lcd_wcom(0xc7);lcd_wdat(3);delay(500);lcd_wcom(0x86);lcd_wdat(0x20);lcd_wcom(0x87);lcd_wdat(0x20);lcd_wcom(0xc6);lcd_wdat(0x20);lcd_wcom(0xc7);lcd_wdat(0x20);lcd_wcom(0x40); for(m=0;m<32;m++)    { lcd_wdat(table5[m]);           }     lcd_wcom(0x89);lcd_wdat(0);lcd_wcom(0x8a);lcd_wdat(1);lcd_wcom(0xc9);lcd_wdat(2);lcd_wcom(0xca);lcd_wdat(3);delay(500);lcd_wcom(0x89);lcd_wdat(0x20);lcd_wcom(0x8a);lcd_wdat(0x20);lcd_wcom(0xc9);lcd_wdat(0x20);lcd_wcom(0xca);lcd_wdat(0x20);if(key1==1&&key2==1&&key3==1&&key4==1) break;   }break;}}

proteus仿真


8条数据线上要有上拉电阻保证电压稳定,按下开关,显示各部分内容

51单片机:proteus仿真1602LCD的显示相关推荐

  1. 51单片机Proteus仿真

    这里分享一些关于51单片机的Proteus仿真.部分仿真来源于网络整理.有需要可以看看. 51单片机Proteus仿真入门实验:https://mp.weixin.qq.com/s/6kgAWSqeY ...

  2. 51单片机Proteus仿真+Keil工程-实验7-单片机AD和DA实验

    实验7-单片机AD和DA实验   之前做的一次实验,51单片机AD和DA实验,数模使用芯片0832,模数转换使用0809.在做实验时曾经遇到一个问题,模数转换0809是不是只能输出0~ 5V,能不能输 ...

  3. 51单片机Proteus仿真+Keil工程-实验6-单片机扩展RAM6264实验

    实验6-单片机扩展RAM6264实验   之前做的一次实验,51单片机扩展RAM6264实验.如有问题欢迎指正. 实验目的:   掌握单片机扩展芯片的方法:掌握RAM6264的写入和读取: 实验内容: ...

  4. 51单片机Proteus仿真+Keil工程-实验2-按键-数码管

    实验2-单片机数码管和按键实验   之前做的一次实验,51单片机通过按键控制单个数码管.如有问题欢迎指正. 实验目标:   通过建立4x4矩阵按键在8段数码管上面显示0~F,十六个按键值. Prote ...

  5. matlab单片机仿真,51单片机proteus仿真实验设计

    描述 这个proteus仿真是一个网友做的,该仿真可以生成方波.正弦波.锯齿波和三角波,并且还可以用按键调整波形. 不过,对初学者来讲,可能有点复杂.对于本科生来说,这个仿真几乎可以作为毕业论文了吧. ...

  6. 51单片机 Proteus仿真 时钟 串口 发送时钟 整点报时

    #include "reg52.h" #include <intrins.h> #include <string.h> #include <stdio ...

  7. 51单片机 Proteus仿真 测烟雾浓度显示 报警器 烟雾报警 PCF8591 MQ-4

    LCD1602+PCF8591模块+烟雾传感器+按键+蜂鸣器 检测烟雾浓度并显示浓度 按键设置报警浓度上限值和报警浓度下限值 在上限和下限之间就不报警,否则就报警

  8. 51单片机 Proteus仿真 8X8点阵英文流水显示 汉字流水显示

  9. 51单片机 Proteus仿真 基于单片机的篮球计分器设计 LCD

    基于单片机的篮球计分器设计 设计LCD显示篮球比分牌 通过加分按钮可以给A队或B队加分 设计对调功能,A队和B队分数互换,意味着中场交换场地 显示比赛倒计时功能 创新内容:如显示第几小节

最新文章

  1. 查看mysql语句运行时间
  2. 高一学生计算机知识现状分析,关于高中信息技术课教学现状的思考
  3. UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
  4. 从源码角度看ContentProvider
  5. 关于SVN更新时文件加锁的小结
  6. Testbench编写方法
  7. C#爬虫项目:SWorld阅读
  8. 爬虫自动定时获取查重结果并将结果发送至指定邮箱
  9. Maven配置错误: The JAVA_HOME environment variable is not defined correctly
  10. 在单核CPU下,有必要存在多线程吗?
  11. js 实现批量下载页面中的图片
  12. 学习笔记之Vue基础学习(一)
  13. Excel高级图表制作④——控件+Offset组合,让图表真正动起来!
  14. 写在2022年尾巴上
  15. matlab let工具箱,【matlab】配置surfbox工具箱(surfacelet转换)
  16. 5-15~5-17 七牛工作总结:足球爬虫
  17. 结构光逆相机法重建详解+代码
  18. 2018最新云下载不限速神器【电脑版+安卓版】
  19. 一道有趣的微软笔试题
  20. 如何导入Mac版ps渐变?Mac版photoshop渐变怎么导入?ps渐变导入方法

热门文章

  1. 酩悦轩尼诗宣布在巴黎戴高乐机场重开精品酒庄
  2. 会议室预约系统遇到的问题
  3. 简单的做一个图片上传预览(web前端)
  4. 微信小程序实现俄罗斯方块
  5. linux下smb打印服务器部署过程(对windows终端)
  6. 手写django框架
  7. 【人工智能】智谱研究报告:揭秘ChatGPT背后的AI“梦之队”
  8. 软件架构设计原则--里氏替换原则
  9. 个人博客-7(网站首页制作)
  10. [Root-me]XSS - Stored 1