• LCD1602指定位置显示字符串-详细版


     本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步!

    > 发布人:@日月同辉,与我共生_单片机-CSDN博客

    > 欢迎你为独创博主日月同辉,与我共生点赞❤❤❤+关注👍+收藏🌹+评论☺。

    系列专栏: CSDN-单片机串口通信学习系列🎁

    > 我的格言是:“尽最大努力,做最好的自己!💪

    要转载,请提前告知!!!

    版权声明:本文为CSDN博主「日月同辉,与我共生」的原创文章,CSDN独一份。

    目录

    一、前言

    二、系统设计思路

    2.1硬件设计

    2.2软件设计

    三、硬件设计接线

    四、项目代码

    4.1命令模块

    4.2读忙指令

    4.3写命令

    4.4写数据

    4.5初始化

    4.6位置函数

    4.7显示字符

    五、结果展示

    一、前言

    LCD1602是一种常见的液晶显示模块,它能够显示两行字符。在实际应用中,我们经常需要使用LCD1602来显示一些信息,例如温度、湿度、时间等。为了实现这个功能,我们需要编写相应的程序来控制LCD1602的显示。本文将介绍如何控制LCD1602显示两行字符的方法。

    二、系统设计思路

    系统设计思路可以分为硬件设计和软件设计

    LCD1602在指定位置显示字符串"hello world"

    2.1硬件设计

    主控芯片选择:选择STC89C51作为主控芯片,由于其较高的性能和稳定性,适合用于控制和数据处理。

    显示屏选择LCD1602用于传输字符数据和控制信号。

    2.2软件设计

    (1)LCD1602初始化(可以在游览器中下载LCD1602数据手册,查看初始化步骤)。

    (2)LCD1602读写时序,用于读写数据或数据。

    (3)在LCD1602屏中显示字符。

    三、硬件设计接线

    RS接P2^5 口,用于选择数据/命令寄存器。RS=0时,使用命令寄存器;RS=1时,使用数据寄存器。

    RW接P2^6 口,用于选择读写寄存器。RW=0时,使用写寄存器;RW=1时,使用读寄存器。

    使能端E接P2^7口

    传输数据/命令(8位二进制)DB0-DB7,接P0口。

    Vss接+5电源,VDD接地GND,VEE先接变阻器后接到地。

    四、项目代码

    不懂如何看读写时序图的,可以看:LCD1602设计(3)-读写时序

    4.1命令模块

    LCD1602.h

    对LCD1602引脚接的I/O口宏定义,并对LCD1602的所有指令进行宏定义。

    1. #ifndef __LCD1602_H__
    2. #define __LCD1602_H__
    3. #include
    4. #include "lcd1602.h"
    5. //IO口宏定义
    6. sbit LCD1602_RS=P2^5;
    7. sbit LCD1602_RW=P2^6;
    8. sbit LCD1602_E=P2^7;
    9. #define LCD1602_DB P1
    10. //命令宏定义
    11. #define LCD_SCREEN_CLR 0x01 //清屏
    12. #define LCD_CURSOR_RST 0x02 //光标复位
    13. //显示开关控制指令
    14. #define LCD_OFF 0x08 //显示关,光标关,不闪烁
    15. #define LCD_FLI 0x09 //显示关,光标关,闪烁开
    16. #define LCD_CUR 0x0A //显示关,光标开,不闪烁
    17. #define LCD_CUR_FLI 0x0B //显示关,光标开,闪烁开
    18. #define LCD_BIS 0x0C //显示开,光标关,不闪烁
    19. #define LCD_BIS_FLI 0x0D //显示开,光标关,闪烁开
    20. #define LCD_BIS_CUR 0x0E //显示开,光标开,不闪烁
    21. #define LCD_ON 0x0F //显示开,光标开,闪烁开
    22. //显示模式控制
    23. #define LCD_AC_ADD_MOVE 0x07 //数据读写操作后,AC自动加1,画面平移
    24. #define LCD_AC_ADD 0x06 //数据读写操作后,AC自动加1,画面不平移
    25. #define LCD_AC_RED_MOVE 0x05 //数据读写操作后,AC自动减1,画面平移
    26. #define LCD_AC_RED 0x04 //数据读写操作后,AC自动减1,画面不平移
    27. //光标移动指令
    28. #define SUR_LEFT 0x10 //光标左移,画面显示不移动
    29. #define SUR_RIGHT 0x14 //光标右移,画面显示不移动
    30. #define LCD_DIS_FRA_LEFT 0x18 //光标不移动,画面显示左移,操作后AC自增
    31. #define LCD_DIS_FRA_RIGHT 0x1C //光标不移动,画面显示右移,操作后AC自减
    32. //功能设置
    33. #define EDI4_DISONE_57 0x20 //4位数据接口,1行显示,5*7点阵
    34. #define EDI4_DISONE_510 0x24 //4位数据接口,1行显示,5*10点阵
    35. #define EDI4_DISTWO_57 0x28 //4位数据接口,2行显示,5*7点阵
    36. #define EDI4_DISTWO_510 0x2C //4位数据接口,2行显示,5*10点阵
    37. #define EDI8_DISONE_57 0x30 //8位数据接口,1行显示,5*7点阵
    38. #define EDI8_DISONE_510 0x34 //8位数据接口,1行显示,5*10点阵
    39. #define EDI8_DISTWO_57 0x38 //8位数据接口,2行显示,5*7点阵
    40. #define EDI8_DISTWO_510 0x3C //8位数据接口,2行显示,5*10点阵
    41. //函数声明
    42. void LCDReadBF();//读忙检测
    43. void LCDWriteCmd(unsigned char cmd);//写命令
    44. void LCDWritedata(unsigned char dat);//写数据
    45. void LCDInit();//初始化
    46. void LCDSetPosition(unsigned char x,unsigned char y);//位置函数
    47. void LCDShowStr(unsigned char x,unsigned char y,unsigned char *str);//字符串位置显示函数
    48. #endif

    4.2读忙指令

    读时序图:

    1. void LCDReadBF() //读忙检测(读命令)
    2. {
    3. unsigned char i;
    4. unsigned char state;
    5. LCD1602_DB=0XFF;
    6. LCD1602_RS=0;
    7. LCD1602_RW=1;
    8. do
    9. {
    10. LCD1602_E=1;
    11. state=LCD1602_DB;//将LCD1602的数据给主机(单片机)
    12. LCD1602_E=0;
    13. i++;
    14. if(i>200)
    15. break;//防止忙过头,卡死
    16. }
    17. while(state&0x80); //判断忙不忙
    18. }

    4.3写命令

    写时序图:

    1. void LCDWriteCmd(unsigned char cmd) //写命令
    2. {
    3. LCDReadBF();//读忙检测,确保LCD1602此刻不在工作
    4. LCD1602_RS=0;
    5. LCD1602_RW=0;
    6. LCD1602_DB=cmd;//将命令dat给LCD1602
    7. LCD1602_E=1;
    8. LCD1602_E=0;
    9. }

    4.4写数据

    写时序图:

    1. void LCDWritedata(unsigned char dat) //写数据
    2. {
    3. LCDReadBF();//读忙检测,确保LCD1602此刻不在工作
    4. LCD1602_RS=1;
    5. LCD1602_RW=0;
    6. LCD1602_DB=dat;//将数据dat给LCD1602
    7. LCD1602_E=1;
    8. LCD1602_E=0;
    9. }

    4.5初始化

    初始化步骤:功能设置==>显示开关控制指令==>光标移动指令/显示模式控制

    功能设置:接口位数(4位/8位)、显示多少行(1行/2行)、点阵类型(5*7点阵/5*10点阵)。

    显示开关控制指令:是否显示字符、光标是否关闭、光标是否闪烁。

    光标移动指令:光标不动/左移/右移、画面不动/左移/右移。

    显示模式控制:光标左移/右移、画面左移/右移。

    光标移动指令和显示模式控制有和区别?请关注我,下回出解析。

    1. void LCDInit()
    2. {
    3. LCDWriteCmd(EDI8_DISTWO_57);//8位数据接口,2行显示,5*7点阵
    4. LCDWriteCmd(LCD_BIS);//显示开,光标关,不闪烁
    5. LCDWriteCmd(SUR_RIGHT);//光标右移,画面显示不移动
    6. }

    4.6位置函数

    每个位置对应一个DDRAM地址,LCD1602两行显示,1行最大显示16字符

    第一行DDRAM地址为00H~0FH,第二行DDRAM地址为40H~4FH。

    字符要在某个位置显示,并不是直接调用DDRAM地址,而是用通过写命令的方式完成。

    通过LCD1602命令表格,可以看出位置显示命令:DDRAM的8个二进制的最高位为1,其他位不变。

    1. void LCDSetPosition(unsigned char x,unsigned char y) //位置函数 y:行 0-1
    2. { // x:列 0-15
    3. if(y==0)
    4. {
    5. LCDWriteCmd(0x80|x);
    6. }
    7. else
    8. {
    9. LCDWriteCmd(0x80|(x+0x40));
    10. }
    11. }

    4.7显示字符

    显示"hello world":

    1. #include "lcd1602.h"
    2. void main()
    3. {
    4. unsigned char str[]="hello world";
    5. LCDInit();//初始化
    6. while(1)
    7. {
    8. LCDShowStr(0,0,str);//在第0行第0列显示"hello world"
    9. //LCDShowStr(0,1,"hello world");
    10. }
    11. }

    五、结果展示

    在第0行第0列开始显示字符串"hello world",显示一切正确。

    下一文将着重 LCD1602四位接口,亲爱的读者敬请期待,下一文更精彩!!!

    一日不读书,胸臆无佳想。我叫不白吃,喜欢我的,可以支持我,博主名叫@日月同辉,与我共生

    @日月同辉,与我共生_单片机基础,单片机串口通信-CSDN博客@日月同辉,与我共生擅长单片机基础,单片机串口通信,等方面的知识,@日月同辉,与我共生关注stm32,c语言,51单片机,proteus,单片机领域.https://blog.csdn.net/LIN___IT?spm=1000.2115.3001.5343

  • 相关阅读:
    [倒置字符串]
    Redis配置与优化
    轻松掌握视频制作技巧:批量分割长视频的详细步骤
    升级:远程桌面软件玩游戏指南
    操作系统:操作系统概论
    2023秋招回顾--Java开发--个人心得
    在window上安装redis 如何安装redis-server
    Java float和double精度范围大小(二进制存储角度剖析)
    LeetCode209-长度最小的子数组
    MySQL开窗函数
  • 原文地址:https://blog.csdn.net/LIN___IT/article/details/134449822