|
R2JD1LO~GM~CMDQ6YM[DUA4.png (18.87 KB, 下載次數(shù): 40)
下載附件
按鍵有效,判斷即將進(jìn)入case 1:
2018-7-5 09:57 上傳
MBZDGBF7Q1XDI1_}P}57NLN.png (17.98 KB, 下載次數(shù): 52)
下載附件
沒有進(jìn)入case:1 直接跳出switch
2018-7-5 09:57 上傳
- #include "BS87D20A-3.h"
- #define com1 _pc1
- #define com2 _pc0
- #define com3 _pc2
- #define com4 _pc3
- #define key1 _pd2
- #define key2 _pd3
- #define key3 _pa1
- #define key4 _pa4
- //#define key_state_0 0 //按鍵的初始狀態(tài)
- //#define key_state_1 1 //按鍵按下的狀態(tài)
- //#define key_state_2 2 //按鍵釋放的狀態(tài)
- volatile bit Flag_T5ms;
- volatile bit Flag_T10ms;
- volatile bit Flag_T1s;
- const unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- unsigned char strtab[3];//緩沖區(qū)
- unsigned char key_number=0;
- unsigned char sec=0,min=0,hour=0;
- unsigned char temp;
- unsigned long s; //秒級
- unsigned long ms10;//毫秒
- unsigned long ms5;
- unsigned char n;
- enum key_states_e{
- key_s1,
- key_s2,
- key_s3,
- key_s4
- };
- void read_key()
- {
- static enum key_states_e key_state=key_s1;
- // static char key_state;
- static int press=0;
- unsigned char key_press; //按鍵是否被按下
- //key_state=0; //按鍵的狀態(tài)
- key_press=key1; // 讀按鍵I/O電
- switch (key_state)
- {
- case key_s1: // 按鍵初始態(tài)
- if (!key_press)
- {
- key_state=key_s2; // 鍵被按下,狀態(tài)轉(zhuǎn)換到鍵確認(rèn)態(tài)
-
- }
- else key_state=key_s1;
- break;
-
- case key_s2: // 按鍵確認(rèn)態(tài)
- if (!key_press)
- {
- key_state=key_s3;
- }
- else
- {
- key_state=key_s1; // 按鍵已抬起,轉(zhuǎn)換到按鍵初始態(tài)
- }
- break;
-
- case key_s3:
- if (!key_press)
- {
- key_state=key_s3;//按鍵確認(rèn)按下狀態(tài)
-
- com4=~com4;
- _pb=tab[2];
- }
- else
- {
- key_state=key_s1;
- }
- case key_s4:
- if(key_press)
- {
- key_state=key_s1;
- }
- break;
- default: key_state=key_s1; press=0; break;
- }
- }
- void displaypro()
- {
- strtab[0]=tab[sec%10];
- strtab[1]=tab[sec/10];
- strtab[2]=tab[min%10];
- strtab[3]=tab[min/10];
- }
- void display_drive()
- {
- com1=1;com2=1;com3=1;com4=1;
- switch(temp)
- {
- case 0:com4=0;
- _pb=strtab[temp]; break;
- case 1:com3=0;
- _pb=strtab[temp]; break;
- case 2:com2=0;
- _pb=strtab[temp]; break;
- case 3:com1=0;
- _pb=strtab[temp]; break;
- default:break;
- }
- temp++;
- if(temp==4)
- temp=0;
- }
- void init()
- {
- _ctm0c0=0x20; // fh/16 2us
- _ctm0c1=0xc1; // 定時/計數(shù)器模式 比較器a
- _ctm0al=0xf4; // 1ms
- _ctm0ah=0x01;
-
- _pbc=0; //輸出
- _pcc0=0;
- _pcc1=0;
- _pcc2=0;
- _pcc3=0;
-
- _pac1=1;
- _pac4=1;
- _pdc2=1;
- _pdc3=1;
- _pdpu3=1;
- _pdpu2=1;
- _papu1=1;
- _papu4=1;
- s=1000;
- ms10=10;
- ms5=5;
- temp=0;
- n=0;
- _mfe=1; //開多功能中斷
- _ctm0ae=1; //CTM a中斷使能
- _emi=1; //開總中斷
- _ct0on=1; //開定時器
- com1=1;com2=1;com3=1;
- com4=1;
- }
- void main()
- {
- init();
- while(1)
- {
-
- if(Flag_T5ms)
- {
- Flag_T5ms=0;
-
- }
- if(Flag_T1s)
- {
- Flag_T1s=0;
- //displaypro();
- }
-
- if(Flag_T10ms) //10MS進(jìn)入一次
- {
- Flag_T10ms=0;
- read_key();
- }
-
- GCC_CLRWDT();
- }
- }
-
- void __attribute__((interrupt(0x14))) ISR_CTMO(void)
- {
- _ctm0af=0;
- s--;
- ms5--;
- ms10--;
- if(! ms5)
- {
- ms5=5;//5MS 視覺暫留
- Flag_T5ms=1;
-
- }
- if(!ms10)
- {
- ms10=10;
- Flag_T10ms=1;
- }
- if(! s)
- {
- Flag_T1s=1;
- s=1000;//1s電子鐘計數(shù)
- sec++;
- if(sec==60)
- {
- sec=0;
- min++;
- if(min==60)
- {
- min=0;
- hour++;
- if(hour==24)
- {
- hour=0;
- }
- }
- }
- }
- }
復(fù)制代碼 |
|