新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR簡單好用的4x4矩陣鍵盤

        AVR簡單好用的4x4矩陣鍵盤

        作者: 時間:2016-11-10 來源:網絡 收藏
        // Target : ATMEGA16

        // Crystal: 8.0000Mhz

        本文引用地址:http://www.104case.com/article/201611/317335.htm

        //key.h

        #ifndef _4X4_H_
        #define _4X4_H_

        #define No_key 255

        #define key_port PORTB
        #define key_port_ddr DDRB
        #define key_port_pin PINB


        unsigned char keyboard_Scan(void);

        #endif

        //key.c

        #include
        #include

        #include "key.h"

        const unsigned char key_table[16] =
        {
        1, 2, 3,12,
        4, 5, 6,13,
        7, 8, 9,14,
        10,0,11,15,
        };

        void delay_1ms(void)//1ms延時函數
        {
        unsigned int i;
        for (i=0;i<1140;i++);
        }

        void delay_nms(unsigned int n)//N ms延時函數
        {
        unsigned int i=0;
        for (i=0;i delay_1ms();
        }

        //4x4矩陣鍵盤掃描函數

        unsigned char keyboard_Scan(void)
        {
        unsigned char temp,key,row,Column;

        key_port_ddr = 0b00001111;// 高四位輸入行線/低四位輸出列線
        key_port= 0b11110000;// 高四位打開上拉電阻/低四位輸出低電平
        delay_nus(5);// 延時5us
        if((key_port_pin & 0xF0)!= 0xF0)// 作初檢查有否鍵按下,沒有,就返回
        {// 如果行線不全為1,可能有鍵按下
        delay_nms(5);// 延時去抖動

        //設置列線初始值3~0=1110
        for(Column=0,key_port=0b11111110;Column<4;Column++)
        {
        for(row=0,temp=0b11101111;row<4;row++)// 設置行線初始值7~4=1110
        {
        while((key_port_pin & 0xF0)==(temp & 0xF0))// 輸入行線,查看這行有否鍵按下
        {
        key=4*row+Column;// 鍵編碼=4*行輸入值+列掃描值
        key=key_table[key];// 鍵盤編碼轉換鍵值
        return (key);
        }
        temp<<=1;// 行線左移1位
        }
        key_port=((key_port<<1)|0x01);// 列線掃描值左移1位,掃描下一行
        }
        }
        return (No_key);
        }

        //main.c

        #include
        #include

        #include "key.h"

        voidmain(void)
        {
        unsigned char Key;
        while(1)
        {
        Key = keyboard_Scan();// 鍵盤掃描
        switch(Key)
        {
        case 0:
        break;

        ......

        default:
        break;
        }
        }
        }

        主函數中的延時個人覺得最好還是用定時器

        電路接法不同可修改key_table數組



        關鍵詞: AVR4x4矩陣鍵

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 板桥市| 沂源县| 浦北县| 太湖县| 萝北县| 家居| 遂溪县| 房产| 定远县| 千阳县| 吉林省| 华宁县| 手游| 鹰潭市| 高密市| 仙桃市| 苏尼特右旗| 灵川县| 宜阳县| 渑池县| 南雄市| 花垣县| 宿松县| 环江| 土默特右旗| 轮台县| 金川县| 玉环县| 陇川县| 万载县| 巴彦县| 三穗县| 清镇市| 昆山市| 安西县| 鄢陵县| 田阳县| 阜新市| 农安县| 丰城市| 德兴市|