文章目錄
- 步驟1 尋找或製作240x320的圖片
- 步驟2 使用Image2Lcd將圖片轉換為bin檔案
- 步驟3 使用WinHex尋找存放1.bin和2.bin的起始扇區及扇區內容
實在很抱歉,時間緊張,我只講怎樣從SD卡內讀取bin檔案(二進位檔案),然後現在TFT-LCD上。
準備工具
1. Image2Lcd.zip
操作步驟 步驟1 尋找或製作240x320的圖片
簡單起見,我在Google圖片裡搜尋240x320手機壁紙。隨便選2張作為樣本。
步驟2 使用Image2Lcd將圖片轉換為bin檔案
我們先算一下,每個像素需要高8位+低8位,即16位元據,也就是2Byte;那麼一張圖片的話,就是240*320*2=15, 3600 Byte = 150 KB。
使用Image2Lcd依次開啟圖片,勾上如下所示的選項,儲存為bin檔案。
將產生的2個bin檔案,拷貝到SD內的任意目錄,比方說pic目錄下。
步驟3 使用WinHex尋找存放1.bin和2.bin的起始扇區及扇區內容
現在還不涉及檔案系統,雖然我的sd卡被格式化為fat32。需要檔案系統的朋友,請自行研究。
如何使用WinHex,我在前面的SD卡驅動一節有講。在查看之前,我們先計算一下。1.bin是150KB,而每個扇區僅能儲存512B,那麼1.bin需要連續儲存300個扇區。2.bin緊隨1.bin之後,其儲存的起始扇區地址應該滯後1.bin的起始扇區地址300個位移量。但是我們發現 ,兩者相距的扇區地址位移量為304,那就意味著多出來4個扇區地址位移量。我在這裡提出這個問題,無意想解答為什麼多了4個,而是想說明這個多出來扇區地址位移量在FAT16和FAT32的檔案系統中是不一樣的。大家在做這個實驗之前最好計算一下。
有了這個資訊這後,我們就可以從1.bin的扇區起始地址連續讀取300個扇區的資料,並同時將這些資料打到屏上,這就實現了顯示SD內的資料的目的。當1.bin顯示完畢,我們只需讀扇區的起始地址遞增304即可。
步驟4 測試
代碼4.1 main.c
#include <stdio.h> // printf()#include <unistd.h> // usleep()#include "my_types.h" // 資料類型#include "debug.h" // debug#include "sd_card.h" // sd_card#include "ili932x.h" // ili9325#define ENABLE_APP_DEBUG // turn on debug message#ifdef ENABLE_APP_DEBUG #define APP_DEBUG(x) DEBUG(x)#else #define APP_DEBUG(x)#endif#define PIC_NUM 2 // 圖片數量#define START_SECTOR 7816 // 資料存放區的起始扇區void DispPic_Demo(void){ u16 i, j; u8 pic_num=0; // 照片數量 u8 sector_buf[512]; u32 sector_addr; sector_addr=START_SECTOR; do { ili_nCS=0; DB_o_EN; ili_SetDispArea(0, 0, 240, 320, 0, 0); for(j=0;j<300;j++) //300表示一幅圖片含有300x512位元組的資訊 { SD_CARD_Read_Data_LBA(sector_addr+j, 512, sector_buf);//每次讀出512位元組放到緩衝區 for(i=0;i<256;i++) //然後寫到液晶屏,可以顯示256個像素,每個像素16位即2個位元組 ili_WrData(sector_buf[2*i+1],sector_buf[2*i]); } ili_nCS=1; sector_addr += 304; pic_num++; usleep(2*1000*1000); // 延時2s }while(pic_num < PIC_NUM);}int main(){ ili_Initial(); // 初始化ILI9325 while(SD_CARD_Init() != 0x55);// 初始化SD卡 while(1) { DispPic_Demo(); } return 0;}
在編譯和運行之前,把sd_card.h裡面的調試宏注釋掉,以減少因列印資訊而注釋程式。
代碼4.2 sd_card.h片段
//#define ENABLE_SD_CARD_DEBUG // turn on debug message
同樣的道理,若其他模組也有調試開關宏,最好也關斷。當然這樣,比較麻煩。我們可以再debug.h裡面統一關閉調試宏開關也行。
代碼4.3 debug.h片段
//#define ENABLE_STDOUT_DEBUG // turn on all of debug message using standard in/out
測試效果如下:
源碼下載
lcd_at_nios_nii_part.zip
目錄
1 [原創][連載].基於SOPC的簡易數位相框 - Quartus II部分(硬體部分)
2 [原創][連載].基於SOPC的簡易數位相框 - Nios II SBTE部分(軟體部分)- 配置工作
3 [原創][連載].基於SOPC的簡易數位相框 - Nios II SBTE部分(軟體部分)- SD卡(SPI模式)驅動
4 [原創][連載].基於SOPC的簡易數位相框 - Nios II SBTE部分(軟體部分)- TFT-LCD(控制器為ILI9325)驅動
5 [原創][連載].基於SOPC的簡易數位相框 - Nios II SBTE部分(軟體部分)- 從SD卡內讀取圖片檔案,然後顯示在TFT-LCD上
6 [原創][連載].基於SOPC的簡易數位相框 - Nios II SBTE部分(軟體部分)- 最佳化工作
7 [原創][連載].基於SOPC的簡易數位相框 - Nios II SBTE部分(軟體部分)- ADS7843觸控螢幕驅動測試