📄 digitalphotoframe.c
字号:
/******************************************************************
*Project :ATmega128 + tft320x240 + SD card + USART
*Author :Andy Zhu ---Digital Photo Frame(数码相框)
*Date :10.1-2008
*Other : None
******************************************************************/
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdint.h>
//#include<stdio.h>
#include "sd.h"
#include "spi.h"
#include "tft.h"
#include "touch.h"
#include "usart.h"
#include "fat.h"
#define TRUE 1
#define FALSE 0
void DisplayPhoto320x240(uint32_t FhotoFirstCluster);
uint8_t Reg_Buf[512];
//uint8_t FAT_Buf[512];
extern CID_Reg SD_CID_infor;
extern CSD_Reg SD_CSD_infor;
extern OCR_Reg SD_OCR_infor;
extern SCR_Reg SD_SCR_infor;
extern BPB_STR FAT32_BPB_infor;
extern DIR_SHORT_STR FAT32_DIR_infor;
extern VOLUME_INFO_TYPE SD_CAPACITY_infor;
int8_t VolumeName[9];
uint8_t File_read_complete; //文件读完标志
unsigned char DIR_Buffer[32];
extern uint32_t FirstSecNum; //逻辑扇区0
extern uint32_t FirstRootDirSecNum; //根目录决定扇区数
uint32_t FileSec; //文件所在决定物理扇区号
uint32_t FAT_offset_sec; //相当于FAT1的偏移扇区数
uint32_t FAT_infor; //FAT簇链的内容
uint32_t FAT_infor_next; //下一个FAT项的内容
uint16_t FAT_offset_bytes; //FAT项在一个扇区中的偏移量
uint16_t File_Spare_bytes; //最后一个簇里剩余的字节数
uint32_t TFT_count; //液晶整幅图片占用字节数153600
uint16_t Color_data; //液晶16bit的数据
//=================================
int main(void)
{
unsigned char STATE = 0;
//uint16_t i;
//uint8_t j;
//uint32_t temp;
DDRB |= (1<<RS)|(1<<CS)|(1<<MOSI)|(1<<SCK)|(1<<RES); //OUTPUT MODE
SPI_init();
Clr_RES();
DelayNS(200);
Set_RES();
lcd_init();
USART_init();
DispOneColor(BLUE);
//------------------------------------------
DelayNS(300);
send_command(0x22);
DrawString(70,0, "ATMEL AVR", RED, BLUE, NORMAL);
DrawString(0,16, "Mega128<==>TFT320x240 Demo", RED, BLUE, NORMAL);
while(1)
{
asm("nop");
send_command(0x22);
DrawString(0,48, "SD card testing!", YELLOW, BLUE, NORMAL);
DrawString(0,64, "Initialize SD card...", YELLOW, BLUE, NORMAL);
SD_Init();
STATE = SD_Reset();
if (STATE == 0)
{
DrawString(0,80, "SD card Init succeed!", GREEN, BLUE, NORMAL);
}
else
{
DrawString(0,80, "SD card is ERROR!", GREEN, BLUE, NORMAL);
}
STATE = Read_SD_Reg(Reg_Buf,SD_SEND_CID,16);
if (STATE == 0)
{
DrawString(0,96, "CID Register read succeed!", GREEN, BLUE, NORMAL);
Get_SD_card_CID_Infor(Reg_Buf);
}
else
{
DrawString(0,96, "CID Register read ERROR!", GREEN, BLUE, NORMAL);
}
asm("nop");
STATE = Read_SD_Reg(Reg_Buf,SD_SEND_CSD,16);
if (STATE == 0)
{
DrawString(0,112, "CSD Register read succeed!", GREEN, BLUE, NORMAL);
Get_SD_card_CSD_Infor(Reg_Buf);
}
else
{
DrawString(0,112, "CSD Register read ERROR!", GREEN, BLUE, NORMAL);
}
asm("nop");
STATE = Read_SD_Reg(Reg_Buf,SD_READ_OCR,4);
if (STATE == 0)
{
DrawString(0,128, "OCR Register read succeed!", GREEN, BLUE, NORMAL);
Get_SD_card_OCR_Infor(Reg_Buf);
}
else
{
DrawString(0,128, "OCR Register read ERROR!", GREEN, BLUE, NORMAL);
}
asm("nop");
asm("nop");
STATE = Read_SD_Reg(Reg_Buf,SD_APP_CMD,0);
STATE = Read_SD_Reg(Reg_Buf,SD_SEND_SCR_APP,8);
if (STATE == 0)
{
DrawString(0,144, "SCR Register read succeed!", GREEN, BLUE, NORMAL);
Get_SD_card_SCR_Infor(Reg_Buf);
}
else
{
DrawString(0,144, "SCR Register read ERROR!", GREEN, BLUE, NORMAL);
}
asm("nop");
Get_SD_card_Volume_Infor();
DrawString(0,160, "SD Capacity is: MB", GREEN, BLUE, NORMAL);
DispNum(120,160, SD_CAPACITY_infor.size_MB);
//--------------------------------------------------
Get_FAT_BPB_Infor();//---读取启动扇区(DBR)中BPB的相关信息
//====================计算根目录的绝对扇区号======================================
FirstRootDirSecNum = Calculate_FirstRootDirSecNum();
while (1)
{
//-----------读取SD卡中的BINt图片信息,并用液晶显示--------
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\IMAGES\\STM32.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\IMAGES\\CAR_1.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\IMAGES\\GIRL_3.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\IMAGES\\PIC3.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\IMAGES\\NEW\\BIRD.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\CORTEX.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\PIC1.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\PIC2.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\GIRL_1.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\GIRL_2.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\BIRD.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\BUG.BIN"));
DelayNS(1000); //延时1000mS
DisplayPhoto320x240(FAT_Get_File_FirCluNum("\\OURAVR.BIN"));
DelayNS(1000); //延时1000mS
//-------------------------------------------------
}
}
}
//-----------------------------------------------------------
void DisplayPhoto320x240(uint32_t FhotoFirstCluster)
{
uint8_t j;
uint16_t i;
uint8_t Photo_FAT_buf[512];
File_read_complete = FALSE;
TFT_count = 0;
write_com(0x0021,0); //行首址0
write_com(0x0020,0); //列首址0
send_command(0x22);
do
{
//查找FAT1项中的相关簇链数据
FAT_offset_sec = FhotoFirstCluster >> 7;
FAT_offset_bytes = (uint16_t)(FhotoFirstCluster << 2) % 512;
SD_ReadSingleBlock((FirstSecNum + FAT_offset_sec + FAT32_BPB_infor.BPB_ResSec),Photo_FAT_buf); //读FAT文件
FAT_infor_next = Photo_FAT_buf[FAT_offset_bytes + 3];
FAT_infor_next <<= 8;
FAT_infor_next |= Photo_FAT_buf[FAT_offset_bytes + 2];
FAT_infor_next <<= 8;
FAT_infor_next |= Photo_FAT_buf[FAT_offset_bytes + 1];
FAT_infor_next <<= 8;
FAT_infor_next |= Photo_FAT_buf[FAT_offset_bytes]; //已经读到文件所在的下一个簇的簇号或其他信息
if (FAT_infor_next == 0x0fffffFf) //是文件的最后一簇
{
FileSec = (FhotoFirstCluster - 2)*FAT32_BPB_infor.BPB_SecPerClus + FirstRootDirSecNum;
//计算最后一簇中剩余的字节数
File_Spare_bytes = FAT32_DIR_infor.DIR_FileSize % (FAT32_BPB_infor.BPB_BytesPerSec*FAT32_BPB_infor.BPB_SecPerClus);
for (j=0; j<FAT32_BPB_infor.BPB_SecPerClus; j++)
{
SD_ReadSingleBlock(FileSec + j,Reg_Buf); //读文件
if (File_Spare_bytes == 0)
{
for(i=0; i<512; i+=2,TFT_count+=2) //
{
Color_data = Reg_Buf[i+1];
Color_data <<= 8;
Color_data |= Reg_Buf[i];
send_data(Color_data);
}
}
}
File_read_complete = TRUE;
}
else
{
FileSec = (FhotoFirstCluster - 2)*FAT32_BPB_infor.BPB_SecPerClus + FirstRootDirSecNum;
for (j=0; j<FAT32_BPB_infor.BPB_SecPerClus; j++)
{
SD_ReadSingleBlock(FileSec + j,Reg_Buf); //读文件
for(i=0; i<512; i+=2,TFT_count+=2) //
{
Color_data = Reg_Buf[i+1];
Color_data <<= 8;
Color_data |= Reg_Buf[i];
send_data(Color_data);
}
}
FhotoFirstCluster = FAT_infor_next;
}
}while(File_read_complete == FALSE);
}
//-----------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -