void main()
{
u16 num; //AD2電壓檢測變量
float ADCBat,stress; //壓力計算中間變量
P0M1 = 0x00; P0M0 = 0x00; //設置為準雙向口
P2M1 = 0x00; P2M0 = 0x00; //設置為準雙向口
P3M1 = 0x00; P3M0 = 0x00; //設置為準雙向口
P5M1 = 0x00; P5M0 = 0x00; //設置為準雙向口
led1=0; md1=0; Beep=0;
Timer0Init(); //定時器0調用
Timer1Init(); //定時器1調用
STC8ADC_INIT(); //adc.c模塊ADC獲取子程序調用
EA=1; //中斷總開關
while(1)
{
ADCBat = line_bat_0-line_bat_1; //AD0-AD1的結果賦給ADCBat無符號整型變量
if(0<ADCBat<150) //當壓力值介于0PSI到150PSI之間時,遵循線性變換公式:y=(115-15)/(243-13)*X+15kpa
{
stress=((10.0/11.4)*ADCBat)-18.5; //測試時補償值為-18.5
press=stress*10; //放大10倍,便于后面計算
}
num=1.022*line_bat_2*1000/4095; //電量計算
if (num>776) DAT=3; // 776 四格
else if (num>710) DAT=2; // 710 三格
else if (num>660) DAT=1; // 664 二格
else if (num>610) DAT=0; // 613 一格
dis_Service(); //顯示服務函數
DaQi(); //打氣服務函數
}
}
上面主函數里定時器 Timer1Init(); 調用過keynum1值顯示,下面是按鍵函調用過EEPROM的讀和寫,也沒看到重復調用的問題呀?請大神指點一下!
void key_scan()
{
static unsigned char state=S0,key_time;
unsigned char key;
key=P3&0x1f; //屏蔽P1低四位
switch(state) //檢測狀態
{
case S0: //狀態0
if(key!= 0x1f) state = S1; break; //判斷輸入是否為0,為0轉入狀態1
case S1: //狀態1
if(key==0x1f) state = S0; //判斷輸入是否為1,為1返回狀態0
else //否則,轉入狀態2,執行按鍵程序
{
state=S2;
switch(key)
{
case 0x1E:
switch(wnd)
{
case 0:T1Cnt=epxs_short; keynum1 = Read_EEPROM_u16(0x0200); SSCnt=0; flag=0; keyflag=0; if(keynum1>1049) keynum1=30; if(flag==0 && keyflag==0){if(keynum1<1000) keynum1 = keynum1+5; else keynum1++;} Save_EEPROM_u16(0x0200, keynum1);Setflag=1; break; //psi:0~150,0~100加5,到100退位顯示100~150加1
case 1:T1Cnt=epxs_short; keynum2 = Read_EEPROM_u16(0x0400); SSCnt=0; flag=0; keyflag=0; if(keynum2>1002) keynum2=20; if(flag==0 && keyflag==0){if(keynum2<1000) keynum2 = keynum2+5; else keynum2++;} Save_EEPROM_u16(0x0400, keynum2);Setflag=1; break; //BAR:0.2-10.3
case 2:T1Cnt=epxs_short; keynum3 = Read_EEPROM_u16(0x0600); SSCnt=0; flag=0; keyflag=0; if(keynum3>994) keynum3=20; if(flag==0 && keyflag==0){ keynum3 = keynum3+5; } Save_EEPROM_u16(0x0600, keynum3);Setflag=1; break; //kpa:20-995
case 3:T1Cnt=epxs_short; keynum4 = Read_EEPROM_u16(0x0800); SSCnt=0; flag=0; keyflag=0; if(keynum4>1002) keynum4=20; if(flag==0 && keyflag==0){if(keynum4<1000) keynum4 = keynum4+5; else keynum4++;} Save_EEPROM_u16(0x0800, keynum4);Setflag=1; break; //kg/cm:0.2-10.5
}
FMQCnt = FMQ_short; //按鍵聲音觸發,滴一聲就停。
break;
void timer1_ISR(void) interrupt 3 //定時器中斷1,中斷號:3
{
TR1=0; //定時器1計時關閉
//定時設定值3S顯示
if(T1Cnt != 0) //如果T1Cnt不等于0
{
T1Cnt--; //每次進入定時中斷都自減1,直到等于零為止。
keyflag=1; //3S到keyflag=1:讀EEPROM值,顯示3S按鍵調整值
switch(wnd) //不同窗口顯示按鍵值
{
case 0: parm1 = keynum1; break;
case 1: parm2 = keynum2; break;
case 2: parm3 = keynum3; break;
case 3: parm4 = keynum4; break;
default:break;
}
}
else
{
keyflag=0; //3S到keyflag=0:退出顯示壓力值
switch(wnd) //不同窗口顯示壓力值
|