short i[5]; short alflg=1; short tmflg=0; int adc; int timesecs=0; int cnt=0; int cntadr=0; int up=240; int dn=200; int wrdat=0; short dp=2; short seconds,minutes,hours; short bminutes,bhours; short eminutes,ehours; void ind(short *num[]) { short port=1; short ii=0; short nm; porta=port; for(ii;ii<4;ii++) { if(port==dp) { portb=128; } else { portb=0; } nm=num[ii]; switch(nm) { case 0: portb+=63; break; case 1: portb+=6; break; case 2: portb+=91; break; case 3: portb+=79; break; case 4: portb+=102; break; case 5: portb+=109; break; case 6: portb+=125; break; case 7: portb+=7; break; case 8: portb+=127; break; case 9: portb+=111; break; } Delay_ms(5); portb=0; port=port*2; porta=port; } } short FlashRead(int adr) { short retdat; short adrh; short adrl; adrh=(adr/256)*2+160; adrl=adr%256; I2C_Start(); I2C_Wr(adrh); I2C_Wr(adrl); I2C_Repeated_Start(); I2C_Wr(adrh+1); retdat=I2C_Rd(0u); I2C_Stop(); return retdat; } void form() { short c=0; adc=0; for (c;c<10;c++) { adc+=Adc_Read(4); ind(i); } adc=adc/10; ind(i); //adc=timesecs*2; //adc=FlashRead(0x07); if(adc%2==1) { i[0]=5; } else { i[0]=0; } wrdat=adc; adc=adc/2; ind(i); i[1]=adc%10; i[2]=(adc/10)%10; i[3]=(adc/100)%10; } void Time_Wrt() { Soft_I2C_Start(); // Issue start signal Soft_I2C_Write(0xD0); // Address PCF8583 Soft_I2C_Write(0); // Start from word at address 0 (configuration word) Soft_I2C_Write(0x80); // Write 0x80 to config. (pause counter...) Soft_I2C_Write(minutes); // Write 0x30 to minutes word Soft_I2C_Write(hours); // Write 0x11 to hours word Soft_I2C_Write(0x30); // Write 0x24 to year/date word Soft_I2C_Write(0x05); // Write 0x08 to weekday/month Soft_I2C_Stop(); // Issue stop signal Soft_I2C_Start(); // Issue start signal Soft_I2C_Write(0xD0); // Address PCF8530 Soft_I2C_Write(0); // Start from word at address 0 Soft_I2C_Write(0); // Write 0 to config word (enable counting) Soft_I2C_Stop(); // Issue stop signal } void send() { short bf; int i=0; if (Usart_Data_Ready()) { bf=Usart_Read(); if(bf==186) { Usart_Write(0x80); for(i;i<2048;i+=2) { bf=FlashRead(i)+FlashRead(i+1)*256; Usart_Write(bf%256); Usart_Write(bf/256); } cntadr=0; } /*if(bf=127) { Usart_Write(0x80); while(Usart_Data_Ready()==0) {;} up=Usart_Read(); while(Usart_Data_Ready()==0) {;} up+=Usart_Read()*256; while(Usart_Data_Ready()==0) {;} dn=Usart_Read(); while(Usart_Data_Ready()==0) {;} dn+=Usart_Read()*256; Eeprom_Write(0,up%256); Eeprom_Write(1,up/256); Eeprom_Write(0,dn%256); Eeprom_Write(1,dn/256); } */ /*if(bf=125) { Usart_Write(0x80); while(Usart_Data_Ready()==0) {;} minutes=Usart_Read(); while(Usart_Data_Ready()==0) {;} hours=Usart_Read()*256; while(Usart_Data_Ready()==0) {;} bminutes=Usart_Read(); while(Usart_Data_Ready()==0) {;} bhours=Usart_Read()*256; while(Usart_Data_Ready()==0) {;} eminutes=Usart_Read(); while(Usart_Data_Ready()==0) {;} ehours=Usart_Read()*256; Eeprom_Write(5,bminutes); Eeprom_Write(6,bhours); Eeprom_Write(7,eminutes); Eeprom_Write(8,ehours); Time_Wrt(); } */ } } void FlashWrite(int adr,short dat) { short adrh; short adrl; portc+=2; adrh=(adr/256)*2+160; adrl=adr%256; I2C_Start(); I2C_Wr(adrh); I2C_Wr(adrl); I2C_Wr(dat); ind(i); Delay_ms(1); ind(i); Delay_ms(1); ind(i); I2C_Stop(); Delay_ms(1); ind(i); Delay_ms(1); portc-=2; } void time() { if(seconds-cnt>=1) { timesecs++; cnt=seconds; } if(bminutes==minutes&&bhours==hours) { tmflg=1; } if(eminutes==minutes&&ehours==hours) { tmflg=0; } } void Time_Rd() { ind(i); Soft_I2C_Start(); ind(i); Soft_I2C_Write(0xD0); ind(i); Soft_I2C_Write(0); ind(i); Soft_I2C_Stop(); ind(i); ind(i); Soft_I2C_Start(); ind(i); Soft_I2C_Write(0xD1); ind(i); seconds=Soft_I2C_Read(1); ind(i); minutes=Soft_I2C_Read(1); ind(i); hours=Soft_I2C_Read(0); ind(i); seconds=seconds%16+(seconds%128)/16*10; //minutes=minutes%16+(minutes%128)/16*10; //hours=hours%16+(hours%32)/16*10; } void Time_Cmpr() { int j=bhours+1; tmflg=0; for(j;j!=ehours;j++) { if(j==24) { j=0; } if(j==hours) { tmflg=1; } else { if(hours==bhours&&minutes>bminutes) { tmflg=1; } } } } void main() { short j=0; trisa=32; trisb=0; trisc=0xc0; adcon0=1; adcon1=0; t1con=49; Usart_Init(1200); I2C_Init(100000); Soft_I2C_Config(&PORTC,0,5); up=Eeprom_Read(0)+Eeprom_Read(1)*256; dn=Eeprom_Read(2)+Eeprom_Read(3)*256; bminutes=Eeprom_Read(4); bhours=Eeprom_Read(5); eminutes=Eeprom_Read(6); ehours=Eeprom_Read(7); portc=4; //Time_Wrt(); Time_Rd(); dp=8; Time_Cmpr(); i[0]=minutes%16; i[1]=(minutes%128)/16; i[2]=hours%16; i[3]=(hours%128)/16; while(j<100) { Delay_ms(1); ind(i); j++; } while(1) { ind(i); time(); ind(i); if(adc==0) { dp=0; ind(i); if(timesecs>=10) { Time_Rd(); timesecs=0; } i[0]=minutes%16; i[1]=(minutes%128)/16; i[2]=hours%16; i[3]=(hours%128)/16; ind(i); ind(i); if(Adc_Read(4)!=0) { adc=1; } } else { dp=2; ind(i); form(); ind(i); if(alflg<1&&(adc>up||adc=1&&(adcdn)) { portc=32; alflg=0; } ind(i); if(tmflg>0) { if(timesecs>=1&&alflg<1) { timesecs=0; FlashWrite(cntadr,wrdat%256); FlashWrite(cntadr+1,wrdat/256); cntadr+=2; } if(timesecs>=60&&alflg>=1) { timesecs=0; FlashWrite(cntadr,wrdat%256); FlashWrite(cntadr+1,wrdat/256); cntadr+=2; } } } ind(i); //FlashWrite(0x7,55); //FlashWrite(0x4,0x55); //FlashWrite(0x1,0x55); //Send(); ind(i); } }