• LCD1602液晶显示屏介绍和程序开发


    1.LCD1602概述

    LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)

    • 引脚说明第 1 脚: VSS 为电源地
    • 第 2 脚: VDD 接 5V 正电源
    • 第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度 过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。
    • 第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
    • 第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共 同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号, 当 RS 为高电平 R/W 为低电平时可以写入数据。
    • 第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。
    • 第 7-14 脚:D0~D7 为 8 位双向数据线。 第 15 脚:背光源正极。
    • 第 16 脚:背光源负极

    单片机的接线:

    • 电源
    • VSS -- GND
    • VDD -- 5V
    • 对比度
    • VO -- GND
    • 控制线
    • RS -- P1.0
    • RW -- P1.1
    • E -- P1.4
    • 背光灯
    • BLA -- 5V
    • BLK -- GND
    • 数据
    • D0到D7 -- P0.到P0.7

    2.LCD1602开发逻辑

    在哪里显示:

    例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?

    这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实 际写入的数据应该是 01000000B(40H) +10000000B(80H)=11000000B(C0H)

    显示什么:

    3.LCD1602读写操作时序

    读操作时序:

    写操作时序:

    数序参数:

    4.LCD1602显示一个字符

    代码示例:

    1. #include "reg52.h"
    2. #include "intrins.h"
    3. /*
    4. RS -- P1.0
    5. RW -- P1.1
    6. E -- P1.4 */
    7. #define databuffer P0 //定义8位数据线,Po端口组
    8. sbit RS = P1^0;
    9. sbit RW = P1^1;
    10. sbit EN = P1^4;
    11. void check_busy()
    12. {
    13. char tmp = 0x80;
    14. databuffer = 0x80;
    15. while(tmp & 0x80){//1000 0000
    16. RS = 0;
    17. RW = 1;
    18. EN = 0;
    19. _nop_();
    20. EN = 1;
    21. _nop_();
    22. _nop_();
    23. tmp = databuffer;
    24. EN = 0;
    25. _nop_();
    26. }
    27. }
    28. void Write_Cmd_Func(char cmd)
    29. {
    30. check_busy();
    31. RS = 0;
    32. RW = 0;
    33. EN = 0;
    34. _nop_();
    35. databuffer = cmd;
    36. _nop_();
    37. EN = 1;
    38. _nop_();
    39. _nop_();
    40. EN = 0;
    41. _nop_();
    42. }
    43. void Write_Data_Func(char dataShow)
    44. {
    45. check_busy();
    46. RS = 1;
    47. RW = 0;
    48. EN = 0;
    49. _nop_();
    50. databuffer = dataShow;
    51. _nop_();
    52. EN = 1;
    53. _nop_();
    54. _nop_();
    55. EN = 0;
    56. _nop_();
    57. }
    58. void Delay15ms() //@11.0592MHz
    59. {
    60. unsigned char i, j;
    61. i = 27;
    62. j = 226;
    63. do
    64. {
    65. while (--j);
    66. } while (--i);
    67. }
    68. void Delay5ms() //@11.0592MHz
    69. {
    70. unsigned char i, j;
    71. i = 9;
    72. j = 244;
    73. do
    74. {
    75. while (--j);
    76. } while (--i);
    77. }
    78. void LCD1602_INIT()
    79. {
    80. //(1)延时 15ms
    81. Delay15ms();
    82. //(2)写指令 38H(不检测忙信号)
    83. Write_Cmd_Func(0x38);
    84. //(3)延时 5ms
    85. Delay5ms();
    86. //(4)以后每次写指令,读/写数据操作均需要检测忙信号
    87. //(5)写指令 38H:显示模式设置
    88. Write_Cmd_Func(0x38);
    89. //(6)写指令 08H:显示关闭
    90. Write_Cmd_Func(0x08);
    91. //(7)写指令 01H:显示清屏
    92. Write_Cmd_Func(0x01);
    93. //(8)写指令 06H:显示光标移动设置
    94. Write_Cmd_Func(0x06);
    95. //(9)写指令 0CH:显示开及光标设置}
    96. Write_Cmd_Func(0x0c);
    97. }
    98. void main()
    99. {
    100. char position = 0x80 + 0x05;
    101. char dataShow = 'C';
    102. LCD1602_INIT();
    103. Write_Cmd_Func(position);//选择要显示的地址
    104. Write_Data_Func(dataShow);//发送要显示的字符
    105. }

    5.LCD1602显示一行

    代码示例:

    1. #include "reg52.h"
    2. #include "intrins.h"
    3. /*
    4. RS -- P1.0
    5. RW -- P1.1
    6. E -- P1.4 */
    7. #define databuffer P0 //定义8位数据线,Po端口组
    8. sbit RS = P1^0;
    9. sbit RW = P1^1;
    10. sbit EN = P1^4;
    11. void check_busy()
    12. {
    13. char tmp = 0x80;
    14. databuffer = 0x80;
    15. while(tmp & 0x80){//1000 0000
    16. RS = 0;
    17. RW = 1;
    18. EN = 0;
    19. _nop_();
    20. EN = 1;
    21. _nop_();
    22. _nop_();
    23. tmp = databuffer;
    24. EN = 0;
    25. _nop_();
    26. }
    27. }
    28. void Write_Cmd_Func(char cmd)
    29. {
    30. check_busy();
    31. RS = 0;
    32. RW = 0;
    33. EN = 0;
    34. _nop_();
    35. databuffer = cmd;
    36. _nop_();
    37. EN = 1;
    38. _nop_();
    39. _nop_();
    40. EN = 0;
    41. _nop_();
    42. }
    43. void Write_Data_Func(char dataShow)
    44. {
    45. check_busy();
    46. RS = 1;
    47. RW = 0;
    48. EN = 0;
    49. _nop_();
    50. databuffer = dataShow;
    51. _nop_();
    52. EN = 1;
    53. _nop_();
    54. _nop_();
    55. EN = 0;
    56. _nop_();
    57. }
    58. void Delay15ms() //@11.0592MHz
    59. {
    60. unsigned char i, j;
    61. i = 27;
    62. j = 226;
    63. do
    64. {
    65. while (--j);
    66. } while (--i);
    67. }
    68. void Delay5ms() //@11.0592MHz
    69. {
    70. unsigned char i, j;
    71. i = 9;
    72. j = 244;
    73. do
    74. {
    75. while (--j);
    76. } while (--i);
    77. }
    78. void LCD1602_INIT()
    79. {
    80. //(1)延时 15ms
    81. Delay15ms();
    82. //(2)写指令 38H(不检测忙信号)
    83. Write_Cmd_Func(0x38);
    84. //(3)延时 5ms
    85. Delay5ms();
    86. //(4)以后每次写指令,读/写数据操作均需要检测忙信号
    87. //(5)写指令 38H:显示模式设置
    88. Write_Cmd_Func(0x38);
    89. //(6)写指令 08H:显示关闭
    90. Write_Cmd_Func(0x08);
    91. //(7)写指令 01H:显示清屏
    92. Write_Cmd_Func(0x01);
    93. //(8)写指令 06H:显示光标移动设置
    94. Write_Cmd_Func(0x06);
    95. //(9)写指令 0CH:显示开及光标设置}
    96. Write_Cmd_Func(0x0c);
    97. }
    98. void LCD1602_showLine(char row, char col, char *string)
    99. {
    100. switch(row){
    101. case 1:
    102. Write_Cmd_Func(0x80+col);
    103. while(*string){
    104. Write_Data_Func(*string);
    105. string++;
    106. }
    107. break;
    108. case 2:
    109. Write_Cmd_Func(0x80+0x40+col);
    110. while(*string){
    111. Write_Data_Func(*string);
    112. string++;
    113. }
    114. break;
    115. }
    116. }
    117. void main()
    118. {
    119. char position = 0x80 + 0x05;
    120. //char dataShow = 'C';
    121. LCD1602_INIT();
    122. LCD1602_showLine(1,5,"NO.1");
    123. LCD1602_showLine(2,0,"zgl nb");
    124. }

  • 相关阅读:
    Spring中bean的生命周期
    java毕业设计网上化妆品商城设计源码+lw文档+mybatis+系统+mysql数据库+调试
    Redis LRU缓存淘汰算法
    MAC安装JDK8
    【ArcGIS Pro二次开发】(83):ProWindow和WPF的一些技巧
    QT信号与槽/窗口组件优化/使用QT制作QQ登录界面
    Vuetify:定制化、响应式的 Vue UI 库 | 开源日报 No.83
    Vue Router完整的导航解析流程
    elasticsearch集群搭建
    第二届黄河流域网络安全技能挑战赛Web_wirteup
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/132804223