⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 digitalphotoframe.c

📁 avr+TFT+SD卡实现数码相框功能
💻 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 + -