暑假想做一个lcd12864的badapple,现在显示器能单独显示,但SD卡中的内容读不出来,不清楚是什么原因,可能是程序出错了,也有可能是SD卡出错了,扇区什么物理地址和逻辑地址都试过了就是不能显示动画,显示器能单独显示应该不是这上面的问题。大一小白求大神帮忙看看是不是程序出问题了,还是其他方面的问题
#include <reg52.h>
<code>#define uchar unsigned char #define uint unsigned int uchar ints; //初始化变速标志 sbit cs =P1^7; sbit di =P1^6; //sd卡数据输入 sbit clk=P1^5; sbit d0=P1^4; //SD卡数据输出 //uchar xdata table[512]; //错误代码// #define cmd0 0x01 #define cmd1 0x02 #define sdw 0x03 //sd写错误 #define sdr 0x0f //sd读错误 void delay2(uint z) { while(z--); } //***************************************************************************************// //*********************************spi驱动**********************************************// void spi_w(uchar dat) //写数据 { uchar i; for(i=0;i<8;i++) { if(dat&0x80) di="1;" else clk="0;" if(ints) delay2(10); 初始化的时候时钟速度要慢 dat<<="1;" } uchar spi_r(void) 读数据 temp="0,j;" d0="1;" for(j="0;j<8;j++)" return (temp); *********************************spi驱动********************************************** *************************************************************************************** *********************************sd卡驱动********************************************** sd_com(uchar *com) i,temp,time="0;" cs="1;" spi_w(0xff); for(i="0;i<0x06;i++)" 写命令 spi_w(*com++); spi_r(); do 读到有返回 time++; while((temp="=0xff)&&(time<100));" return(temp); sd_reset() time,temp,i; cmd[]="{0x40,0x00,0x00,0x00,0x00,0x95};" ints="1;//开启初始化延时" {spi_w(0xff);} time="0;" 写cmd0 if(time>=200) {return(cmd0); } }while(temp!=0x01); cs=1; spi_w(0xff); return 0; } uchar sd_int() { uchar time,temp; uchar cmd[]={0x41,0x00,0x00,0x00,0x00,0xff}; cs=0; time=0; do { temp=sd_com(cmd); time++; if(time==100) {return(cmd1);} }while(temp!=0) ; ints=0; cs=1; spi_w(0xff); return 0; } uchar sd_w(unsigned long add,uchar *bu) { uchar temp,time; uint i; uchar cmd[]={0x58,0x00,0x00,0x00,0x00,0xff};//cmd24 add<<=9; 等于add*512 扇区地址转换为字节地址 cmd[1]="((add&0xff000000)">>24); cmd[2]=((add&0x00ff0000)>>16); cmd[3]=((add&0x0000ff00)>>8); cs=0; time=0; do { temp=sd_com(cmd); time++; if(time==100) {return(0xff);} }while(temp!=0); // for(i=0;i<100;i++) 插入若干clk {spi_r();} spi_w(0xfe); 写数据的开头 for(i="0;i<512;i++)" { spi_w(*bu++); } spi_w(0xff); 两个crc校验 temp="spi_r();" if((temp & 0x1f)!="0x05)" cs="1;" return(sdw); while(spi_r()!="0xff);" 一直读到sd卡向flash写完数据 spi_w(0xff) ; return(0); uchar sd_r(unsigned long add,uchar *buf) time,temp; uint j; cmd[]="{0x51,0x00,0x00,0x00,0x00,0xff};//cmd17" add<<="9;//" 等于add*512 扇区地址转换为字节地址 cmd[1]="((add&0xff000000)">>24); cmd[2]=((add&0x00ff0000)>>16); cmd[3]=((add&0x0000ff00)>>8); cs=0; time=0; do { temp=sd_com(cmd); time++; if(time==100) {return(sdr);} } while(temp!=0); //说明命令写入成功 while(spi_r()!=0xfe);//读到数据的开头 for(j=0;j<512;j++) { *buf++="spi_r();" } spi_r(); 读2个crc cs="1;" spi_w(0xff); return (0); }< code></512;j++)></100;i++)></=9;></8;i++)></code>
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |