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单片机专栏

 

下面是一个简单的例子,可以在51单片机上使用LCD1602显示数字: ```c #include <reg51.h> #include <intrins.h> #define LCD1602_DB P0 //LCD1602数据线接在P0口上 sbit LCD1602_RS = P2^0; //LCD1602的RS引脚接在P2.0口上 sbit LCD1602_RW = P2^1; //LCD1602的RW引脚接在P2.1口上 sbit LCD1602_E = P2^2; //LCD1602的E引脚接在P2.2口上 void delay(unsigned int t) //延时函数,t为延时时间,单位为毫秒 { unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < 125; j++); } void LCD1602_WriteCmd(unsigned char cmd) //写入命令函数 { LCD1602_RS = 0; //RS置低,表示写入命令 LCD1602_RW = 0; //RW置低,表示写入操作 LCD1602_E = 1; //E置高,表示写入开始 LCD1602_DB = cmd; //将命令写入数据线 _nop_(); //空操作,等待一段时间 _nop_(); LCD1602_E = 0; //E置低,表示写入结束 delay(1); //延时1ms } void LCD1602_WriteData(unsigned char dat) //写入数据函数 { LCD1602_RS = 1; //RS置高,表示写入数据 LCD1602_RW = 0; //RW置低,表示写入操作 LCD1602_E = 1; //E置高,表示写入开始 LCD1602_DB = dat; //将数据写入数据线 _nop_(); //空操作,等待一段时间 _nop_(); LCD1602_E = 0; //E置低,表示写入结束 delay(1); //延时1ms } void LCD1602_Init() //初始化函数 { LCD1602_WriteCmd(0x38); //设置显示模式,显示2行,5x7点阵 LCD1602_WriteCmd(0x0c); //设置显示控制,显示开,光标关,光标不闪烁 LCD1602_WriteCmd(0x06); //设置输入方式,字符输入后光标右移,整屏不移动 LCD1602_WriteCmd(0x01); //清屏 } void LCD1602_ShowNum(unsigned char x, unsigned char y, unsigned char num) //显示数字函数 { unsigned char dat; if(x < 16 && y < 2) //判断x和y是否超出范围 { if(y == 0) //第一行 LCD1602_WriteCmd(0x80 + x); //设置光标位置 else //第二行 LCD1602_WriteCmd(0xc0 + x); //设置光标位置 dat = num / 100; //百位数字 LCD1602_WriteData(dat + '0'); //写入数据 dat = (num / 10) % 10; //十位数字 LCD1602_WriteData(dat + '0'); //写入数据 dat = num % 10; //个位数字 LCD1602_WriteData(dat + '0'); //写入数据 } } void main() { LCD1602_Init(); //初始化LCD1602 LCD1602_ShowNum(0, 0, 123); //显示数字123 while(1); } ``` 在上述代码中,我们首先定义了LCD1602的引脚和数据线接口,然后编写了延时函数、写入命令函数、写入数据函数、初始化函数和显示数字函数。 在 `main` 函数中,我们先调用 `LCD1602_Init` 函数进行初始化,然后调用 `LCD1602_ShowNum` 函数显示数字。在该函数中,我们先判断输入的参数是否超出范围,然后将数字拆成百位、十位和个位,依次写入LCD1602。在写入数据时,需要先将RS置高,表示写入数据,然后再将数据写入数据线。最后,我们使用一个死循环使程序不会结束。 以上代码仅供参考,具体实现方式可能因硬件配置和编译器等因素而略有不同。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值