📄 sd.c
字号:
#include "sd.h"
void chk_busy (void)
{
nrs;
rw;
en;
while(data&0x80);
nen;
}
void init_lcd (void)
{
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
wr_lcd (comm,0x06); /*光标的移动方向*/
wr_lcd (comm,0x0c); /*开显示,关游标*/
}
void lcd_refresh()
{
switch( curr_menu )
{
case class1_read:
lcd_putchar(0,0,”读数据”,1); //第一行反显
lcd_putchar(0,16,”写数据”,0); //第二行正显
lcd_putchar(0,32,”校验数据”,0); //第三行正显
lcd_putchar(0,48,”读+写+校验数据”,0); //第四行正显
break;
case class1_write:
lcd_putchar(0,0,”读数据”,0); //第一行正显
lcd_putchar(0,16,”写数据”,1); //第二行反显
lcd_putchar(0,32,”校验数据”,0); //第三行正显
lcd_putchar(0,48,”读+写+校验数据”,0); //第四行正显
break;
case class1_verify:
lcd_putchar(0,0,”读数据”,0); //第一行正显
lcd_putchar(0,16,”写数据”,0); //第二行正显
lcd_putchar(0,32,”校验数据”,1); //第三行反显
lcd_putchar(0,48,”读+写+校验数据”,0); //第四行正显
break;
case class1_all:
lcd_putchar(0,0,”读数据”,0); //第一行正显
lcd_putchar(0,16,”写数据”,0); //第二行正显
lcd_putchar(0,32,”校验数据”,0); //第三行正显
lcd_putchar(0,48,”读+写+校验数据”,1); //第四行反显
break;
case class2_read:
lcd_putchar(0,0,”读数据”,0); //第一行正显
lcd_putchar(0,16,&datapoint,0); //第二行正显 指向数据缓存区
lcd_putchar(0,48,”已读取: 个”,0);
lcd_putchar(40,48,&databuff,0);
lcd_putchar(90,48,”返回”,1);
break;
case class2_write:
lcd_putchar(0,0,”写数据”,0); //第一行正显
lcd_putchar(0,16,&datapoint,0); //第二行正显 指向数据缓存区
lcd_putchar(0,48,”已写入: 个”,0);
lcd_putchar(40,48,&databuff,0);
lcd_putchar(90,48,”返回”,1);
break;
case class2_verify:
lcd_putchar(0,0,”校验数据”,0); //第一行正显
lcd_putchar(0,16,&datapoint,0); //第二行正显 指向数据缓存区
lcd_putchar(0,32,”已校验: 个”,0); //第三行反显
lcd_putchar(34,48,&databuff,0);
lcd_putchar(0,48,”错误: 个”,0);
lcd_putchar(34,48,&datawrong,0);
lcd_putchar(90,48,”返回”,1);
break;
case class2_all:
lcd_putchar(0,0,”读/写/校验数据”,0); //第一行正显
lcd_putchar(0,16,&datapoint,0); //第二行正显 指向数据缓存区
lcd_putchar(0,32,”已完成: 个”,0); //第三行反显
lcd_putchar(34,48,&databuff,0);
lcd_putchar(0,48,”出错: 个”,0);
lcd_putchar(34,48,&datawrong,0);
lcd_putchar(90,48,”返回”,1);
break;
default:
break;
}
}
void chn_disp (unsigned char *chn)
{
unsigned char i,j;
wr_lcd(comm,0x30);
wr_lcd(comm,0x80); //地址:第一行
for (i=0;i<16;i++)
wr_lcd(dat,chn[i]);
wr_lcd(comm,0x90); //地址:第二行
for (i=0;i<16;i++)
wr_lcd(dat,tab2[i]);
wr_lcd(comm,0x88); //地址:第三行
for (i=0;i<16;i++)
wr_lcd(dat,tab3[i]);
wr_lcd(comm,0x9a); //地址:第四行
for (i=0;i<8;i++)
wr_lcd(dat,tab4[i]);
}
void wr_lcd (unsigned char dat_comm,unsigned char content)
{
unsigned int i;
chk_busy (); //判忙
if(dat_comm)
{
rs; //data
nrw; //write
}
else
{
nrs; //command
nrw; //write
}
en;
for(i=0;i<500;i++); //适当延时
nen;
}
int keyboard(void)
{
int keyvalue;
keyvalue = PORTB;
switch(keyvalue)
{
case 0x1:
key = UP;
break;
case 0x2:
key = DOWN;
break;
case 0x4:
key = OK;
break;
case 0x8:
key = CANCEL;
break;
default: break;
}
return keyvalue;
}
void key_cmd()
{
switch key:
{
case down:
down_fun();
break;
case up:
up_fun();
break;
case ok:
ok_fun();
break;
case cancel:
cancel_fun();
break;
default:break;
}
}
void up_fun(void)
{
if( curr_menu > class1_read)
curr_menu--;
if( curr_menu == class1_read)
curr_menu = class1_all;
}
void down_fun(void)
{
if( curr_menu < class1_all)
curr_menu++;
if( curr_menu == class1_all)
curr_menu = class1_read;
}
void ok(void)
{
switch( curr_menu )
{
case class1_read:
sd_read();
curr_menu = class2_read;
break;
case class1_write:
sd_write();
curr_menu = class2_ write;
break;
case class1_verify:
sd_verify();
curr_menu = class2_verify;
break;
case class1_all:
sd_all();
curr_menu = class2_all;
break;
case class2_read:
curr_menu = class1_read;
break;
case class2_write:
curr_menu = class1_write;
break;
case class2_verify:
curr_menu = class1_verify;
break;
case class2_all:
curr_menu = class1_all;
break;
default:
break;
}
}
void cancel(void)
{
}
unsigned char SD_Init(void)
{
unsigned char retry,temp;
unsigned char i;
for (i=0;i<0x0f;i++)
{
SPI_ReadWrite(0xff); //延迟74个以上的时钟
}
SD_Enable(); //使能SD卡
SPI_ReadWrite (SD_RESET); //发送复位命令
SPI_ReadWrite (0x00);
SPI_ReadWrite (0x00);
SPI_ReadWrite (0x00);
SPI_ReadWrite (0x00);
SPI_ReadWrite (0x95);
SPI_ReadWrite (0xff);
SPI_ReadWrite (0xff);
retry=0;
do
{
temp=Write_Command_SD(SD_INIT,0);
//发送初始化命令
retry++;
if(retry==120) //重试120次
{
SD_Disable(); //关片选
return 0; //如果重试120次失败返回0值
}
}while(temp!=0);
SD_Disable(); //非使能SD卡
return 1; //返回1,表示成功初始化
}
unsigned char SPI_ReadWrite(unsigned char data)
{
unsigned char i;
for(i=8; i!=0; i--)
{
SPI_CLK=0; //CLK引脚置低电平
SPI_DI=0; //数据线置低电平
if(data&0x80)
SPI_DI=1; //若data高位为1,则数据线置高电平
data<<=1;
SPI_CLK=1; // CLK引脚置高电平
if(SPI_DO)
data|=1; // 读入一位
}
SPI_CLK=0;
return data;
}
void main()
{
init();
while(1)
{
count_time();
keyboard();
key_cmd();
lcd_refresh();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -