1. 程式人生 > >韋東山ARM第一期作業(八)LCD

韋東山ARM第一期作業(八)LCD

文章目錄


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);