[经验分享] 51单片机LCD1602显示

[复制链接]
 楼主| 八层楼 发表于 2025-6-11 11:42 | 显示全部楼层 |阅读模式
1.原理:
1602 液晶也叫 1602 字符型液晶,它能显示 2 行字符信息,每行又能显示 16 个字符。 它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若 干个 5x7 或者  5x10 的点阵字符位组成,每个点阵字符位都可以用显示一个字符, 每位之间有一个点 距的间隔,每行之间也有间隔,起到了字符间距和行间距的作 用,正因为如此,所以它 不能很好的显示图片

   (1)引脚:



(2)其地址 和屏幕的对应关系如下:



要显示字符时 要先输入显示字符地址,也就是告诉模块在哪里显示字符,例如第二行第一个字 符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1,所以实际写入的数据应该是 01000000B(40H)+10000000B(80H)=11000000B(C0H)
也就是说:第一行地址为:0x40   第二行地址为:0xC0

(3)常用指令:

   清屏置零:0x01



1.清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII 码 20H;
2.光标归位,即将光标撤回液晶显示屏的左上方;
3.将地址计数器(AC)的值设为 0。


  模式设置指令 :



功能:设定每次写入 1 位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。
I/D:0=写入新数据后光标左移        1=写入新数据后光标右移
S:  0=写入新数据后显示屏不移动   1=写入新数据后显示屏整体右移 1 个字符
显示开关控制指令



功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。
D:0=显示功能关   1=显示功能开
C:0=无光标    1=有光标
B:0=光标闪烁 1=光标不闪
功能设定指令



功能: 设定数据总线位数、显示的行数及字型。
DL:0=数据总线为 4 位   1=数据总线为 8 位
N:  0=显示 1 行              1=显示 2 行
F:  0=5×7 点阵/每字符   1=5×10 点阵/每字符
(4) 写指令与写数据:

① 当要写指令字,设置 LCD1602 的工作方式时:需要把 RS 置为低电平 , RW    置为低电平 ,然后将 数据送到数据口 D0~D7 ,最后 E 引脚一个高脉冲 将数据写入。
/*写指令函数*/
void write_con(u8 con){
      P0=con;           //送出指令
      RS=0;RW=0;EN=1;  //写指令时序
      delay(200);
      EN=0;
}

② 当要写入数据字,在 1602 上实现显示时:需要把 RS 置为高电平 , RW 置为低电平 ,然后将 数据送到数据口 D0~D7 ,最后 E 引脚一个高脉冲 将数据写入
/*写数据函数*/
void write_dat(u8 dat){
     P0=dat;             //送出数据
     RS=1;RW=0;EN=1;//写数据时序
     delay(200);
     EN=0;
}
2.电路原理图(普中A2开发板):



3.程序说明:
   利用LCD1602显示"Hello World"字符

4.源程序:
#include <reg51.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit RW=P2^5;
sbit RS=P2^6;
sbit EN=P2^7;
u8 code table[15]="Hello World";

/*延时函数*/
void delay(u16 i)
{
   while(i--);

}
/*写指令函数*/
void write_con(u8 con){
    P0=con;           //送出指令
          RS=0;RW=0;EN=1;  //写指令时序
          delay(200);
          EN=0;
}
/*写数据函数*/
void write_dat(u8 dat){
   P0=dat;                     //送出数据
         RS=1;RW=0;EN=1;//写数据时序
         delay(200);
         EN=0;
}
/*LCD初始化函数*/
void LcdInit(){
   write_con(0x01);//清屏
         write_con(0x38);//设置16*2显示
         write_con(0x0c);//开显示
         write_con(0x06);//写入数据时光标右移1位
}

/*LCD显示函数*/
void LcdDisplay(u8  table[]){
    u8 i=0;
        write_con(0x80);   //起点为第一行
        while(table!='\0'){
           write_dat(table);
           delay(100);
           i++;
         }
        /*
          i=0;
        write_con(0xc0);  //起点为第二行
        while(table!='\0'){
           write_dat(table);
           delay(100);
           i++;
         }
         i=0;
         */
}

/*主函数*/
void main()
{
   LcdInit();
         while(1)
         {
   LcdDisplay(table);
         }
}



5.开发板运行结果:



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_46364710/article/details/119964568

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

113

主题

4338

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部