我们将计时器存储在EEPROM_Write中,但由于未知原因数据被清除。非常感谢您的帮助。 简而言之,如果您有一个代码来运行PIC 18F452中的终身计时器(自行车里程表,系统断电时存储最后阶段并从最后一点恢复),请与我们分享。
<pre>
/*
==============================LCD
EN RB0 PIN # 33
RS RB1 PIN # 34
D4 RB4 PIN # 37
D5 RB5 PIN # 38
D6 RB6 PIN # 39
D7 RB7 PIN # 40
MICROCHIP
*/
unsigned int time = 0;
unsigned int sec=0;
unsigned int minutes=0;
unsigned int hour=0;
char Select_Mode=0;
unsigned int LT_minutes;
unsigned int LT_hour;
char txt2[]="0000000000";
char txt3[]="000000000000";
char txt4[]="0000000000";
char txt5[]="0000000000";
char txt10[]="000000000000";
char txt11[]="000000000000";
// LCD module connections
sbit LCD_RS at RB1_bit;
sbit LCD_EN at RB0_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB1_bit;
sbit LCD_EN_Direction at TRISB0_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections
//char uart_rd;
char txt8[] = "Tele Fun";
char txt9[] = "0900-78601";
//Timer1
//Prescaler 1:8; TMR1 Preload = 3035; Actual Interrupt Time : 100 ms
//Place/Copy this part in declaration section
void InitTimer1(){
T1CON = 0x31;
TMR1IF_bit = 0;
TMR1H = 0x6D;
TMR1L = 0x84;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
void Interrupt(){
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H = 0x6D;
TMR1L = 0x84;
//Enter your code here
time++;
// time 1 = 100ms, time 2 = 200ms
if (time==10){
time=0;
sec++;
if (sec==60){sec=0;minutes++;LT_minutes++;}
if (minutes==60){minutes=0;hour++;}
if (LT_minutes==60){
//EEPROM_Write(0x03,LT_minutes);
LT_minutes=0;
LT_hour++;
//EEPROM_Write(0x04,LT_hour);
}
if (LT_hour==9999){LT_hour=0;}
}
}
}
void main() {
ADCON0=0b00010101;
ADCON1=0b10001110;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
TRISE0_bit = 0; // set RB0 pin as output
TRISE1_bit = 0;
LT_minutes = EEPROM_Read(0x03);
if ((LT_minutes>=0)&&(LT_minutes<=60))LT_minutes = EEPROM_Read(0x03);
else EEPROM_Write(0x03,0);LT_minutes = EEPROM_Read(0x03);
delay_ms(10);
if ((LT_hour>=0)&&(LT_hour<=9999))LT_hour = EEPROM_Read(0x04);
else EEPROM_Write(0x04,0);LT_hour = EEPROM_Read(0x04);
delay_ms(10);
if (LT_hour==255){LT_hour=0;}
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
InitTimer1();
while (1) { // Endless loop
if (sec==15){
EEPROM_Write(0x03,LT_minutes);
EEPROM_Write(0x04,LT_hour);
}
Lcd_Out(1,11," "); // Write text in first row
Lcd_Out(2,9," "); // Write text in first row
Lcd_Out(1,1,"LT"); // Write text in first row
Lcd_Out(2,1,"RT"); // Write text in first row
Lcd_Out(2,6,":"); // Write text in first row
Lcd_Out(1,8,":"); // Write text in first row
Lcd_Out(3,2,txt8); // Write text in first row
Lcd_Out(4,5,txt9); // Write text in first row
WordToStrWithZeros(minutes, txt2);
WordToStrWithZeros(hour, txt3);
EEPROM_Write(0x03,LT_minutes);
EEPROM_Write(0x04,LT_hour);
WordToStrWithZeros(LT_minutes, txt10);
WordToStrWithZeros(LT_hour, txt11);
Lcd_Chr(1,4,txt11[1]); // LT H
Lcd_Chr(1,5,txt11[2]); // LT H
Lcd_Chr(1,6,txt11[3]); // LT H
Lcd_Chr(1,7,txt11[4]); // LT H
Lcd_Chr(1,9,txt10[3]); // LT M
Lcd_Chr(1,10,txt10[4]); // LT M
Lcd_Chr(2,7,txt2[3]);
Lcd_Chr(2,8,txt2[4]);
Lcd_Chr(2,4,txt3[3]);
Lcd_Chr(2,5,txt3[4]);
}
}
<code>
答案 0 :(得分:1)
如果你在断电时写入EEPROM,我会说要检查写入EEPROM需要多长时间,我认为你可能在写入EEPROM之前完全失去电源。 如果问题与硬件有关并且在断电时特别丢失,则可以在VCC-GND之间放置一些电容以存储一些额外的功率。