//=======DS1307有关子程序 //===DS1307初始化 void DS1307_CSH() { write_DS1307(0x00,0X00);//秒钟设置 write_DS1307(0x01,0x01);//分钟设置 write_DS1307(0x02,0x01);//小时设置 write_DS1307(0x03,0X01);//星期天设置 write_DS1307(0x04,0x01);//日月设置 write_DS1307(0x05,0x05);//月设置 write_DS1307(0x06,0x12);//年设置 write_DS1307(0x07,0x70);//7脚方波允许,输出1HZ }
//==IIC初始化 void IIC_CSH()
{ TRISC =0b00011000; //SDA,SCL设置为输入 SSPCON=0b00101000; //同步串口使能(SSPEN),主控方式 SMP=0; //使能高速模式(400 kHz) 的压摆率控制 SSPADD=4; //主控模式为波特率值,每位时间T=(SSPADD+1)/Tcy=5us }
//发送数R并等待发送完成,收到从机的应答信号 void IIC_SEND(char R) { SSPBUF=R; //发送 while (RW==1); //在主动模式下,判断发送是否完成 while (SSPIF==0); //等待发送完成 while (ACKSTAT==1); //等待从机发送应答信号 NOP(); }
//====读写DS1307程序
void write_DS1307(char addr,char data) { SEN=1; //发送起始位 while(SEN==1); //检测起始位完成 IIC_SEND(0b11010000); //送DS1307的七位地址和写功能 IIC_SEND(addr); //发送要写入的地址 IIC_SEND(data); //发送要写入的数
PEN=1; //发送停止位 while (PEN==1); //检查停止位结束 }
//===读DS1307
void READ_DS1307(char addr,char n) { char i; SEN=1; //产生起始位 while (SEN==1); //检测起始位完成 IIC_SEND(0b11010000); //送DS1307的7位地址 IIC_SEND(addr); //此值为DS1307要读的地址 PEN=1; //发送停止位 while (PEN==1);//检查停止位结束 NOP(); RSEN=1; //发送重新启始位 while(RSEN==1); //检测重新起始位完成 IIC_SEND(0b11010001); //读数据 for (i=0;i //=====显示DS1307 void MENU_DS1307(void) { LCD_WRITE(0b00001100,COM); //D(d2)=1:打开显示,C(d1)=1:光标打开,B(d0)=1:光标不闪烁 char i; LCD_WRITE(LINE1,COM); //DDRAM地址,第1行的第1个字符 LCD_WRITE(' ',DAT); LCD_WRITE('2',DAT); LCD_WRITE('0',DAT); LCD_WRITE((A[6]>>4)+0x30,DAT); LCD_WRITE((A[6]&0x0F)+0x30,DAT); LCD_WRITE('-',DAT); LCD_WRITE((A[5]>>4)+'0',DAT); LCD_WRITE((A[5]&0x0F)+'0',DAT); LCD_WRITE('-',DAT); LCD_WRITE((A[4]>>4)+'0',DAT); LCD_WRITE((A[4]&0x0F)+'0',DAT); LCD_WRITE(' ',DAT); i=A[3]&0x07; LCD_WRITE(table[(i-1)*4],DAT); LCD_WRITE(table[(i-1)*4+1],DAT); LCD_WRITE(table[(i-1)*4+2],DAT); LCD_WRITE(table[(i-1)*4+3],DAT); //LCD_WRITE(' ',DAT); LCD_WRITE(LINE2,COM); //DDRAM地址,第2行的第1个字符 LCD_WRITE(' ',DAT); LCD_WRITE((A[2]>>4)+'0',DAT); LCD_WRITE((A[2]&0x0F)+'0',DAT); LCD_WRITE(0x3A,DAT); LCD_WRITE((A[1]>>4)+'0',DAT); LCD_WRITE((A[1]&0x0F)+'0',DAT); LCD_WRITE(0x3A,DAT); LCD_WRITE((A[0]>>4)+'0',DAT); LCD_WRITE((A[0]&0x0F)+'0',DAT); LCD_WRITE(' ',DAT); } char dec_bcd(char dec) { char bcd; bcd= 0; while(dec >= 10) { dec -= 10; bcd++; } bcd <<= 4; bcd |= dec; return (bcd); } void bcd_dec(char adr,char R) { SW=A[adr]>>4; GW=A[adr]&0x0F; while(SW>0) { R=R+10;SW--; } R+=GW; } //====按键程序 void set_time() { if(mod==0) { delaynms(30); if(mod==0) { while(!mod);//等待 M++; if(M==3) { M=0;flag=0;f=0;a=0; } } } if(M==1)//设置时间 { if(set==0) { delaynms(30); if(set==0) { while(!set); a++; if(a==8) a=0; } } guangbiao();//光标定位,闪烁 if(a==1) { if(add==0) { delaynms(30); if(add==0) { while(!add); bcd_dec(0,sec); sec++; if(sec==60) sec=0; write_DS1307(0,dec_bcd(sec)); } } if(miu==0) { delaynms(30); if(miu==0) { while(!miu); bcd_dec(0,sec); sec--; if(sec==-1)sec=59; write_DS1307(0,dec_bcd(sec)); } } } if(a==2) { if(add==0) { delaynms(30); if(add==0) { while(!add); bcd_dec(1,min); min++; if(min==60) min=0; write_DS1307(1,dec_bcd(min)); } } if(miu==0) {