用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)。其余和上面相同。
具體運行效果如下:
|