用16 x16的LED点阵显示汉字或图片时,有时需要用到特定的软件来处理。但是对于简单的图像,可以使用手绘方式绘图,然后根据需求,将图像转换为C语言的数组,粘贴在C程序中使用。此时用Excel可以快速实现。以下是实现的效果。
以16*16点阵的汉字为例,基本制作过程如下:
1. 在Excel中,框出一个16*16的区域,如上图所示,标示行号和列号。在绘图区,设置条件格式:如果单元格的数值等于1,则显示为粉色底色的数字。这样,当填入数字1时,就能够突出看到填入的效果。
2. 在标示出的区域内,用描点的方式绘制所需图形。需要显示数据的地方填入1,其余地方保持空白。
3. 因为我所使用的点阵是16行 x 16列的,是以逐列的方式进行扫描的。因此取数据时,从每一列的第16行起,逐步取数。但因为使用的是串行发送方式,因此需要将每一列分为2个字节,先是下半部分为一个字节,然后再上半部分为另一个字节。同样,作为串行显示方式,最先进入显示阵列的数据是图像的最右边一列(Q列)的右下角的半列(Q17:Q10),然后是右上角的半列(Q9:Q2),然后是向左边面逐列显示(Q->P->O.....-->C-->B这样的顺序)。以这样的顺序送数据到对应列的数据寄存器,就可以正确显示所要的图像。
下面是十六进制数据的形成过程:
1. 每列中,上半列的字节计算公式为:=DEC2HEX(B9*128+B8*64+B7*32+B6*16+B5*8+B4*4+B3*2+B2)。其中DEC2HEX是将十进制数转换为16进制方式的字符串格式的函数。里面B9*128+B8*64+B7*32+B6*16+B5*8+B4*4+B3*2+B2则是将图像数据转换为字节数,最底下一行对应的数值是128(2的7次方),然后依次对应64,32,。。。,1等。把这个计算的结果,显示在每一列图像的下方。这个可以在把第一列的公式填写完成后,通过拖动的方式将全部16列填满即可。
对应于下半列,相应公式为=DEC2HEX(B16*128+B15*64+B14*32+B13*16+B12*8+B11*4+B10*2+B9)。
2. 将16进制字符串显示格式标准化。因为结果要用在C语言中,因此需要将默认的格式转换为C语言的默认格式 0xNN的形式。如果不要求美观,可以直接在上面显示的结果前面加 “0x”即可。为了美观,则需要判断上面的结果是1位长度还是2位长度。对于1位长度,则在其前面增加“0x0”,否则只增加"0x"即可。对应于每个单元格,其公式为:=IF(LEN(B18)=1,"0x0"&B18,"0x"&B18)。其中IF为条件语句,条件为LEN(B18) = 1, 如果条件成立,则增加"0x0" (0x0 & B18),否则只是增加"0x" (0x & B18)。
对于其他行列,拖动即可获取所有字节的C语言标准化16进制字符串。
3. 将整个数据合成为一个C语言语句,可以通过复制粘贴的形式,粘贴到C语言源程序中。 根据前面一部分第3点说明的字节顺序,可以逆序的方式,将上面的32个字节合并成一个C语言数组定义语句。不过这里面没有复杂的技巧,只是很繁琐的重复工作。做法如下:
="unsigned char code HANZI[] = {" &CHAR(10) & CHAR(13) &
Q21&","&Q20&","&P21&","&P20&","&O21&","&O20&","&N21&","&N20&","&CHAR(10)&CHAR(13)
&M21&","&M20&","&L21&","&L20&","&K21&","&K20&","&J21&","&J20&","&CHAR(10)&CHAR(13)
&I21&","&I20&","&H21&","&H20&","&G21&","&G20&","&F21&","&F20&","&CHAR(10)&CHAR(13)
&E21&","&E20&","&D21&","&D20&","&C21&","&C20&","&B21&","&B20&"," & CHAR(10) & CHAR(13)
& "};"
以上的汉字点阵在Proteus中仿真电路如下。其中MCU为AT89C52, 串口芯片为74HC595,行列各2片串联。左边两片提供列扫描地址,后面两片提供行显示数据。显示点阵为4个8*8点阵(Proteus中光电元件MATRIX-8X8-RED将所有管脚移动到同一侧后形成的新元件,便于组成并列点阵)组成的一个16*16点阵(上面2个正放,下面2个X轴对称倒放)。因此在显示字节计算时,公式略有不同。具体公式为:=DEC2HEX(B11*128+B12*64+B13*32+B14*16+B15*8+B16*4+B17*2+B18)。其余和上面相同。
具体运行效果如下:
|