51单片机-LCD1602显示(无字库)

本文介绍了51单片机如何操作LCD1602液晶显示屏,包括字符和汉字的显示方法,详细阐述了液晶屏的引脚说明、控制指令、读写时序图以及RAM地址映射。此外,还提到了LCD1602的默认字库和用户自定义字符的方法。
摘要由CSDN通过智能技术生成

LCD1602液晶显示屏显示
字符显示

       用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

汉字的显示

       汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。

LCD1602液晶显示屏引脚说明
引脚 功能
VDD 电源正极
VSS 电源地
VL 液晶显示偏压
RS 数据/命令选择
R/W 读/写选择
E 使能信号
D0~D7 数据
BLA 背光源正极
BLK 背光源负极
  • VSS为地电源。
  • VDD接5V正电源。
  • VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 >* RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
  • R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
  • E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
  • D0~D7为8位双向数据线。
  • BLA背光源正极。
  • BLK背光源负极。
LCD1602液晶显示屏11条控制指令
指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0
清显示 0 0 0 0 0 0 0 0 0 1
光标返回 0 0 0 0 0 0 0 0 1 *
置输入模式 0 0 0 0 0 0 0 1 I/D S
显示开/关控制 0 0 0 0 0 0 1 D C B
光标或字符移位 0 0 0 0 0 1 S/C R/L * *
置功能 0 0 0 0 1 DL N F * *
置字符发生存贮器地址 0 0 0 1 字符发生存贮器地址
置数据存贮器地址 0 0 1 显示数据存贮器地址
读忙标志或地址 0 1 BF 计数器地址
写数到CGRAM或DDRAM 1 0 要写的数据内容
从CGRAM或DDRAM读数 1 1 读出的数据内容
  • 清显示,指令码01H,光标复位到地址00H位置。
  • 光标复位,光标返回到地址00H。
  • 光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
  • 显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
  • 光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
  • 功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
  • 字符发生器RAM地址设置。
  • DDRAM地址设置。
  • 读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
  • 写数据。
  • 读数据。
LCD1602读写时序图

读时序
写时序

符号 时限
tc 400ns~
tpw 150ns~
tr,tf ~25ns
tsp1 30ns~
thd1 10ns~
td ~200ns
thd2 20ns~
tsp2 40ns~
LCD1602的RAM地址映射

地址映射

LCD1602默认字库

在这里插入图片描述
       其中00H-07H用户可以自定义保存字符。通过字模软件或者自己编写字模代码写入字库中,后期可以调用使用。
下面为参考程序

/*delayms()函数自己补全*/
#define EN			P3^4
#define RS  			P3^5
#define RW  			P3^6
#define DATAPORT		P0

sbit En = EN;
sbit Rs = RS;
sbit Rw = RW;



void lcd_delayms(){
   						
	unsigned int x,y;
	for(x=1;x>0;x--)
	for(y=114;y>0
1602汉字显示,如有需要可以下载 #include #define uchar unsigned char #define uint unsigned int sbit lcdrs=P1^0; sbit lcden=P1^2; sbit lcdwr=P1^1; uchar CGCODE[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,//"年"代码 0x00 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//"月"代码 0x01 0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00,//"日"代码 0x02 0x07,0x04,0x07,0x04,0x07,0x00,0x04,0x07,//"星"左上半部分代码 0x03 0x1F,0x01,0x1F,0x01,0x1F,0x08,0x08,0x1F,//"星"右上半部分代码 0x04 0x08,0x17,0x00,0x1F,0x00,0x00,0x00,0x00,//"星"左下半部分代码 0x05 0x08,0x1F,0x08,0x1F,0x00,0x00,0x00,0x00//"星"右下半部分代码 0x06 }; uchar tab[]={'0','8',0x00,'0','3',0x01,'0','9',0x02};//显示"08年03月09日" void delay(uint t) { uint x,y; for(x=0;x<t;x++) for(y=0;y<110;y++); } void write_com(uchar com)//向1602写指令 { lcdrs=0; P2=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar dat)//向1602写数据 { lcdrs=1; P2=dat; delay(5); lcden=1; delay(5); lcden=0; } void init()//程序初始化 { lcdwr=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void main()//主函数 { int i; init(); lcdrs=0; lcdwr=0; write_com(0x40);//将自定义字符写入CGRAM for(i=0;i<56;i++)//循环56次写入 { write_date(CGCODE[i]); } write_com(0x80);//写入初始地址 for(i=0;i<9;i++) { write_date(tab[i]); } write_com(0x80+9);//用09H和0AH显示"星"上部分 write_date(0x03); write_date(0x04); write_com(0x80+0x40+9);//用49H和4AH显示"星"上部分 write_date(0x05); write_date(0x06); while(1); }
51单片机lcd1602显示汉字需要使用汉字库lcd1602驱动库。以下是一个简单的代码示例,可以实现在lcd1602显示“你好”两个汉字: ``` #include <reg52.h> #include <intrins.h> sbit RS=P2^0; //定义LCD1602的RS端口 sbit RW=P2^1; //定义LCD1602的RW端口 sbit EN=P2^2; //定义LCD1602的EN端口 void delay(unsigned int i) //延时函数 { while(i--); } void WriteCommand(unsigned char command) //写命令函数 { RS=0; //设置为写命令模式 RW=0; P0=command; //将命令写入P0口 EN=1; //使能 delay(5); //延时 EN=0; //禁止 } void WriteData(unsigned char dat) //写数据函数 { RS=1; //设置为写数据模式 RW=0; P0=dat; //将数据写入P0口 EN=1; //使能 delay(5); //延时 EN=0; //禁止 } void InitLcd1602() //初始化函数 { WriteCommand(0x38); //设置16*2显示,5*7点阵,8位数据接口 WriteCommand(0x0c); //开显示,无光标,不闪烁 WriteCommand(0x06); //读写指针自动加1,不移动屏幕 WriteCommand(0x01); //清屏 } void DisplayChinese(unsigned char addr, unsigned char *ptr) //显示汉字函数 { unsigned char i; WriteCommand(addr); //设置显示地址 for(i=0;i<16;i++) //循环写入数据 { WriteData(ptr[i]); //写入汉字数据 } } void main() { unsigned char Hanzi[]={0x10,0x10,0x10,0x10,0x7c,0x44,0x7c,0x40,0x7e,0x42,0x42,0x7e,0x42,0x42,0x42,0x00}; //“你”的汉字数据 InitLcd1602(); //初始化LCD1602 DisplayChinese(0x80,Hanzi); //在第一行显示“你”字 while(1); } ``` 注意,这个示例代码只是汉字库中的一个汉字“你”,如果需要显示其他汉字,需要修改汉字库相应的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值