![](http://uphotos.eepw.com.cn/liklon/pics/770376a5e78913fee5181dc406a41232.jpg)
歌曲列表
![](http://uphotos.eepw.com.cn/liklon/pics/4e056e2934300ee3efe2b93bbff37160.jpg)
小说模式
![](http://uphotos.eepw.com.cn/liklon/pics/fe28698dc9b5f1655541a871257452ae.jpg)
播放界面
uint8 SDWriteSector(uint32 Addr,uint8 *pBuffer) //SD卡写扇区函数
{
uint8 pCmd[] = {0x58,0x00,0x00,0x00,0x00,0xff};
uint8 Count = 0;
uint8 Temp = 0;
uint16 i;
Addr <<= 9;
pCmd[1] = ((Addr & 0xff000000) >> 24);
pCmd[2] = ((Addr & 0x00ff0000) >> 16);
pCmd[3] = ((Addr & 0x0000ff00) >> 8);
do
{
Temp = SDWriteCommand(pCmd);
Count++;
if(Count >= DISPLAY_COUNT)
{
SDSetCS();
return 1;
}
}while(Temp != 0);
for(i = 0;i < 100;i++)
{
SpiReadByte();
}
SDClrCS();
SpiWriteByte(0xfe); //start
for(i = 0;i < 512;i++)
{
SpiWriteByte(pBuffer[i]);
}
SpiWriteByte(0xff);
SpiWriteByte(0xff); //CRC
Temp = SpiReadByte();
if((Temp & 0x1f) != 0x05)
{
SDSetCS();
return WRITE_BLOCK_ERROR;
}
while(SpiReadByte() != 0xff);
SDSetCS();
SpiReadByte();
return 0;
}
uint8 SDReadSector(uint32 Addr,uint8 *pBuffer) //SD卡读扇区函数
{
uint8 pCmd[] = {0x51,0x00,0x00,0x00,0x00,0xff};
uint8 Count = 0;
uint8 Temp = 0;
uint16 i;
Addr <<= 9;
pCmd[1] = ((Addr & 0xff000000) >> 24);
pCmd[2] = ((Addr & 0x00ff0000) >> 16);
pCmd[3] = ((Addr & 0x0000ff00) >> 8);
SDClrCS();
do
{
Temp = SDWriteCommand(pCmd);
Count++;
if(Count >= DISPLAY_COUNT)
{
SDSetCS();
return 1;
}
}while(Temp != 0);
while(SpiReadByte() != 0xfe);
for(i = 0;i < 512;i++)
{
pBuffer[i] = SpiReadByte();
}
SpiReadByte();
SpiReadByte();
SDSetCS();
SpiReadByte();
return 0;
}
有了上面的函数可以与znFAT挂接
void TFTWriteData(uint8 DH,uint8 DL)
{
TFTClrCS();
TFTSetRS();
DB_Prot_Data = DH;
TFTClrWR();
TFTSetWR();
DB_Prot_Data = DL;
TFTClrWR();
TFTSetWR();
TFTSetCS();
}
void TFTWriteCommand(uint8 DH,uint8 DL)
{
TFTClrCS();
TFTClrRS();
DB_Prot_Data = DH;
TFTClrWR();
TFTSetWR();
DB_Prot_Data = DL;
TFTClrWR();
TFTSetWR();
TFTSetCS();
}
void TFTWriteCmdData(uint8 Cmd,uint16 Dat)
{
uint8 m,n;
m = Dat >> 8;
n = Dat;
TFTWriteCommand(0x00,Cmd);
TFTWriteData(m,n);
}
void TFTWrite16bData(uint16 Dat)
{
uint8 m,n;
m = Dat >> 8;
n = Dat;
TFTWriteData(m,n);
}
void TFTInit() //////////初始化
{
TFTSetCS();
TFTClrRST();
TFTSetRST();
TFTSetTouchCS();
TFTSetTouchCLK();
TFTSetTouchDIN();
TFTSetTouchCLK();
TFTWriteCmdData(0x00e5, 0x8000);
TFTWriteCmdData(0x0000, 0x0001);
TFTWriteCmdData(0x0001, 0x0100);//输出方式控制0x00,0x100,0x400,0x500,正常显示用0x00
TFTWriteCmdData(0x0002, 0x0700);//可设置为0x400或0x700;
TFTWriteCmdData(0x0003, 0x1010);//可设置为0x1030,0x1000,0x1010,0x1020,0x1038,0x1028,0x1018,0x1008;
//还可以把最前面的1去掉,如:0x18;
//BGR = " 0 ":遵循gb顺序来写的像素数据【即去掉那个1】
//BGR = " 1 ":将RGB数据换成BGR数据再写入GRAM【即不去掉那个1】
//横向设置0x1018最好/纵向设置0x1000最好
TFTWriteCmdData(0x0004, 0x0000);//显示大小尺寸控制寄存器0x00为1倍大小,即240x320
TFTWriteCmdData(0x0008, 0x0202);//可设置为0x0202,0x00,
TFTWriteCmdData(0x0009, 0x0000);//扫描设置
TFTWriteCmdData(0x000A, 0x0000);
TFTWriteCmdData(0x000C, 0x0000);
TFTWriteCmdData(0x000D, 0x0000);
TFTWriteCmdData(0x000F, 0x0000);
//-----Power On sequence
TFTWriteCmdData(0x0010, 0x0000);
TFTWriteCmdData(0x0011, 0x0007);
TFTWriteCmdData(0x0012, 0x0000);
TFTWriteCmdData(0x0013, 0x0000);
TFTWriteCmdData(0x0010, 0x17B0);
TFTWriteCmdData(0x0011, 0x0007);
TFTWriteCmdData(0x0012, 0x013A);
TFTWriteCmdData(0x0013, 0x1A00);
TFTWriteCmdData(0x0029, 0x000c);
//-----Gamma control
TFTWriteCmdData(0x0030, 0x0000);
TFTWriteCmdData(0x0031, 0x0505);
TFTWriteCmdData(0x0032, 0x0004);
TFTWriteCmdData(0x0035, 0x0006);
TFTWriteCmdData(0x0036, 0x0707);
TFTWriteCmdData(0x0037, 0x0105);
TFTWriteCmdData(0x0038, 0x0002);
TFTWriteCmdData(0x0039, 0x0707);
TFTWriteCmdData(0x003C, 0x0704);
TFTWriteCmdData(0x003D, 0x0807);
//-----Set RAM area
TFTWriteCmdData(0x0050, 0x0000);
TFTWriteCmdData(0x0051, 0x00EF);
TFTWriteCmdData(0x0052, 0x0000);
TFTWriteCmdData(0x0053, 0x013F);
TFTWriteCmdData(0x0060, 0x2700);
TFTWriteCmdData(0x0061, 0x0001);
TFTWriteCmdData(0x006A, 0x0000);
TFTWriteCmdData(0x0021, 0x0000);
TFTWriteCmdData(0x0020, 0x0000);
//-----Partial Display Control
TFTWriteCmdData(0x0080, 0x0000);
TFTWriteCmdData(0x0081, 0x0000);
TFTWriteCmdData(0x0082, 0x0000);
TFTWriteCmdData(0x0083, 0x0000);
TFTWriteCmdData(0x0084, 0x0000);
TFTWriteCmdData(0x0085, 0x0000);
//-----Panel Contro
TFTWriteCmdData(0x0090, 0x0010);
TFTWriteCmdData(0x0092, 0x0000);
TFTWriteCmdData(0x0093, 0x0003);
TFTWriteCmdData(0x0095, 0x0110);
TFTWriteCmdData(0x0097, 0x0000);
TFTWriteCmdData(0x0098, 0x0000);
//-----Display on
TFTWriteCmdData(0x0007, 0x0173);
}
void TFTSetPos(uint16 x0,uint16 x1,uint16 y0,uint16 y1) ////////定坐标
{
TFTWriteCmdData(WINDOW_XADDR_START,x0);
TFTWriteCmdData(WINDOW_XADDR_END,x1);
TFTWriteCmdData(WINDOW_YADDR_START,y0);
TFTWriteCmdData(WINDOW_YADDR_END,y1);
TFTWriteCmdData(GRAM_XADDR,x0);
TFTWriteCmdData(GRAM_YADDR,y0);
TFTWriteCommand(0x00,0x22);//LCD_WriteCMD(GRAMWR);
}
void ClearScreen(uint16 bColor) //清屏
{
unsigned int i,j;
TFTSetPos(0,240,0,320);//320x240
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
TFTWrite16bData(bColor);
}
}
void ClearPartScreen(uint16 x1,uint16 x2,uint16 y1,uint16 y2,uint16 color)//清部分屏幕
{
unsigned int i,j;
TFTSetPos(x1,x2,y1,y2);
for (i=0;i <= (y2 - y1);i++)
{
for (j=0;j <= (x2 - x1);j++)
TFTWrite16bData(color);
}
}
void TFTDrawPicture(uint16 x0,uint16 x1,uint16 y0,uint16 y1,uint8 const *pPicture)
{
uint16 i,j;
uint8 a,b;
TFTSetPos(x0,x1,y0,y1);
for (i = y0;i <= y1;i++)
{
for (j = x0;j <= x1;j++)
{
a = *pPicture++;
b = *pPicture++;
TFTWriteData(b,a);
}
}
}
/////////////////////////////////////////////////////////////////////////////////上面是最基本的彩屏程序了,其他的就加入字库后扩展
void VS1003WriteByte(uint8 Dat)
{
uint8 i;
VS1003ClrSCLK();
for(i = 0;i < 8;i++)
{
if(Dat & 0x80)
VS1003SetMOSI();
else
VS1003ClrMOSI();
VS1003SetSCLK();
Dat <<= 1;
VS1003ClrSCLK();
}
}
uint8 VS1003ReadByte()
{
uint8 i,Temp = 0;
VS1003ClrSCLK();
for(i = 0;i < 8;i++)
{
Temp <<= 1;
VS1003SetSCLK();
if(Read_MISO)
Temp |= 0x01;
VS1003ClrSCLK();
}
return Temp;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void VS1003WriteRegister(uint8 Addr,uint8 DBH,uint8 DBL)
{
while(!Read_DREQ);
VS1003ClrXCS();
VS1003WriteByte(VS_WRITE);
VS1003WriteByte(Addr);
VS1003WriteByte(DBH);
VS1003WriteByte(DBL);
VS1003SetXCS();
}
uint16 VS1003ReadRegister(uint8 Addr)
{
uint16 Temp = 0;
while(!Read_DREQ);
VS1003ClrXCS();
VS1003WriteByte(VS_READ);
VS1003WriteByte(Addr);
Temp = VS1003ReadByte();
Temp <<= 8;
Temp |= VS1003ReadByte();
VS1003SetXCS();
return Temp;
}
/////////////////////////////////////////////////////////////////////////////////////
void VS1003Init()
{
uint16 TestDb = 0;
uint8 TestPort = 0;
TestPort = Read_MISO;
VS1003PortInit();
TestPort = Read_MISO;
VS1003ClrXREST();
delay100us();
VS1003SetXCS();
VS1003SetXDCS();
VS1003ClrSCLK();
VS1003SetXREST();
while(!Read_DREQ);
VS1003WriteRegister(VS_MODE,0x08,0x04);
while(!Read_DREQ);
VS1003WriteRegister(VS_CLOCKF,0x98,0x00);
delay100us();
VS1003WriteRegister(VS_AUDATA,0xbb,0x81);
delay100us();
VS1003WriteRegister(VS_BASS,0x00,0x55);
delay100us();
VS1003WriteRegister(VS_VOL,31,31);
delay100us();
VS1003WriteByte(0);
VS1003WriteByte(0);
VS1003WriteByte(0);
VS1003WriteByte(0);
delay100ms();
TestDb = VS1003ReadRegister(VS_BASS);
delay100ms();
}
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 | |
【换取手持示波器】树莓派PICO逻辑分析仪被打赏16分 | |
【分享评测,赢取加热台】教你五分钟本地部署蒸馏版本的DeepSeekR1-7B被打赏12分 | |
【换取手持示波器】蓝牙音箱更换电池被打赏8分 | |
【换取手持示波器】鼠标更换微动开关被打赏10分 | |
【我要开发板】4.传感器移植被打赏50分 | |
【换取手持数字示波器】RISC-VGCC使用-fno-omit-frame-pointer编译选项实现栈回溯被打赏29分 | |
【分享评测,赢取加热台】+开关电源简述被打赏7分 | |
STM32WBA55ADC采集电池电压任务2被打赏1分 |