我们以中文宋体字库为例,每一个汉字由16行16列的点阵组成显示。即国标汉字库中的每一个字均由256点阵来表示。我们可以把每一个点理解为一个像素,而把每一个字的字形理解为一幅图像。因而这个汉字屏不仅可以显示汉字,也可以显示在256像素范围内的任何图形字符。
以显示汉字“湖”为例(见图1)来说明其扫描原理:在UCDOS中文宋体字库中,每一个字由16行16列的点阵组成显示。如果用8位的AT89S52单片机控制,由于单片机的总线为8位,一个字需要拆分为2个部分。一般我们把它拆分为左部和右部,左部由8*16点阵组成,右部也由8*16点阵组成,如图2所示。
在本例中单片机首先显示的是左上角的第一行的左半部分,即第一行P0口。方向为p00到p07,显示汉字“湖”时,p01和p06点亮,由右往左排列,即二进制01000010B,转换为16进制为42H。
左半部第一行完成后,继续扫描左半部的第二行,p01和p05点亮,为00100010B,即16进制22H.左半部的第二行。也为00100010B,即16进制22H。继续往下面的扫描。扫描完16行,单片机转向右半部,为了接线的方便,我们仍设计成由右往左扫描,如图2所示,从上图可以看到,这一行全灭,即为00000000B,16进制则为 00H。再往下扫描第二行,p22,p23,p24,p25点亮,为二进制00111100b,即16进制3CH。
依照这个方法。继续扫描完右16行,一共扫描32个8位,可以得出汉字“湖”的扫描代码为:DB 42H 22H 22H 02H 8FH 52H 12H 2FH 28H 28H C8H 48H 4FH 40H 40H41H;DB 00H3CH 24H24H BCH 24H 24H BCH A4H A4H A4H A4H C4H 44H 94H 08H:“湖”
由这个原理可以看出,无论显示何种字体或图像,都可以用这个方法来分析出它的扫描代码从而显示在屏幕上。 不过现在有很多现成的字模生成软件,我们就不必自己去画表格算代码了,如图3所示。
软件打开后输入汉字,点“生成字模”,十六进制数据的汉字代码即可自动生成,把数据复制到我们的程序中即可。
我们把行列总线接在单片机的I/O口,然后把上面分析到的扫描代码送入总线,就可以得到显示的汉字了。见图4,在这个例子里,由于一共用到16行,16列,如果将其全部接入AT89S52单片机,一共使用32条I/O口,这样造成了I/O资源的耗尽,系统也再无扩充的余地。
实际应用中为减少总线数我们采用串行通信,并选择两片74ls273来完成行方向的显示,而列方向16条线则可通过两片移位寄存器74ls164。显示采用逐行扫描方式。单片机从内存中取出第一行需要显示的16字节点阵数据,由列点阵数据输入端P112口按位依次串行输入至列移位寄存器,数据输入的顺序与显示内容顺序相反。
然后将行点阵选通端P1.3置为1,即行移位寄存器的D为高电平,STR使能,(所有74LS164的OE引脚接+5V电平)则列移位寄存器中的数据同时并行输出,从而选通该行。延时一段时间后,再进行下一行点阵数据的显示。需要注意的是,每次只能选通一行数据。通过不断的逐行扫描,实现了数字或提示信息的显示。