论坛» 嵌入式开发» MCU

STC51单片机实例之39SD卡实验

高工
2014-09-13 21:53 1楼
/*----------------------------------------------- 这里需要用到2G的SD卡,SD卡插上后,会在串口中对数据进行读写。显示0-9 ------------------------------------------------*/ #include  #include  #include  #include<9325TP.h> //============================================================= //定义SD卡需要的4根信号线 sbit SD_CLK = P1^1; sbit SD_DI = P1^2; sbit SD_DO = P1^0; sbit SD_CS = P1^3; //=========================================================== //定义按键端口 sbit KEY = P3^2; //=========================================================== //定义512字节缓冲区,注意需要使用 xdata关键字 unsigned char xdata DATA[75]={0}; unsigned char xdata DATA1[75]={0}; //=========================================================== //写一字节到SD卡,模拟SPI总线方式 void SdWrite(unsigned char n) { unsigned char i; for(i=8;i;i--) { SD_CLK=0; SD_DI=(n&0x80); n<<=1; SD_CLK=1; } SD_DI=1; } //=========================================================== //从SD卡读一字节,模拟SPI总线方式 unsigned char SdRead() { unsigned char n,i; for(i=8;i;i--) { SD_CLK=0; SD_CLK=1; n<<=1; if(SD_DO) n|=1; } return n; } //============================================================ //检测SD卡的响应 unsigned char SdResponse() { unsigned char i=0,response; while(i<=8) { response = SdRead(); if(response==0x00) break; if(response==0x01) break; i++; } return response; } //================================================================ //发命令到SD卡 void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC) { SdWrite(command|0x40); SdWrite(((unsigned char *)&argument)[0]); SdWrite(((unsigned char *)&argument)[1]); SdWrite(((unsigned char *)&argument)[2]); SdWrite(((unsigned char *)&argument)[3]); SdWrite(CRC); } //================================================================ //初始化SD卡 unsigned char SdInit(void) { int delay=0, trials=0; unsigned char i; unsigned char response=0x01; SD_CS=1; for(i=0;i<=9;i++) SdWrite(0xff); SD_CS=0; //Send Command 0 to put MMC in SPI mode SdCommand(0x00,0,0x95); response=SdResponse(); if(response!=0x01) { return 0; } while(response==0x01) { SD_CS=1; SdWrite(0xff); SD_CS=0; SdCommand(0x01,0x00ffc000,0xff); response=SdResponse(); } SD_CS=1; SdWrite(0xff); return 1; } //================================================================ //往SD卡指定地址写数据,一次最多512字节 unsigned char SdWriteBlock(unsigned char *Block, unsigned long address,int len) { unsigned int count; unsigned char dataResp; //Block size is 512 bytes exactly //First Lower SS SD_CS=0; //Then send write command SdCommand(0x18,address,0xff); if(SdResponse()==00) { SdWrite(0xff); SdWrite(0xff); SdWrite(0xff); //command was a success - now send data //start with DATA TOKEN = 0xFE SdWrite(0xfe); //now send data for(count=0;count
        

/*----------------------------------------------- 名称:写彩屏 公司:上海浩豚电子科技有限公司 网站:www.doflye.net 编写:师访 日期:2009.12 修改:无 内容:320x240像素、16位BMP图片的HEX数据,依次写到屏上,还原图片 注意事项: ------------------------------------------------*/ #include"reg52.h" //============================================================ //根据芯片资料定义 #define WINDOW_XADDR_START 0x0050 // Horizontal Start Address Set #define WINDOW_XADDR_END 0x0051 // Horizontal End Address Set #define WINDOW_YADDR_START 0x0052 // Vertical Start Address Set #define WINDOW_YADDR_END 0x0053 // Vertical End Address Set #define GRAM_XADDR 0x0020 // GRAM Horizontal Address Set #define GRAM_YADDR 0x0021 // GRAM Vertical Address Set #define GRAMWR 0x0022 // memory write //============================================================= //定义液晶屏接口 sbit CS=P2^2; //片选 sbit RES=P2^1; //复位 sbit RS=P2^4; //数据/命令选择 sbit RW=P2^5; //数据口使用P0 //====================================================// //函数声明 void ILI9325_Initial(void); void Write_Cmd_Data(unsigned char x, unsigned int y); void Write_Cmd(unsigned char DH,unsigned char DL); void Write_Data(unsigned char DH,unsigned char DL); void delayms(unsigned int tt); void Write_Data_U16(unsigned int y); static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1); void ClearScreen(unsigned int bColor); //=============================================================== //清屏 void ClearScreen(unsigned int bColor) { unsigned int i,j; LCD_SetPos(0,240,0,320);//320x240 for (i=0;i<320;i++) { for (j=0;j<240;j++) Write_Data_U16(bColor); } } //=============================================================== //写命令数据 void Write_Cmd_Data (unsigned char x,unsigned int y) { unsigned char m,n; m=y>>8; n=y; Write_Cmd(0x00,x); Write_Data(m,n); } //============================================================== //写16位数据 void Write_Data_U16(unsigned int y) { unsigned char m,n; m=y>>8; n=y; Write_Data(m,n); } //============================================================= //写命令 void Write_Cmd(unsigned char DH,unsigned char DL) { CS=0; RS=0; P0=DH; RW=0; RW=1; P0=DL; RW=0; RW=1; CS=1; } //=================================================================== //写数据 void Write_Data(unsigned char DH,unsigned char DL) { CS=0; RS=1; P0=DH; RW=0; RW=1; P0=DL; RW=0; RW=1; CS=1; } //============================================================ //延时程序 void delayms(unsigned int count) { int i,j; for(i=0;i
        

菜鸟
2019-03-14 14:45 2楼

楼主的无私分享,是我们加强学习,积极进步的动力。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]