相信高手都知道1602液晶能自定义显示文字图像 但我还是自己总结了一下网上的资料和自己的一些体会 希望给初学者一点帮助,LCD1602是通过先定义LCD1602的CGRAM中的内容,然后就可以同调用DDRAM字符一样来调用自定义好的CGRAM中的字符了
定义一行的内容,分两步:
1.设定行地址(CGRAM地址)命令:一般为40H
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 1 DATA
其中:DB5DB4DB3为字符号,也就是将来要显示该字符时要用到的字符地址,DB2DB1DB0为行号。
2.设定CGRAM数据(内容)指令码如下:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 0 字模数据
取模:我们要把所要编写的字符对应于5X8点阵的“字模”提取出来,我们可以通过相关的软件来提取,也可以手工提取。其实就是将点阵的某一行中有显示的点用1表示,无显示的点用0表示,以此形成该行对应的字模数据。设定CGRAM的内容,要一行一行的设定,每一行对应一个CGRAM,5X8点阵,每行5点,共8行,因此要将8行的字模数据都写入CGRAM。细心的朋友可能已经发现:要形成16进制数应该是8位,而每行5位还需要3位啊!?对!的确需要高3位,但是那3位可以是任意的数据,例如我要取“日”字的字模,高3位为000那么相应的字模为 DB 00H 1FH 11H 11H 1FH 11H 11H 1FH如果高3位为111则相应的字模加0E0H为0E0H 0FFH 0F1H 0F1H 0FFH 0F1H 0F1H 0FFH 这两个字模的显示效果是一样的。
1.1602显示时时直接从RAM中取数据显示,即使外部不刷新数据或断开RS RW EN P0口它也能显示
2.如果显示的是CGRAM中的数据,例如现在显示的是地址00H处的数据,这是利用单片机修改CGRAM中的数据,那么不管你以后是否刷新显示,则相应显示00H处的数据自动变为修改后的数据。
以下是我自己用汇编写的测试程序以通过测试 有不足之处欢迎大家共同交流
;@@@@@@@@@@@@@@@LCD1602自定义显示数据测试@@@@@@@@@@@@@@@@@@
;#####################硬件电路#########################
;STC12C5A16S2单片机 LCD1602
;DB0~DB7接P0口 RS接P1.5 RW接P1.6 EN接P1.7
;
;######################################################
;
ORG 0000H ;程序执行开始地址
LJMP MAIN ;跳至MAIN执行
RS EQU P1.5
RW EQU P1.6
LCDEN EQU P1.7
MAIN:
LCALL INIT
MOV A,#40H ;向CGRAM写数据命令
LCALL WRITE_LCD_COM
MOV R1,#64 ;设置循环写次数
MOV R0,#00H
LOOP1: MOV DPTR,#TABLE ;查表写入CGRAM数据
MOV A,R0
MOVC A,@A+DPTR
LCALL WRITE_LCD_DATE
INC R0
DJNZ R1,LOOP1
START:
MOV A,#0c0H ;设置第二行显示
LCALL WRITE_LCD_COM
MOV A,#0 ;调用CGRAM中0位置的数据显示
LCALL WRITE_LCD_DATE
MOV A,#1
LCALL WRITE_LCD_DATE
MOV A,#2
LCALL WRITE_LCD_DATE
MOV A,#3
LCALL WRITE_LCD_DATE
MOV A,#4
LCALL WRITE_LCD_DATE
MOV A,#5
LCALL WRITE_LCD_DATE
MOV A,#6
LCALL WRITE_LCD_DATE
MOV A,#7
LCALL WRITE_LCD_DATE
AJMP START
TABLE:
DB 000H 000H 000H 01FH 000H 000H 000H 000H;"二",
DB 000H 000H 00EH 000H 000H 01FH 000H 000H;"三",
DB 01FH 000H 00EH 000H 000H 01FH 000H 000H;"4",
DB 004H 014H 014H 014H 01FH 004H 004H 004H;"5",
DB 000H 01EH 010H 010H 01EH 002H 002H 01EH;"6",
DB 000H 01EH 010H 010H 01EH 012H 012H 01EH;"7",
DB 000H 01EH 002H 002H 002H 002H 002H 002H;"8",
DB 000H 01FH 011H 011H 01FH 011H 011H 01FH;"日",
AJMP START
;************初始化函数 ****************************
INIT:
;液晶1602初始化
CLR RW
CLR LCDEN
MOV A,#38H ;设置16*2显示5*7点阵8位数据端口
LCALL WRITE_LCD_COM
MOV A,#0CH ;开显示不显示光标
LCALL WRITE_LCD_COM
MOV A,#06H ;当读或写入一个字符后地址指针加1且光标加1 当写入1个字符整屏显示不移动
LCALL WRITE_LCD_COM ;
MOV A,#01H ;显示清屏
LCALL WRITE_LCD_COM
RET
;*********************************************************
;**********液晶写命令函数***************************
WRITE_LCD_COM:
CLR RS ;拉低RS写命令
CLR LCDEN ;拉低使能端准备写命令
MOV P0,A ;送命令
MOV R5,#5 ;延时5毫秒
LCALL DELAY1MS
SETB LCDEN ;拉高使能端写入命令
MOV R5,#5 ;延时5毫秒
LCALL DELAY1MS
CLR LCDEN ;释放使能端口线
RET
;****************************************************
;***********液晶写数据函数**************************
WRITE_LCD_DATE:
SETB RS ;拉高RS写数据
CLR LCDEN ;拉低使能端准备写数据
MOV P0,A ;送数据
MOV R5,#5 ;延时5毫秒
LCALL DELAY1MS
SETB LCDEN ;拉高使能端写入数据
MOV R5,#5 ;延时5毫秒
LCALL DELAY1MS
CLR LCDEN ;释放使能端口线
RET
;****************************************************
;**********延时函数1MS*R5 **************************
DELAY1MS:MOV R6,#66
LCALL DELAY
DJNZ R5,DELAY1MS
RET
;***************************************************
;***********延时函数15us*R6*************************
DELAY:MOV R7,#44
DJNZ R7,$
DJNZ R6,DELAY
RET
;*************************************************** |