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

📄 sd54.c

📁 USB开发板 。CH375的与AVR (atmega32)。。。。
💻 C
📖 第 1 页 / 共 2 页
字号:
//if(keynum==0x08) ds1302_text();}void up(){if(mood!=T&&mood!=B){if(lcdadd!=0)lcdadd--;else lcdadd=3;cursor();}}void down(){if(mood!=T&&mood!=B){if(lcdadd!=3)lcdadd++;else lcdadd=0;cursor();}}void esc(){lcd_write(lcdcmd,0x30,0);//基本指令lcd_write(lcdcmd,0x01,0);//清屏,地址指针指向00Hlcd_write(lcdcmd,0x80,0);add_of_bootnum=16;bootnum=0;strat_c=0;FAT_c=0;lcdnum=0;//初始状态file_buffer();lcd_file();//bootnum--;mood=file;}void right(){if(mood!=T&&mood!=B){lcdadd=0;file_buffer();lcd_file();//bootnum++;}}void enter(){lcd_write(lcdcmd,0x80,0);if(file_t==T)read_txt();if(file_t==B)read_bmp();if(file_t==file)read_file();}void tmp(){GICR&=~0x40;//关int0tmpct=60;tmp_lcd();do{find_tmp();}while(tmpfind==0);nop;tmpfind=0;tmp175num=0;write_time_buffer();nop;do{TCCR1B = 0x04; //开定时器1SREG|=0x80;//全局中断if(tmp175_able==1){tmp175();write_buffer();tmp_lcd_ct();tmp175_able=0;}}while(tmp175num!=60);nop;tmpcadd=(tmpc[0]<<24)+(tmpc[1]<<16)+(tmpc[2]<<8)+tmpc[3];tmpadd=(tmpcadd/*起始簇*/-2)*sector_per_cluster/*每簇扇区数0x0d*/+add_of_boot/*根目录扇区址*/;sdcmd(24,tmpadd,0);//写根目录扇区址writesd();nop;tmp_lcd_ok();nop;//mood=file;GICR|=0x40;//开int0tmpct=60;}void read_file(){mood=file;add_of_bootnum=16;bootnum=4;FAT_c=strat_c-2;//初始状态file_buffer();lcd_file();while(PINA==0xf0);	}void read_txt(){mood=T;uchar i=0,j=0;//uint32_t txtadd;txtadd=(strat_c/*起始簇*/-2)*sector_per_cluster/*每簇扇区数0x0d*/+add_of_boot/*根目录扇区址*/;sdcmd(18,txtadd+txtcnum,0);//读块readsd();//数据读取lcd_write(lcdcmd,0x30,0);//基本指令lcd_write(lcdcmd,0x01,0);//清屏,地址指针指向00Hfor (j=0;j<4;){lcd_write(lcdcmd,lcd_add[j],0);//设置起始地址    for(i=0;i<16;i++)	{	if(buffer[lcdnum]==0) break;	else	lcd_write(lcddate,buffer[lcdnum],word);	lcdnum++;	}j++;}txtnum++;if(txtnum==8){txtnum=0;lcdnum=0;txtcnum++;}if(txtcnum==4){txtcnum=0;txtnum=0;lcdnum=0;FAT_c=strat_c-2;read_FAT();strat_c=FAT_c+2;}while(PINA==0xf0);}void read_bmp(){mood=B;uchar i=0,j=0;uint32_t bmpadd;bmpadd=(strat_c/*起始簇*/-2)*sector_per_cluster/*每簇扇区数0x0d*/+add_of_boot/*根目录扇区址*/;sdcmd(18,bmpadd,0);//读块readsd();//数据读取lcdnum=0x3e;lcd_write(lcdcmd,0x30,0);//基本指令lcd_write(lcdcmd,0x01,0);//清屏,地址指针指向00H  for(j=0;j<32;j++)  {    for(i=0;i<8;i++)    {      lcd_write(lcdcmd,0x34,0);      lcd_write(lcdcmd,y0-j,0);      lcd_write(lcdcmd,x2+i,0);      lcd_write(lcdcmd,0x30,0);      lcd_write(lcddate,~buffer[lcdnum],pic);      lcd_write(lcddate,~(buffer[lcdnum+1]),pic);	  lcdnum=lcdnum+2;	  if(lcdnum==512)	  {	  sdcmd(18,bmpadd+1,0);//读块      readsd();//数据读取	  lcdnum=0;	  }    }  }  for(j=32;j<64;j++)  {    for(i=0;i<8;i++)    {      lcd_write(lcdcmd,0x34,0);      lcd_write(lcdcmd,y0+32-j,0);      lcd_write(lcdcmd,x1+i,0);      lcd_write(lcdcmd,0x30,0);      lcd_write(lcddate,~buffer[lcdnum],pic);      lcd_write(lcddate,~(buffer[lcdnum+1]),pic);	  lcdnum=lcdnum+2;	  if(lcdnum==512)	  {	  sdcmd(17,bmpadd+2,0);//读块      readsd();//数据读取	  lcdnum=0;	  }    }  }lcd_write(0xf8,0x36,0);while(PINA==0xf0);}void cursor()//光标{uchar i=0,j=0;lcd_write(lcdcmd,0x30,0);//基本指令for (j=0;j<4;){lcd_write(lcdcmd,lcd_add[j],0);//设置起始地址    for(i=0;i<2;i++)	{	lcd_write(lcddate,0xa1,word);	}j++;}	lcd_write(lcdcmd,lcd_add[lcdadd],0);lcd_write(lcddate,0xa1,word);lcd_write(lcddate,0xef,word);//写箭头strat_c=strat_cluster[lcdadd];//起始簇file_t=file_type[lcdadd];//文件类型}void ds1302(){uchar i=0;ds1302_lcd0();ds1302_set();do{tmp175();lcd_write(lcdcmd,0x30,0);//基本指令lcd_write(lcdcmd,0x85,0);//设置起始地址    for(i=0;i<6;i++)	{	lcd_write(lcddate,tmp0[i],word);	}time_lcd();}while(PINA==0xf0);}/**************************keyboard***********************************************************//*********************************************************************************************//**************************tmp175*************************************************************/void tmp_lcd(){    uchar i=0,j=0;    lcd_write(lcdcmd,0x30,0);//基本指令    lcd_write(lcdcmd,0x01,0);//清屏,地址指针指向00H    for (j=0;j<4;)    {    lcd_write(lcdcmd,lcd_add[j],0);//设置起始地址    for(i=0;i<16;i++)	{	lcd_write(lcddate,tmpset[i+j*16],word);	}	j++;	}}void find_tmp(){       uchar file1,file2,file3,extension1,extension2,extension3;       if(add_of_bootnum==16)	   {	   add_of_bootnum=0;	   sdcmd(17,add_of_boot+bootnum,0);//读根目录扇区址       readsd();	   bootnum++;	   }	   file1=buffer[0+(add_of_bootnum<<5)];	   file2=buffer[1+(add_of_bootnum<<5)];	   file3=buffer[2+(add_of_bootnum<<5)];	   extension1=buffer[8+(add_of_bootnum<<5)];	   extension2=buffer[9+(add_of_bootnum<<5)];	   extension3=buffer[10+(add_of_bootnum<<5)];//扩展名	   if(file1==0x54&&file2==0x4d&&file3==0x50&&extension1==0x54&&extension2==0x58&&extension3==0x54)	   {	    tmpc[0]=buffer[21+(add_of_bootnum<<5)];	    tmpc[1]=buffer[20+(add_of_bootnum<<5)];	    tmpc[2]=buffer[27+(add_of_bootnum<<5)];//起始簇	    tmpc[3]=buffer[26+(add_of_bootnum<<5)];//起始簇		tmpfind=1;	   }else add_of_bootnum++;}void tmp_lcd_ok(){uchar i=0;lcd_write(lcdcmd,0x30,0);//基本指令lcd_write(lcdcmd,0x98,0);//设置起始地址    for(i=0;i<16;i++)	{	lcd_write(lcddate,tmpok[i],word);	}}void tmp_lcd_ct(){uchar i=0;lcd_write(lcdcmd,0x30,0);//基本指令tmpct--;tmpct10=tmpct/10;tmpct1=tmpct-tmpct10*10;tmplcdct[9]=0x30+tmpct10;tmplcdct[10]=0x30+tmpct1;lcd_write(lcdcmd,0x98,0);//设置起始地址    for(i=0;i<16;i++)	{	lcd_write(lcddate,tmplcdct[i],word);	}}void tmp175(){tmp175num++;i2c_strat();i2c_sla_w(0x6e);//三脚悬空地址为0110111、写i2c_wdate(0x01);//选择配置寄存器i2c_wdate(0x60);//12位精度i2c_stop();/*初始设定*/i2c_strat();i2c_sla_w(0x6e);//三脚悬空地址为0110111、写i2c_wdate(0x00);//选择温度寄存器i2c_restrat();i2c_sla_r(0x6e);//三脚悬空地址为0110111、读i2c_rdate();tmph=TWDR;next;i2c_rdate();tmpl=TWDR;i2c_stop();tmpl=point[(tmpl>>4)-1];tmphh=tmph/10;tmphl=tmph-tmphh*10;tmp0[0]=tmphh|0x30;tmp0[1]=tmphl|0x30;tmp0[3]=tmpl|0x30;}void i2c_strat(){TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);while (!(TWCR & (1<<TWINT)));//等待 TWINT置位, TWINT置位表示START信号已发出if ((TWSR & 0xF8) != strat_ack)i2c_strat();}void i2c_restrat(){TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);while (!(TWCR & (1<<TWINT)));//等待 TWINT置位, TWINT置位表示START信号已发出if ((TWSR & 0xF8) != restrat_ack)i2c_strat();}void i2c_sla_w(uchar sla_w){TWDR = sla_w|0x00;TWCR = (1<<TWINT) | (1<<TWEN);while (!(TWCR & (1<<TWINT)));//等待 TWINT 置位,TWINT置位表示总线命令 SLA+W 已发出,及收到应答信号if ((TWSR & 0xF8) != mt_sla_ack)i2c_sla_w(sla_w);}void i2c_sla_r(uchar sla_r){TWDR = sla_r|0x01;TWCR = (1<<TWINT) | (1<<TWEN);while (!(TWCR & (1<<TWINT)));//等待 TWINT 置位,TWINT置位表示总线命令 SLA+W 已发出,及收到应答信号if ((TWSR & 0xF8) != mr_sla_ack)i2c_sla_r(sla_r);}void i2c_wdate(uchar date){TWDR = date;TWCR = (1<<TWINT) | (1<<TWEN);nop;while (!(TWCR & (1<<TWINT)));//等待 TWINT置位,TWINT置位表示总线数据 DATA 已发送,及收到应答信号 if ((TWSR & 0xF8) != mt_date_ack)i2c_wdate(date);}void i2c_rdate(){TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);nop;while (!(TWCR & (1<<TWINT)));//等待 TWINT置位,TWINT置位表示总线数据 DATA 已读取,及收到应答信号 if ((TWSR & 0xF8) != mr_date_ack)i2c_rdate();}void i2c_stop(){TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);}void write_time_buffer(){uchar i;for(i=0;i<32;i++){buffer[i]=time_tab[i+32];}tmpnum=4;}void write_buffer(){uchar i;for(i=0;i<8;i++){buffer[i+(tmpnum<<3)]=tmp0[i];}tmpnum++;}/**************************tmp175*************************************************************//*********************************************************************************************//**************************timer1*************************************************************/SIGNAL(SIG_OVERFLOW1){TCCR1B = 0x00; //stopif(tmplcd==0){receive_cmd;tmplcd=1;}else {ureceive_cmd;tmplcd=0;}TCNT1H = 0xA4; //setupTCNT1L = 0x73;tmp175_able=1;}/**************************timer1*************************************************************//*********************************************************************************************//**************************ds1302*************************************************************/void nop_4(){asm("nop");asm("nop");asm("nop");asm("nop");}void ds1302_set()//1302初始化{PORTD&=~0xe0;//三脚置低DDRD|=0xe0;//输出write_data(0x8e,0x00);//关闭寄存器写保护write_data(0x90,0xa5);//写充电寄存器,开R1和一个二极管}void write_data(uchar addr,uchar data){uchar i;ds_enable;ds_datel;ds_clkl;         ds_out;nop_4();ds_able;                  //时钟信号低时拉高RST初始化for(i=0;i<8;i++)   {   if(addr&(1<<i))    		ds_dateh;    else   	    ds_datel;  ds_clkh;             //时钟上升沿写入数据  nop_4();  ds_clkl;             //时钟拉低电平   nop_4();              }  for(i=0;i<8;i++)   {   if(data&(1<<i))    		ds_dateh;    else   	    ds_datel;  ds_clkh;             //时钟上升沿写入数据  nop_4();  ds_clkl;             //时钟拉低电平   nop_4();              }  ds_in;  ds_enable;             //禁止DS1302 }void read_data(uchar addr){uchar i,t;ds_enable;ds_datel;ds_clkl;         ds_out;nop_4();ds_able;                    //时钟信号低时拉高RST初始化for(i=0;i<8;i++)   {   if(addr&(1<<i))    		ds_dateh;    else   	    ds_datel;    ds_clkh;  nop_4();            //时钟上升沿写入数据  ds_datel;    ds_clkl;       nop_4();        //时钟拉低电平 }   ds_in;   ds_dateh;   nop_4();for(i=0;i<7;i++) {   if(ds_read)      t|=(1<<i);  else  	  t&=~(1<<i);	ds_clkh;        nop_4();       //上升沿读出数据   ds_clkl;         nop_4();      //时钟电平拉低   }  ds_clkl;   ds_enable;             //禁止DS1302   time=t;}void do_time(uchar m,uchar n){timel=(time&0x0f)|0x30;timeh=((time>>4)&0x0f)|0x30;time_tab[m]=timeh;time_tab[n]=timel;}void time_lcd(){read_data(0x8d);do_time(34,35);read_data(0x89);do_time(38,39);read_data(0x87);do_time(42,43);read_data(0x85);do_time(52,53);read_data(0x83);do_time(55,56);read_data(0x81);do_time(58,59);ds1302_lcd();}void  ds1302_lcd(){    uchar i=0,j=0;    lcd_write(lcdcmd,0x30,0);//基本指令    for (j=2;j<4;)    {    lcd_write(lcdcmd,lcd_add[j],0);//设置起始地址    for(i=0;i<16;i++)	{	lcd_write(lcddate,time_tab[i+j*16],word);	}	j++;	}}void  ds1302_lcd0(){uchar i=0,j=0;    lcd_write(lcdcmd,0x30,0);//基本指令    for (j=0;j<4;)    {    lcd_write(lcdcmd,lcd_add[j],0);//设置起始地址    for(i=0;i<16;i++)	{	lcd_write(lcddate,time_tab[i+j*16],word);	}	j++;	}}void ds1302_text(){ds1302_set();time_set(0x08,0x06,0x26,0x15,0x54,0x00);ds1302();}void time_set(uchar year,uchar month,uchar day,uchar hour,uchar min,uchar sec){  write_data(0x80,sec);  write_data(0x82,min);  write_data(0x84,hour);  write_data(0x86,day);  write_data(0x88,month);  write_data(0x8c,year);}/**************************ds1302*************************************************************//*********************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -