利用STC89C52单片机控制LCD1602.docx
《利用STC89C52单片机控制LCD1602.docx》由会员分享,可在线阅读,更多相关《利用STC89C52单片机控制LCD1602.docx(14页珍藏版)》请在冰豆网上搜索。
![利用STC89C52单片机控制LCD1602.docx](https://file1.bdocx.com/fileroot1/2022-11/26/b92ffb27-987f-4c8e-a74e-0590e2a2e97c/b92ffb27-987f-4c8e-a74e-0590e2a2e97c1.gif)
利用STC89C52单片机控制LCD1602
利用STC89C52单片机控制LCD1602(不带中文字库)显示的中文
一、设计原理
使用STC89C52单片机控制1602LCD(不带中文字库的);利用1602LCD(不带中文字库的)中的存储器(64个字节00H-3FH)自建立8个5×8点阵的字符从而显示中文字符。
二、LCD1602的指令集:
1、清屏
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
00
00000001
运行时间(250Khz):
1.64ms;
功能:
清DDRAM和AC值。
2、归位
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
00
0000001*
运行时间(250Khz):
1.64ms;
功能:
AC=0,光标、画面回HOME位。
3、输入方式设置
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
00
000001I/DS
运行时间(250Khz):
40us;
功能:
设置光标、画面移动方式。
其中:
I/D=1:
数据读、写操作后,AC自动增一;
I/D=0:
数据读、写操作后,AC自动减一;
S=1:
数据读、写操作,画面平移;
S=0:
数据读、写操作,画面不动;
4、显示开关控制
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
00
00001DCB
运行时间(250Khz):
40us;
功能:
设置显示、光标及闪烁开、关。
其中:
D表示显示开关:
D=1为开,D=0为关;
C表示光标开关:
C=1为开,C=0为关;
B表示闪烁开关:
B=1为开,B=0为关。
5、光标、画面位移
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
00
0001S/CR/L**
运行时间(250Khz):
40us;
功能:
光标、画面移动,不影响DDRAM。
其中:
S/C=1:
画面平移一个字符位;
S/C=0:
光标平移一个字符位;
R/L=1:
右移;R/L=0:
左移。
6、功能设置
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
00
001DLNF**
运行时间(250Khz):
40us;
功能:
工作方式设置(初始化指令)。
其中:
DL=1,8位数据接口;DL=0,四位数据接口;
N=1,两行显示;N=0,一行显示;
F=1,510点阵字符;F=0,57点阵字符。
7、CGRAM地址设置
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
00
01A5A4A3A2A1A0
运行时间(250Khz):
40us;
功能:
设置CGRAM地址。
A5~A0=0~3FH。
8、DDRAM地址设置
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
00
1A6A5A4A3A2A1A0
运行时间(250Khz):
40us;
功能:
设置DDRAM地址。
N=0,一行显示A6~A0=0~4FH;
N=1,两行显示,首行A6~A0=00H~2FH,
次行A6~A0=40H~67H。
9、读BF及AC值
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
01
BFAC6AC5AC4AC3AC2AC1AC0
功能:
读忙BF值和地址计数器AC值。
其中:
BF=1:
忙;BF=0:
准备好。
此时,AC值意义为最近一次地址设置(CGRAM或DDRAM)定义。
10、写数据
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
10
数据
运行时间(250Khz):
40us;
功能:
根据最近设置的地址性质,数据写入DDRAM或CGRAM内。
11、读数据
RSR/W
DB7DB6DB5DB4DB3DB2DB1DB0
11
数据
运行时间(250Khz):
40us;
功能:
根据最近设置的地址性质,从DDRRAM或CGRAM数据读出。
三、程序:
//液晶显示中文-版本0.0
//作者:
pcdian
//定义液晶的一些功能位
//RS为数据、指令寄存器选择位
//RW 为读写选择位
//E 为使能位
RSBITp2.5
RWBITP2.6
E BITP2.7
ORG 0000H
SJMPSTART
ORG 000BH
LJMPTimer_IT
ORG 0030H
START:
MOVSP,#60H
MOVTMOD,#01H
MOVTH0,#0A6H
MOVTL0,#00H
SETBEA
SETBET0
CLRTR0
MAIN:
MOVP0,#01H //清屏
ACALLENABLE
MOVP0,#38H //显示模式设置为16字*2行
ACALLENABLE
MOVP0,#0CH //不显示光标
ACALLENABLE
MOVP0,#06H //显示方向正向且屏不移动
ACALLENABLE
DISPLAY:
ACALLDISPLAY_C0
//我
MOVP0,#80H
ACALLENABLE
MOVP0,#00H
ACALLWRITE
MOVP0,#81H
ACALLENABLE
MOVP0,#01H
ACALLWRITE
MOVP0,#82H
ACALLENABLE
MOVP0,#02H
ACALLWRITE
MOVP0,#0C0H
ACALLENABLE
MOVP0,#03H
ACALLWRITE
MOVP0,#0C1H
ACALLENABLE
MOVP0,#04H
ACALLWRITE
MOVP0,#0C2H
ACALLENABLE
MOVP0,#05H
ACALLWRITE
LCALLDELAY1S
MOVP0,#01H
ACALLENABLE
ACALLDISPLAY_C1
//们
MOVP0,#83H
ACALLENABLE
MOVP0,#00H
ACALLWRITE
MOVP0,#84H
ACALLENABLE
MOVP0,#01H
ACALLWRITE
MOVP0,#85H
ACALLENABLE
MOVP0,#02H
ACALLWRITE
MOVP0,#0C3H
ACALLENABLE
MOVP0,#03H
ACALLWRITE
MOVP0,#0C4H
ACALLENABLE
MOVP0,#04H
ACALLWRITE
MOVP0,#0C5H
ACALLENABLE
MOVP0,#05H
ACALLWRITE
LCALLDELAY1S
MOVP0,#01H
ACALLENABLE
ACALLDISPLAY_C2
//的
MOVP0,#86H
ACALLENABLE
MOVP0,#00H
ACALLWRITE
MOVP0,#87H
ACALLENABLE
MOVP0,#01H
ACALLWRITE
MOVP0,#88H
ACALLENABLE
MOVP0,#02H
ACALLWRITE
MOVP0,#0C6H
ACALLENABLE
MOVP0,#03H
ACALLWRITE
MOVP0,#0C7H
ACALLENABLE
MOVP0,#04H
ACALLWRITE
MOVP0,#0C8H
ACALLENABLE
MOVP0,#05H
ACALLWRITE
LCALLDELAY1S
MOVP0,#01H
ACALLENABLE
ACALLDISPLAY_C3
//0
MOVP0,#89H
ACALLENABLE
MOVP0,#00H
ACALLWRITE
MOVP0,#8AH
ACALLENABLE
MOVP0,#01H
ACALLWRITE
MOVP0,#0C9H
ACALLENABLE
MOVP0,#02H
ACALLWRITE
MOVP0,#0CAH
ACALLENABLE
MOVP0,#03H
ACALLWRITE
LCALLDELAY1S
MOVP0,#01H
ACALLENABLE
ACALLDISPLAY_C4
//7
MOVP0,#8BH
ACALLENABLE
MOVP0,#00H
ACALLWRITE
MOVP0,#8CH
ACALLENABLE
MOVP0,#01H
ACALLWRITE
MOVP0,#0CBH
ACALLENABLE
MOVP0,#02H
ACALLWRITE
MOVP0,#0CCH
ACALLENABLE
MOVP0,#03H
ACALLWRITE
//3
MOVP0,#8DH
ACALLENABLE
MOVP0,#04H
ACALLWRITE
MOVP0,#8EH
ACALLENABLE
MOVP0,#05H
ACALLWRITE
MOVP0,#0CDH
ACALLENABLE
MOVP0,#06H
ACALLWRITE
MOVP0,#0CEH
ACALLENABLE
MOVP0,#07H
ACALLWRITE
LCALLDELAY1S
MOVP0,#01H
ACALLENABLE
LJMPDISPLAY
DISPLAY_C0:
MOVDPTR,#TAB0
MOVR2,#48
ACALLDISPLAY_C
RET
DISPLAY_C1:
MOVDPTR,#TAB1
MOVR2,#48
ACALLDISPLAY_C
RET
DISPLAY_C2:
MOVDPTR,#TAB2
MOVR2,#48
ACALLDISPLAY_C
RET
DISPLAY_C3:
MOVDPTR,#TAB3
MOVR2,#32
ACALLDISPLAY_C
RET
DISPLAY_C4:
MOVDPTR,#TAB4
MOVR2,#64
ACALLDISPLAY_C
RET
DISPLAY_C:
MOVP0,#40H
ACALLENABLE
MOVR3,#0
DISPLAY_CC:
MOVA,R3
MOVCA,@A+DPTR
MOVP0,A
LCALLWRITE
INCR3
DJNZR2,DISPLAY_CC
RET
ENABLE:
CLRRS
CLRRW
CLRE
ACALLDELAY
SETBE
RET
WRITE:
SETBRS
CLRRW
CLRE
ACALLDELAY
SETBE
RET
DELAY1S:
SETBTR0
CJNER0,#20,DELAY1S
CLRTR0
MOVR0,#0
RET
DELAY:
MOVR5,#08H
L1:
MOVR4,#0FAH
L0:
DJNZR4,L0
DJNZR5,L1
RET
Timer_IT:
MOVTH0,#0A6H
MOVTL0,#00H
INCR0
RETI
TAB0:
//我
DB0x00,0x07,0x01,0x01,0x01,0x1F,0x01,0x01
DB0x19,0x01,0x01,0x01,0x01,0x1F,0x01,0x01
DB0x00,0x08,0x04,0x04,0x00,0x1F,0x00,0x04
DB0x01,0x07,0x19,0x01,0x01,0x01,0x05,0x02
DB0x18,0x00,0x00,0x01,0x06,0x00,0x00,0x00
DB0x14,0x18,0x10,0x08,0x09,0x05,0x03,0x01
TAB1:
//们
DB0x01,0x01,0x02,0x02,0x06,0x04,0x0c,0x14
DB0x08,0x04,0x06,0x04,0x10,0x10,0x10,0x10
DB0x00,0x00,0x1e,0x02,0x02,0x02,0x02,0x02
DB0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00
DB0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00
DB0x02,0x02,0x02,0x02,0x02,0x0a,0x04,0x00
TAB2:
//的
DB0x02,0x02,0x04,0x0f,0x08,0x08,0x08,0x0f
DB0x02,0x02,0x02,0x13,0x14,0x14,0x18,0x12
DB0x00,0x00,0x00,0x1e,0x02,0x02,0x02,0x02
DB0x08,0x08,0x08,0x08,0x0f,0x08,0x08,0x00
DB0x11,0x11,0x10,0x10,0x10,0x10,0x00,0x00
DB0x02,0x12,0x12,0x02,0x02,0x14,0x08,0x00
TAB3:
//0
DB0x00,0x00,0x03,0x04,0x08,0x08,0x08,0x08
DB0x00,0x00,0x18,0x04,0x02,0x02,0x02,0X02
DB0x08,0x08,0x08,0x08,0x04,0x03,0x00,0x00
DB0x02,0x02,0x02,0x02,0x04,0x18,0x00,0x00
TAB4:
//7
DB0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00
DB0x00,0x00,0x1E,0x1E,0x06,0x06,0x06,0X06
DB0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
DB0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00
//3
DB0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x0F
DB0x00,0x00,0x1E,0x1E,0x06,0x06,0x06,0X1E
DB0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00
DB0x1E,0x06,0x06,0x06,0x1E,0x1E,0x00,0x00
END
四、总结:
虽然LCD1602可以利用自建字符显示中文,但最多不能超过8个字符位。
所以实际应用中,无法同时显示“我们的073”。
该段程序没来得及优化,没有充分利用单片机做重复的事情的优点;并且使代码量增大,可读较差(重复的,看起来头晕);注释少也致使可读性差!