[原創][連載].基於SOPC的簡易數位相框 – Nios II SBTE部分(軟體部分) – 從SD卡內讀取圖片檔案,然後顯示在TFT-LCD上

來源:互聯網
上載者:User
文章目錄
  • 步驟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觸控螢幕驅動測試

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.