找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

case key_s3 : 怎么實現(xiàn)長短按?

查看數(shù): 2226 | 評論數(shù): 3 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2018-7-5 10:00

正文摘要:

#include "BS87D20A-3.h" #define com1    _pc1 #define com2        _pc0 #define com3        _pc2 #define com4   & ...

回復(fù)

ID:358998 發(fā)表于 2018-7-6 17:42
已完成長短按。。。


#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
volatile bit Flag_T1ms;
volatile bit Flag_T5ms;
volatile bit flag_keylong;
volatile bit flag_keyshort;

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 ms5;

unsigned char keyvalue;
void read_key()
{  
        static char key_state=0x00,press_20ms;
    unsigned char        keybak;       
    keybak=0;
        if(!key1)keybak|=0x01;
        if(!key2)keybak|=0x02;
        if(!key3)keybak|=0x04;
        if(!key4)keybak|=0x08;
   
    switch (key_state)
    {
        case 0x00:                 // 按鍵初始態(tài)
                if (keybak!=0)
                        {       
                                press_20ms=0;
                                key_state=0x01; // 鍵被按下,狀態(tài)轉(zhuǎn)換到鍵確認態(tài)
                               
                }
                        break;               
        case 0x01:                  // 按鍵確認態(tài)
            if (keybak!=0)
            {
                    if(++press_20ms>3)
                    {
                            key_state=0x02;
                            press_20ms=0;
                            keyvalue=keybak;               
                    }
            }
            else
            {
                    key_state=0x00;       
            }
            break;
                case 0x02:
                        if (keybak==0)
                        {
                                flag_keyshort=1;
                        }
                        else if(++press_20ms>100)
                        {
                                flag_keylong=1;
                        }       
        case 0x04:
            if(keybak==0)
            {
                    if(++press_20ms>3)
                    {
                            key_state=0x00;
                    }
            }
            else
            {
                    press_20ms=0;
            }
            break;
       
        default:
                break;
   }
}
void key_do()
{
        if(flag_keyshort)
        {
                switch(keyvalue)
                {
                        case 0x01:

                                break;
                        case 0x02:
                               
                                break;
                        case 0x04:
                               
                                break;
                        case 0x08:
                               
                                break;
                        default:
                                break;
                }
                flag_keyshort=0;
        }
}

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 ctm0
        _ctm0al=0xf4; // 1ms
    _ctm0ah=0x01;
       
        _ctm1c0=0x20;  // fh/16   2us        
        _ctm1c1=0xc1; // 定時/計數(shù)器模式 比較器a ctm1
        _ctm1al=0xf4; // 1ms
    _ctm1ah=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;
         ms5=5;
         temp=0;
        _mfe=1; //開多功能中斷
        _ctm1ae=1;
    _ctm0ae=1; //CTM a中斷使能
        _emi=1;        //開總中斷
        _ct0on=1; //開定時器0
        _ct1on=1;
        }
        void main()
        {
                init();
                while(1)
                {
                        if(Flag_T5ms)
                        {
                                Flag_T5ms=0;
                                read_key();
                                displaypro();
                               
                        }
       
                       
                        GCC_CLRWDT();
                }
        }
       
        void __attribute__((interrupt(0x20))) ISR_CTM1(void)
        {
                _ctm1af=0;
                ms5--;
                if(!ms5)
                {
                        ms5=5;
                        Flag_T5ms=1;
                }
                display_drive();
                s--;
                if(! s)
                {   
                       
                        s=1000;//1s電子鐘計數(shù)
                        sec++;       
                        if(sec==60)
                        {
                               sec=0;
                               min++;
                               if(min==60)
                               {
                                        min=0;
                                         hour++;
                                        if(hour==24)
                                        {
                                                  hour=0;
                                        }               
                               }
                       }       
                }
               
        }
       
        void __attribute__((interrupt(0x14))) ISR_CTMO(void)
        {
                _ctm0af=0;
               
        }

       
       
       
       

評分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎勵!

查看全部評分

ID:358998 發(fā)表于 2018-7-5 15:26
調(diào)整后



#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_T1ms;
volatile bit Flag_T10ms;
volatile bit flag_cont;
volatile bit flag_trg;
static int key_10ms=0;
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_10ms=0;
        static int press=100;
        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)
                        {       
                                flag_cont=0;
                                flag_trg=0;
                                press_10ms=0;
                                key_state=key_s2; // 鍵被按下,狀態(tài)轉(zhuǎn)換到鍵確認態(tài)
                               
                }
                else key_state=key_s1;
                        break;
                                       
        case key_s2:                  // 按鍵確認態(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;//按鍵確認按下狀態(tài)  
               
                                press_10ms++;
                                if(press_10ms>100)
                          {
                                  flag_trg=0;
                                  flag_cont=1;
                                  if(flag_cont)
                                  {       
                                         
                                          com3=0;       
                                          press--;
                                          if(!press)
                                          {
                                          press=100;
                                          _pb=tab[n++];
                                          if(n>9)
                                          n=0;
                                          }
                                  }
                           }
                                if(press_10ms>10)
                                {
                                        flag_cont=0;
                                        flag_trg=1;
                        /*                if(flag_trg)
                                        {
                                                com2=~com2;
                                                _pb=tab[2];
                                        }*/
                               
                                }


            }
            else
            {
                    key_state=key_s1;
            }
                case key_s4:
                        if(key_press)
                        {
                                if(n>9)
                          {n=0;}
                                _pb=tab[n];
                        //        com3=1;
                                flag_trg=0;
                                flag_cont=0;
                                press_10ms=0;
                                key_state=key_s1;
                                }
            break;
        default: key_state=key_s1; press_10ms=0;flag_cont=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_T1ms)
                        {
                        Flag_T1ms=0;
                        key_10ms++;
                        if(key_10ms==10)
                        {
                        key_10ms=0;
                        read_key();
                        }

                        }
                       
                        GCC_CLRWDT();
                }
        }
       
        void __attribute__((interrupt(0x14))) ISR_CTMO(void)
        {
                _ctm0af=0;
                s--;
                Flag_T1ms=1;
                if(! s)
                {   
                        s=1000;//1s電子鐘計數(shù)
                        sec++;       
                if(sec==60)
                {
               sec=0;
               min++;
               if(min==60)
               {
                min=0;
                 hour++;
                if(hour==24)
                {
                  hour=0;
                }
               }
               }
                }
        }

       
       
       
       
ID:358998 發(fā)表于 2018-7-5 12:51
本帖最后由 zzffw 于 2018-7-5 12:56 編輯

靜靜等待

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表