新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機4X4矩陣鍵盤驅動與應用程序(C語言)

        51單片機4X4矩陣鍵盤驅動與應用程序(C語言)

        作者: 時間:2016-11-18 來源:網絡 收藏
        1、keydrive.c
        #include
        #include
        /*
        程序功能: 本程序用于測試4X4矩陣鍵盤驅動;
        程序算法:
        每2MS檢測一次按鍵的狀態,若連續8次檢測都為相同,
        說明現在是一個穩定的狀態,否就是干擾不與理采 ;
        按鍵有三種狀態:1、按下 2、松開 3、干擾或抖動
        其中前兩種都是穩態,后一種為抖動。
        接著若判斷按鍵的狀態是否改變,
        若改變--》判斷原來的狀態是否為松開---是--說明
        現在按鍵為按下,那么就把鍵值算出來;---返回0;
        若改變--》判斷原來的狀態是否為松開---否--說明
        現在按鍵為松開,那么就把鍵值返回;
        */
        /*
        矩陣鍵盤硬件引腳連接關系
        */
        /*
        keyin4 ----- P2^7;
        keyin3 ----- P2^6;
        keyin2 ----- P2^5;
        keyin1 ----- P2^4;
        keyout1 ----- P2^3;
        keyout2 ----- P2^2;
        keyout3 ----- P2^1;
        keyout4 ----- P2^0;
        */
        /*
        定義外部變量
        *///lcd1602顯示數組
        unsigned char keynum[]="keynum:k ";
        //鍵值查詢數組
        //k1,k2,k3,k4,k5,k6,k7,k8,
        unsigned char code keytabel[]={0xe7,0xd7,0xb7,0x77,0xeb,0xdb,0xbb,0x7b,
        //k9,k10,k11,k12,k13,k14,k15,k16,
        0xed,0xdd,0xbd,0x7d,0xee,0xde,0xbe,0x7e};
        unsigned char status1;
        /*
        外部函數聲明
        */
        extern bit Flag2Ms; //2ms到標志 鍵盤驅動中要用到這個外部變量
        extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
        /*
        函數功能:N毫秒延時
        */
        void DelayMs(unsigned int ms)
        {
        unsigned int i,j;
        for(i=0;i
        for(j=0;j<113;j++);
        }
        /*
        函數功能:矩陣鍵盤掃描
        在該函數只是判斷按鍵的狀態,即按下還是彈起;設置按鍵狀態標置位;
        算法:采用狀態機的機制
        */
        void keyscan()
        {
        static unsigned char num1,keyon_num,num2; //設置為局部靜態變量
        /*
        num1---保存P2口狀態
        num2---保存次數 ,每次時間為2ms;
        keyon_num----保存按下次數
        */
        if(Flag2Ms==1) //2MS時間到
        {
        Flag2Ms=0;
        num2++;
        P2 = 0xf0;
        num1=P2;
        if(num1!=0xf0)
        keyon_num++;
        if(num2==8) //若連續8次檢測都為同一個狀態說明按鍵是一個穩定的狀態;
        { //否則就是一個干擾,或者說是一次抖動; 時間為16MS;
        num2=0;
        if(keyon_num==8)
        status1=1; //按鍵已按下
        else if(keyon_num==0)
        status1=0; //按鍵已彈起
        else
        status1=2; //按鍵無效,是干擾
        keyon_num=0; // 一定要復位該值;
        }
        }
        }
        /*
        函數功能:獲取鍵值
        算法: 先判斷按鍵的狀態是否改變,若改變--》判斷原來的狀態是否為松開---是--說明
        現在按鍵為按下,那么就把鍵值算出來;---返回0;
        若改變--》判斷原來的狀態是否為松開---否--說明
        現在按鍵為松開,那么就把鍵值返回;
        若按鍵的狀態沒有變化,就返回0;
        */
        unsigned char getkey()
        {
        static unsigned char backstatus=0; //原來按鍵的狀態,初始設為0,即松開狀態;
        static unsigned char temp,num3; //定義兩個局部靜態變量;
        if((backstatus!=status1)&&(status1!=2))
        {
        if(backstatus==0) //若原來狀態為松開,就求出鍵值,但返回0;
        {
        P2=0xf0;
        num3=P2;
        temp=num3;
        P2 = 0x0f;
        num3=P2;
        temp =temp|num3;
        backstatus=status1; //備份按鍵狀態
        return 0;
        }
        backstatus=0; //若原來狀態為按下,說明現在為松開
        return temp; //返回鍵值;
        }
        return 0; //若狀態沒有改變,則返回0;
        }
        /*
        函數功能:按鍵功能處理函數
        在該函數中,收到按鍵后,就把相關的鍵值通過LCD1602顯示;
        并通過串口顯示:keynum:kxx” xx為按k1-k16;
        */
        void key_functoin(unsigned char keynum1)
        {
        unsigned char i;
        if(keynum1!=0) //有鍵按下并松手
        {
        for(i=0;i<16;i++) // 循環查表,獲取按鍵編號
        {
        if(keynum1==keytabel[i])
        break;
        }
        keynum[8]=(i+1)/10+0x30; //把編號轉換成字符放到顯示數 組中;
        keynum[9]=(i+1)%10+0x30;
        TI=1; //把按鍵值發送到串口;
        printf("%s",keynum); //在串口上顯示“keynum:kxx” xx為按k1-k16;
        while(TI!=1); //每次發送完畢,要手動清TI標志;
        TI=0;
        LcdShowStr(0,0,keynum); //1602顯示按鍵編號
        }
        }
        2、keytest.c
        #include
        #include
        /*
        程序功能: 本程序用于測試4X4矩陣鍵盤;
        當按下按鍵后,在LCD1602上顯示出按下的鍵號如:K1 K2.... K16;
        同時把鍵值通過串口發送到口上顯示;
        在串口上顯示“keynum:kxx” xx為按k1-k16;
        程序用到的資源:1、定時器T0、T1 2、P2口 3、LCD1602 4、串行口
        程序作者:王廬山
        程序編制日期:2015年3月13日
        地址:湖北工業職業技術學院電子工程系電子創新中心
        注意:在本程序中,把鍵盤相關的處理函數都寫在鍵盤驅動中;
        使用模塊化編程;本程序在金沙灘開發板上測試通過。
        */
        //宏定義
        #define TH0_NUM 1000 //便于程序的移植;
        #define TL0_NUM 1000
        bit Flag2Ms; //2ms到標志
        unsigned char code demo[]="key_4x4 " ;
        unsigned char code demo1[]="scaning..." ;
        /*
        外部函數聲明
        */
        extern void InitLcd1602();
        extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
        extern void ConfigUART(unsigned int baud);
        extern void DelayMs(unsigned int ms);
        extern void keyscan();
        extern unsigned char getkey();
        extern void key_functoin(unsigned char keynum1);
        //內部函數聲明
        void InitTimer0();
        /*
        主程序
        */
        void main()
        {
        InitTimer0(); //定時0初始化
        ConfigUART(9600); //串口初始化
        InitLcd1602(); //1602初始化
        LcdShowStr(0,0,demo); // 顯示字符串
        LcdShowStr(0,1,demo1); // 顯示字符串
        while(1)
        {
        keyscan(); //按鍵掃描
        key_functoin(getkey());//根據獲取的鍵,進行相關的處理;
        }
        }
        /*
        函數功能:定時器0初始化,設定每1MS中斷一次
        */
        void InitTimer0()
        {
        TMOD &=0xf0; //這種操作模式,不會破壞寄存器的其它設置;
        TMOD |=0x01; //方式1,16位定時器
        TH0/=(65536-TH0_NUM)/256;
        TL0=(65536-TL0_NUM)%256;
        EA=1;
        ET0=1;
        TR0=1;
        }
        /*
        函數功能:定時器0中斷服務程序
        */
        void Timer0_Interrupt() interrupt 1
        {
        static unsigned char i;
        TH0=(65536-TH0_NUM)/256;
        TL0=(65536-TL0_NUM)%256;
        i++;
        if(i>2)
        {
        i=0;
        Flag2Ms=1;
        }
        }



        關鍵詞: 51單片機矩陣鍵

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 左贡县| 东阳市| 镇安县| 安国市| 平凉市| 柳林县| 塔河县| 辽阳市| 卢龙县| 凤台县| 忻州市| 阳高县| 河东区| 彭州市| 阳朔县| 南靖县| 成安县| 乌鲁木齐县| 虞城县| 新巴尔虎右旗| 沁阳市| 多伦县| 资源县| 交口县| 平乐县| 深水埗区| 新兴县| 融水| 江山市| 冷水江市| 沁水县| 宁化县| 阜康市| 正蓝旗| 扬州市| 聊城市| 安陆市| 兰考县| 柳河县| 长治市| 丁青县|