一、項目介紹
項目是基于STM32設計的數碼相冊,能夠通過LCD顯示屏解碼顯示主流的圖片,支持bmp、jpg、gif等格式。用戶可以通過按鍵或者觸摸屏來切換圖片,同時還可以旋轉顯示,并能夠自適應居中顯示,小尺寸圖片居中顯示,大尺寸圖片自動縮小顯示(超出屏幕范圍)。圖片從SD卡中獲取。
二、設計思路
2.1 硬件設計
本項目所需的主要硬件:
- STM32F103ZET6
- LCD屏幕
- SD卡模塊
- 按鍵和觸摸屏
2.2 軟件設計
(1)解碼圖片
在STM32芯片中,解碼圖片需要將讀取到的數據存入圖形緩沖區中,以便進行圖畫顯示。常用的解碼算法有JPEG解碼和BMP解碼。
(2)圖片顯示
為了更好的實現圖片旋轉和縮放功能,在顯示圖片時需對其進行矩陣運算。通過左右翻轉和上下翻轉,可實現圖片的旋轉功能。通過計算圖片與顯示屏幕之間的比例關系并進行縮放,實現自適應居中和圖片的縮放功能。
(3)SD卡
SD卡模塊可通過SPI接口與STM32芯片進行通信,讀取SD卡中的圖片數據,實現對圖片的加載和顯示。
(4)按鍵和觸摸屏
在使用過程中,用戶可以通過按鍵和觸摸屏對圖片進行切換、旋轉和縮放等操作。通過設置中斷處理函數,響應用戶的操作并及時更新顯示屏幕上的圖片。
2.3 圖片播放流程圖
2.4 顯示效果
三、代碼設計
3.1 主函數
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include < string.h >
#include < stdio.h >
#include "sd.h" //SD卡
#include "ff.h" //文件系統
#include "bmp.h" //文件系統
#include "iic.h"
#include "at24c02.h"
#include "xpt2046.h"
#include "lcd.h"
?
?
FATFS fs; // 用戶定義的文件系統結構體
int main()
{
DIR dir_dp;
FILINFO file_info;
u32 sd_size; //存放SD卡返回的容量
BeepInit(); //蜂鳴器初始化
LedInit(); //LED燈初始化
UsartInit(USART1,72,115200);
KeyInit(); //按鍵初始化
IICInit();
LcdInit();
TOUCH_Init();
//TOUCH_ADJUST(); //觸摸屏校準
printf("串口工作正常!\\r\\n");
if(SDCardDeviceInit())
{
printf("SD卡初始化失敗!\\r\\n");
}
sd_size=GetSDCardSectorCount(); //檢測SD卡大小,返回值右移11位得到以M為單位的容量
printf("SD卡Sizeof:%d\\r\\n",sd_size >>11);
f_mount(&fs,"0:",1); // 注冊文件系統工作區,驅動器號 0,初始化后其他函數可使用里面的參數
LcdClear(0xFFFF);
//f_mkdir("0:/目錄創建測試!"); //測試OK
//f_unlink("0:/123"); //刪除目錄,注意只能刪除空目錄
//f_unlink("0:/1.bmp");//刪除文件
//printf("%d\\r\\n",Show_BMP("1.bmp"));
if(f_opendir(&dir_dp,"0:/bmp")!=FR_OK)printf("目錄打開失敗!\\r\\n");
//循環讀取目錄
while(f_readdir(&dir_dp,&file_info)==FR_OK)
{
if(file_info.fname[0]==0)break; //判斷目錄跳出條件,表示目錄已經讀取完畢
if(strstr(file_info.fname,".bmp")) //過濾目錄
{
printf("文件名稱: %s,文件大小: %ld 字節\\r\\n",file_info.fname,file_info.fsize);
}else printf("文件名稱: %s,文件大小: %ld 字節\\r\\n",file_info.fname,file_info.fsize);
}
if(f_closedir(&dir_dp)!=FR_OK)printf("目錄關閉失敗!\\r\\n");
while(1)
{
LED1=!LED1;
DelayMs(100);
}
}
?