51单片机LCD1602显示

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[i]!='\0'){
	   write_dat(table[i]);
	   delay(100);
	   i++;
	 }
	/*
	  i=0;
	write_con(0xc0);  //起点为第二行
	while(table[i]!='\0'){
	   write_dat(table[i]);
	   delay(100);
	   i++;
	 }
	 i=0;
	 */
}

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

5.开发板运行结果:

 


以上就是51单片机的LCD1602实验了 

想要了解更多的单片机实验,请查看我的51单片机专栏

 

  • 18
    点赞
  • 219
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,下面是一个简单的51单片机LCD1602显示程序的实现。 首先,你需要包含头文件和定义相关的常量和函数,如下所示: ```c #include <reg52.h> // 51单片机头文件 #define LCD_RS P1_0 // LCD1602的RS引脚连接到P1.0 #define LCD_RW P1_1 // LCD1602的RW引脚连接到P1.1 #define LCD_EN P1_2 // LCD1602的EN引脚连接到P1.2 #define LCD_D4 P1_4 // LCD1602的D4引脚连接到P1.4 #define LCD_D5 P1_5 // LCD1602的D5引脚连接到P1.5 #define LCD_D6 P1_6 // LCD1602的D6引脚连接到P1.6 #define LCD_D7 P1_7 // LCD1602的D7引脚连接到P1.7 void LCD_Init(void); void LCD_WriteCommand(unsigned char command); void LCD_WriteData(unsigned char data); void LCD_WriteString(unsigned char *string); void LCD_SetCursor(unsigned char row, unsigned char col); void LCD_Clear(void); ``` 接下来,你需要编写相应的函数来实现LCD1602的初始化、写命令、写数据、写字符串、设置光标位置以及清除显示内容等功能。这里我提供一个参考实现,如下所示: ```c // 初始化LCD1602 void LCD_Init(void) { LCD_WriteCommand(0x02); // 4位总线,设置为4位模式 LCD_WriteCommand(0x28); // 4位总线,2行显示,5x8点阵 LCD_WriteCommand(0x0c); // 显示开,光标关闭,闪烁关闭 LCD_WriteCommand(0x06); // 光标移动,文字不动 LCD_Clear(); // 清除显示内容 } // 向LCD1602写入命令 void LCD_WriteCommand(unsigned char command) { LCD_RS = 0; // RS引脚为低电平,表示写入命令 LCD_RW = 0; // RW引脚为低电平,表示写入操作 LCD_EN = 1; // EN引脚为高电平,表示操作开始 LCD_D4 = command >> 4; // 高4位数据 LCD_D5 = command >> 5; LCD_D6 = command >> 6; LCD_D7 = command >> 7; LCD_EN = 0; // EN引脚为低电平,表示操作结束 LCD_D4 = command & 0x0f; // 低4位数据 LCD_D5 = (command & 0x1f) >> 1; LCD_D6 = (command & 0x3f) >> 2; LCD_D7 = (command & 0x7f) >> 3; LCD_EN = 1; // EN引脚为高电平,表示操作开始 LCD_EN = 0; // EN引脚为低电平,表示操作结束 } // 向LCD1602写入数据 void LCD_WriteData(unsigned char data) { LCD_RS = 1; // RS引脚为高电平,表示写入数据 LCD_RW = 0; // RW引脚为低电平,表示写入操作 LCD_EN = 1; // EN引脚为高电平,表示操作开始 LCD_D4 = data >> 4; // 高4位数据 LCD_D5 = data >> 5; LCD_D6 = data >> 6; LCD_D7 = data >> 7; LCD_EN = 0; // EN引脚为低电平,表示操作结束 LCD_D4 = data & 0x0f; // 低4位数据 LCD_D5 = (data & 0x1f) >> 1; LCD_D6 = (data & 0x3f) >> 2; LCD_D7 = (data & 0x7f) >> 3; LCD_EN = 1; // EN引脚为高电平,表示操作开始 LCD_EN = 0; // EN引脚为低电平,表示操作结束 } // 向LCD1602写入字符串 void LCD_WriteString(unsigned char *string) { while (*string != '\0') { LCD_WriteData(*string); string++; } } // 设置LCD1602的光标位置 void LCD_SetCursor(unsigned char row, unsigned char col) { unsigned char address; if (row == 0) { address = 0x00 + col; } else if (row == 1) { address = 0x40 + col; } else { return; } LCD_WriteCommand(0x80 | address); } // 清除LCD1602的显示内容 void LCD_Clear(void) { LCD_WriteCommand(0x01); LCD_SetCursor(0, 0); } ``` 其中,LCD_Init函数用于初始化LCD1602,LCD_WriteCommand函数用于向LCD1602写入命令,LCD_WriteData函数用于向LCD1602写入数据,LCD_WriteString函数用于向LCD1602写入字符串,LCD_SetCursor函数用于设置LCD1602的光标位置,LCD_Clear函数用于清除LCD1602的显示内容。 最后,你可以在主函数中调用相应的函数来实现LCD1602的显示。例如,你可以编写一个简单的程序来显示"Hello, World!",如下所示: ```c void main(void) { LCD_Init(); // 初始化LCD1602 LCD_WriteString("Hello, World!"); // 在LCD1602上显示"Hello, World!" while (1); // 程序运行结束 } ``` 希望这个程序能够对你有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值