原创 显示自定义字符

2007-3-7 13:34 3189 3 3 分类: MCU/ 嵌入式

                                                                                                                                            作者 : 锦扬科技          来自 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)
 B7B6B5B4B3B2B1B0B5B4B3B2B1B0B7B6B5B4B3B2B1B016进制
第一个自定义字符,对应字符码中的00H00000000000000000
0

1

0

0

0

08h
00000000000001000
0

1

1

1

1

0fh
00000000000010000
1

0

0

1

0

12h
00000000000011000
0

1

1

1

1

0fh
00000000000100000
0

1

0

1

0

0ah
00000000000101000
1

1

1

1

1

1fh
00000000000110000
0

0

0

1

0

02h
00000000000111000
0

0

0

1

0

02h
第二个自定义字符,对应字符码中的01H00000001001000000
0

1

1

1

1

0fh
00000001001001000
0

1

0

0

1

09h
00000001001010000
0

1

1

1

1

0fh
00000001001011000
0

1

0

0

1

09h
00000001001100000
0

1

1

1

1

0fh
00000001001101000
0

1

0

0

1

09h
00000001001110000
0

1

0

1

1

0bh
00000001001111000
1

0

0

0

1

11h
第三个自定义字符,对应字符码中的02H00000010010000000
0

1

1

1

1
0fh
00000010010001000
0

1



1
09h
00000010010010000
0

1



1
09h
00000010010011000
0

1



1
09h
00000010010100000
0

1

1

1

1
0fh
00000010010101000
0

1



1
09h
00000010010110000
0

1



1
09h
00000010010111000
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条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条