韋東山ARM第一期作業(八)LCD
阿新 • • 發佈:2019-01-13
文章目錄
01 - 作業所在路徑
ARM裸機1期加強版\原始碼文件圖片\文件圖片\第017課_LCD
02 - 作業描述
2.1 - 作業1
如果有MINI2440、TQ2440或是帶3.5寸LCD的JZ2440,新增一個lcd_xxx.c檔案,構造lcd_params結構體,體驗結構化程式設計的優點:可以很輕鬆支援其他LCD
2.2 - 作業2
找到漢字型檔點陣,在LCD上顯示漢字這需要你善用百度,找到漢字型檔,也許要閱讀別人的程式碼瞭解漢字型檔點陣的儲存方式。這是一個綜合能力的體現。
03 - 作業解答
3.1 - 作業1解答
如果有MINI2440、TQ2440或是帶3.5寸LCD的JZ2440,新增一個lcd_xxx.c檔案,構造lcd_params結構體,體驗結構化程式設計的優點:可以很輕鬆支援其他LCD
沒有,所以做不了。
3.2 - 作業2解答
找到漢字型檔點陣,在LCD上顯示漢字這需要你善用百度,找到漢字型檔,也許要閱讀別人的程式碼瞭解漢字型檔點陣的儲存方式。這是一個綜合能力的體現。
首先下載一個漢字型檔,小白選擇hzk16,是一個16*16的點陣漢字型檔,二進位制檔案,需要先用燒錄器燒錄到nand的某個地方,小白燒到了0x00180000這裡,當時隨便選的,要選得後一點,不要被前面的程式覆蓋,具體做法參考文章hzk16的使用與介紹
直接貼上完整程式碼
//指定漢字型檔的位置
#define HZK16_ADDR ((volatile unsigned char *)(0x00180000))
void fb_print_hzk16(int x, int y, unsigned char* word, unsigned int color)
{
//漢字型檔的起初地址
volatile unsigned char * addr = HZK16_ADDR;
//一個漢字佔32位資料
unsigned char buffer[32];
//一個漢字的點陣是16*16
unsigned char val[256];
unsigned int offset,i,j,k,len;
/* 獲得32位資料 */
offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32;
addr += offset;
for(i=0; i<32; i++,addr++)
{
buffer[i] = *addr;
printf("0x%x ",buffer[i]);
if(i%15 == 0 && i!=0)
puts("\r\n");
}
puts("\r\n");
/* 解碼 */
len = 0;
for(k=0; k<16; k++)
{
for(j=0; j<2; j++)
{
for(i=0; i<8; i++)
{
val[len++] = buffer[k*2+j]&(0x80 >> i);
if(val[len-1])
printf(".");
else
printf(" ");
}
}
printf("\n\r");
}
/* 根據點陣來設定對應象素的顏色 */
len = 0;
for (j = y; j < y+16; j++)
{
for (i = x; i < x+16; i++)
{
/* 根據點陣的某位決定是否描顏色 */
if (val[len++])
fb_put_pixel(i, j, color);
}
}
}
void fb_print_chinese(int x, int y, unsigned char* word, unsigned int color)
{
int i = 0;
while(word[i])
{
fb_print_hzk16(x,y,&(word[i]),color);
i+=2;
x+=16;
}
}
最後可以直接在mina()函式中呼叫
fb_print_chinese(100,200,"我是中文",0xff12);