作者 : 锦扬科技 来自 www.jydpj.com
如果要用1602的LCM显示"2007年2月28日"如何显示出来呢,1602(KS0066系列)不论是英日文版,欧文,还是其他文的版本都没有这几个字符,当然KS0066没有中文版本,但KS0066留了一个让用户自定义字符的空间,可以让用户自已做一些比较特别的字符,如一些简单的中文,如:
看看前面章节中KS0066的字符表,可发现在最左边的一列全部都是X,共16个,对应的DDRAM显示地址前面4位固定为0000,这就是KS0066给用户自定义的字符放入的空间.
知道了这个空间,我们依然不知如何才能放入,下面一步一步的讲解
1,打开KS0066的IC使用说明书,会有下面的对应表:
将这个对应表用黄蓝绿三个颜色表示出来:
字符码(DDRAM DATA) | CGRAM地址 | 字符样式(CGDAM DATA) | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | B5 | B4 | B3 | B2 | B1 | B0 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | 16进制 | |
第一个自定义字符,对应字符码中的00H | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 08h |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0fh | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 12h | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0fh | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0ah | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1fh | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 02h | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 02h | |
第二个自定义字符,对应字符码中的01H | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0fh |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 09h | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0fh | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 09h | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0fh | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 09h | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0bh | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 11h | |
第三个自定义字符,对应字符码中的02H | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0fh |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 09h | |||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 09h | |||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 09h | |||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0fh | |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 09h | |||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 09h | |||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0fh |
一般我们使用的为8位的单片机,送数据都是以8位为单位,单片机要给KS0066送自定义的数据也是一次性送8位数据的,现1602的LCM为5X8点的字符,有40位数,因此单片机要写入一个自定义的字符必须将这40位数分批送入,如何分呢,KS0066规定:每次送一横排,要显示的部分用1表示,不显示的部分用0表示,可以看出,每一排只有后面的5位数有效,前面的三位数可为0或1,在送入数据的时候,前面的三位可全部用0,如上图所示B7-B5.
可将这每排的8位数转成16进制数,如上图紫色部分.
到这里已知道了如何做成自定义字符的原始代码,如何将这些代码送入KS0066的CGRAM之中呢,前面已有讲过,每次只能送8个Bit,一个"年"字要送8次,如果要自定义完所有的字符(共8个),可以计算出,需要8X8=64次,但CGRAM只有16个空位,显然放不了这64个字节,为了解决这个问题,KS0066定义了一条专门的指令:设置CGRAM地址的指令,共有64个不同的地址,每一个地址放一个字节,配合数据传送指令,可将每一横排上的每个字节准确送入相应的位置,的这条指令如下:
RS | RW | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 | |
---|---|---|---|---|---|---|---|---|---|---|
代码 | 0 | 0 | 0 | 1 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 |
有了上面的指令,如果要一次性定义完8个自定义的字符,我们就可以
1.先设定CGRAM的地址为0(mov a,#01000000B),再调用命令发送程式(call sendc),将命令发送给KS0066,KS0066收到这条指令之后,就知道接下来收到的数据要放到什么地方了
2.将8个自定义的字符按每横排上的数据依次送入KS0066(KS0066的CGRAM地址每收到一个数据后,内部会自动的加1,因此不用每次都去设置CGRAM地址)共64个,举例如下:
mov a,#08h
call sendd;送"年"的第一横排
mov a,#0fh
call sendd;送"年"的第二横排
mov a,#12h
call sendd;送"年"的第三横排
mov a,#0fh
call sendd;送"年"的第四横排
............
依次类推,直到64横排,此时就将8个自定义的字符送入了CGRAM之中,
把自定义的字符送入KS0066,我们送入的目的是为了使用,如何将这些字符显示出来呢,要明白这个问题,首先必须了解这8个字符与上表格中黄色部分字符码(DDRAM DATA)的对应关系,关系如下:
1.KS0066用CGRAM(蓝色部分)的后3位不同的组合(B2,B1,B0,有8种组合)来依次对应每一个字符的8横排,如蓝色部分中的红色字体地址.
2.KS0066用字符码(黄色部分)的后3位不同的组合(B2,B1,B0,有8种组合)来依次对应8个不同的自定义的字符,如蓝色部分中的黄色字体地址.
回顾前在章节,我们知道每一个字符都对应一个字符码,并且是唯一的,如下图,30H对应的就是"0",41H对应的就是"A",打"X"的部分是自定义码的字符码放置位置,可以看到,这16个"X"的高4-Bit为0,与上表中黄色部分B7--B4全为0相吻合,到此,我们已清楚的知道,00H位,就是第一个自定义的字符,01H是第二个,如果要显示出第一个自定义的字符只要将00H作数据送给KS0066就行了,程式如下:
mov a,00h
call sendd
送其他的自定义字符就不用再说了吧,00H--07H放了8个自定义的字符,08H--0FH放的是什么呢,写入如下的程式试一下,看LCD上出现什么字符?(就不给答案了,试一试就知道了)
mov a,08H
call sendd
有关自定义字符码的有关程式如下,在主程式中调用下面的程式即可显示出来,加入自定义字符的完整程式见下一讲,完整的程式
;---------------------------------------------------------
selfcode:;自定义字符写入CGRAM程式
mov r2,#0;
mov dptr,#selftable;
mov a,#40h;40H为设置CGRAM地址的命令
call sendc;
selfcode1:
mov a,r2;
movc a,@a+dptr;
call sendd ;
inc r2;
cjne r2,#64,selfcode1;
ret
;-------------------------------------------------------------------
selfdisp:;显示自定义码
mov a,#0c0h;在第二排开始显示
call sendc
mov a,#00h;显示年
call sendd
mov a,#01h;显示月
call sendd
mov a,#02h;显示日
call sendd
mov a,#03h;显示其他的自定义字符
call sendd
mov a,#04h
call sendd
mov a,#05h
call sendd
mov a,#06h
call sendd
mov a,#07h
call sendd
mov a,#08h
call sendd
mov a,#09h
call sendd
mov a,#0ah
call sendd
mov a,#0bh
call sendd
mov a,#0ch
call sendd
mov a,#0dh
call sendd
mov a,#0eh
call sendd
mov a,#0fh
call sendd
ret
;---------------------------------------------------------------
selftable:;
db 08h,0fh,12h,0fh,0ah,1fh,02h,02h;年
db 0fh,09h,0fh,09h,0fh,09h,0bh,11h;月
db 0fh,09h,09h,09h,0fh,09h,09h,0fh;日
db 1fh,00h,1fh,00h,1fh,00h,1fh,00h;
db 00h,1fh,00h,1fh,00h,1fh,00h,1fh;
db 0ah,15h,0ah,15h,0ah,15h,0ah,15h;
db 15h,0ah,15h,0ah,15h,0ah,15h,0ah;
db 04h,04h,1fh,15h,1fh,04h,04h,00h;
db 04h,1fh,04h,1fh,11h,1fh,00h,00h;
db 1fh,11h,1fh,11h,1fh,00h,00h,00h;
文章评论(0条评论)
登录后参与讨论