📄 sd54.c
字号:
//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 + -