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

📄 sd.c

📁 PIC单片机C语言程序设计实例精粹
💻 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 + -