码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)


     前言

    趁机把LCD 1602的实验完成了,那个电路图有几个地方没弄懂,但是去掉也没有报错,就没管了。

    LCD1602_百度百科 (baidu.com)icon-default.png?t=N7T8https://baike.baidu.com/item/LCD1602/6014393?fr=ge_ala

    LCD1602液晶显示屏通过电压来改变填充在两块平行板之间的液晶材料内部分子的排列状况,以达到遮光和透光的目的来显示深浅不一,错落有致的图像。而且只要在两块平板间再加上三元色的滤光层,就可实现显示。

    液晶是具有流动特性的物质,所以只需外加很微小的力量即可使液晶分子运动。以最常见普遍的向列型液晶为例,液晶分子可轻易的借着电场作用使得液晶分子转向,由于液晶的光轴与其分子轴相当一致,故可借此产生光学效果。当加于液晶的电场移除消失时,液晶将借着其本身的弹性及黏性,液晶分子将十分迅速的回撤销来未加电场前的状态。

    “16”表示液晶显示模块每行可显示16个字符,“02”表示显示2行。

    基础操作参考下面的这篇文章:

    LED数码管的静态显示与动态显示(Keil+Proteus)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/134101256?spm=1001.2014.3001.5501

    Keil

    要注意的是Sbit RS=P2^2;

    符号"^"前面是特殊功能寄存器的名字,“^”后面的数字定义的可寻址位在特殊功能寄存器中的位置。

    LCD 1602的命令字

    命令RSR/~WD7D6D5D4D3D2D1D0
    清屏0000000000
    光标返回000000000X
    显示模式设置00000001I/DS
    显示开/关及光标设置0000001DCB
    光标或字符移位000001S/CR/LXX
    功能设置00001DLNFXX
    CGROM地址设置0001字符库ROM地址
    DDRAM地址设置001显示数据RAM地址
    读忙标志或地址01BF计数器地址
    写数据10要写的数据
    读数据11读出的数据

    LCD 1602的读写操作规定如下

    单片机发给LCD 1602 的控制信号LCD 1602 的输出
    读状态RS=0,R/~W=1,E=1D0~D7=状态字
    写命令RS=0,R/~W=0,D0~D7=命令,E=正脉冲无
    读数据RS=1,R/~W=1,E=1D0~D7=数据
    写数据RS=1,R/~W=0,D0~D7=数据,E=正脉冲无

     我这里取消了光标右移,是直接打印出来的.

    第一行字符的地址为80H~8FH.

    第二行字符的地址为C0H~CFH.

    1. #include
    2. #include //包含_nop_()空函数指令的头文件
    3. #define uchar unsigned char
    4. #define uint unsigned int
    5. #define out P0
    6. sbit RS=P2^0;//位变量
    7. sbit RW=P2^1;//位变量
    8. sbit E=P2^2;//位变量
    9. //函数声明部分
    10. void lcd_initial(void);//LCD初始化函数
    11. void check_busy(void);//检查忙标志位函数
    12. void write_command(uchar com);//写命令函数
    13. void write_data(uchar dat);//写数据函数
    14. void string(uchar ad,uchar *s);//显示字符串
    15. void delay(uint);//延时
    16. void main(void){
    17. lcd_initial();//对LCD初始化
    18. while(1){
    19. string(0x83,"I LOVE YOU");//显示第一行的字符
    20. string(0xC4,"FOREVER");//显示第二行的字符
    21. delay(100);//延时
    22. write_command(0x01);//清屏
    23. delay(100);//延时
    24. }
    25. }
    26. //延时
    27. void delay(uint j){
    28. uchar i=250;
    29. for(;j>0;j--){
    30. while(--i);
    31. i=249;
    32. while(--i);
    33. i=250;
    34. }
    35. }
    36. //检查忙标志
    37. void check_busy(void){
    38. uchar dt;
    39. do{
    40. dt=0xff;//dt为变量单元,初值为0xff
    41. //RS=0,E=1时才可以读忙标志位
    42. E=0;
    43. RS=0;
    44. RW=1;
    45. E=1;
    46. dt=out;//out为P0口,P0口的状态送入dt中
    47. }while(dt&0x80);//如果忙标志位BF=1,继续循环检测,等待BF=0
    48. E=0;//BF=0,LCD 1602不忙,结束检测
    49. }
    50. //写命令
    51. void write_command(uchar com){
    52. check_busy();
    53. //按规定RS和E同时为0时,才可以写命令
    54. E=0;
    55. RS=0;
    56. RW=0;
    57. out=com;//将命令com写入P0口
    58. E=1;//写命令时,E应为正脉冲,即正跳变,所以前面先置E=0
    59. _nop_();//空操作1个机器周期,等待硬件反应
    60. E=0;//E由高电平变为低电平,LCD 1602开始执行命令
    61. delay(1);//延时,等待硬件反应
    62. }
    63. //写数据
    64. void write_data(uchar dat){
    65. check_busy();//检测忙标志位BF=1则等待,若BF=0,则可对LCD 1602写入命令
    66. E=0;//按规定写数据时,E应为正脉冲,所以先置E=0
    67. //按规定RS=1和RW=0时,才可以写入数据
    68. RS=1;
    69. RW=0;
    70. out=dat;//将数据”dat“从P0口输出,即写入LCD 1602
    71. E=1;//E产生正跳变
    72. _nop_();//空操作1个机器周期,等待硬件反应
    73. E=0;//E由高电平变为低电平,写数据操作结束
    74. delay(1);
    75. }
    76. //液晶显示器初始化函数
    77. void lcd_initial(void){
    78. write_command(0x38);//8位两行显示,5*7点阵字符
    79. _nop_();//空操作1个机器周期,等待硬件反应
    80. write_command(0x0C);//开整体显示,光标关,无闪烁
    81. _nop_();//空操作1个机器周期,等待硬件反应
    82. //write_command(0x05);//光标右移
    83. _nop_();//空操作1个机器周期,等待硬件反应
    84. write_command(0x01);//清屏
    85. delay(1);
    86. }
    87. //输出显示字符串
    88. void string(uchar ad,uchar *s){
    89. write_command(ad);
    90. while(*s>0){
    91. write_data(*s++);//输出字符串,且指针增1
    92. delay(100);
    93. }
    94. }

    Proteus

    所需器件

    元件名称Proteus关键字
    51单片机AT89C51
    复位按钮BUTTON
    电容CAP
    电解电容CAP-ELEC
    晶体振荡器CRYSTAL
    字符型LCD 1602显示器LM016L
    滑动变阻器POT-HG
    电阻RES
    排阻RESPACK-8

     运行结果

    参考链接

    Proteus-51单片机-LCD1602液晶显示DS1302实时时钟_51单片机lcd1602显示时间_爱上电路设计的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/liht_1634/article/details/131524016一、51单片机 使用Proteus掌握LCD1602显示屏的使用(仿真及代码)_51单片机1602显示汉字-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_47235364/article/details/128294254STC89C51基础及项目第10天:LCD显示字符(非标协议外设)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Jaci133/article/details/133429036[89C51单片机]LCD1602静态显示-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zitech/article/details/9200203【精选】【常用传感器】LCD1602液晶工作原理详解及例程代码_lcd1602工作原理-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/as480133937/article/details/113148712

    总结

    基本上就是按照书上来了,也没有什么技巧,简单记录一下吧。

  • 相关阅读:
    【C++】C++11右值引用
    6.2.2
    解决Kafka新消费者组导致重复消费的问题
    item_review-获得商品评论
    周报6.24~6.30
    【腾讯云】打造未来智能应用的基石:腾讯混元大模型
    ECCV 2022 | 悉尼大学提出:绝对尺度感知,鲁棒,以及可泛化的自监督单目深度估计网络DynaDepth
    win10自带SSH免密登录Linux
    K8s源码分析(22)-client go组件之clientset
    【网络编程】IO多路复用
  • 原文地址:https://blog.csdn.net/weixin_64066303/article/details/134224776
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号