新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機矩陣鍵盤程序(2種方法)

        AVR單片機矩陣鍵盤程序(2種方法)

        作者: 時間:2016-11-29 來源:網絡 收藏

        void main()
        {
        DDRD|=0xff;//設置PB口為輸出
        PORTD|=0xff;//PB輸出為高電位
        DDRD&=0x0f;//設置高
        while(1)//大循環
        {
        skk();
        disy();//調用顯示子程序
        }
        }
        void delay(uchar z)//延時子函數
        {
        uchar x,y;
        for(x=100;x>0;x--)
        for(y=z;y>0;y--);
        }
        void disy()//顯示子函數
        {
        DDRC=0xff;
        DDRB=0xff;
        PORTB=table[num];
        PORTC=0x00;
        }

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

        簡單方法:

        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        #pragma data:code//定義程序存在ROM里面
        const table[]={
        0xc0,0xf9,0xa4,0xb0,0x99,
        0x92,0x82,0xf8,0x80,0x90,
        0x88,0x83,0xc6,0xa1,0x86,
        0x8e,0xff
        };
        /***********************************************/
        /*******************延時子程序******************/
        /***********************************************/
        void delay(uchar z)
        {
        uchar x,y;
        for(x=0;x<50;x++)
        for(y=0;y}
        /***********************************************/
        /*******************顯示子程序******************/
        /***********************************************/
        void xian(uchar num)
        {
        uchar i;
        PORTB=table[num];//十位
        PORTC=0x00;
        }
        /***********************************************/
        /***************按鍵按下處理程序***************/
        /***********************************************/
        uchar key_press()
        {
        uchar i;
        DDRD=0XFF;//設置PD口全為輸出
        PORTD=0XF0;//設置PD高四位為高電平,以便進行判斷
        DDRD=0X0F;//設置高4位為輸入,低4位為輸出
        i=PIND;//讀出IO口狀態
        if(i==0XF0)//如果它等于0XF0就執返回0
        {
        DDRD=0XFF;//將IO口值讀回來
        return 0;
        }
        else//否則它就執返回1
        {
        DDRD=0XFF;
        return 1;
        }
        }
        /***********************************************/
        /***************按鍵鍵值處理程序***************/
        /***********************************************/
        uchar key_scan()
        {
        uchar key,i=0X7F,j;//將變量I設置為01111111B
        if(key_press())//判斷按鍵是否被按下了
        {
        delay(10);//如果被按下了,消下抖
        if(key_press())//再次判斷下按鍵是否被按下了
        {
        do//先執行一次
        {
        i=(i<<1|i>>7);/*將變量I內容左移1位,11111110
        然后將I右移7位,11111110,即實現11111110
        11111101 11111011 11110111*/
        PORTD=i;//將移位后的值給PD口
        DDRD=0X0F;//將PD口高位設為輸入,低位設為輸出
        key=PIND;//將IO口高位值讀一下
        j=key&0XF0;//只需要讀高4位
        }
        while(j==0XF0);//如果按鍵沒有按下,則再執行上面的do語句
        while(key_press());//如果有按下則釋放一下
        switch(key)//確定有按鍵按下了就判斷下到底是哪個值
        {
        case 0xEE:
        key=0x0;
        break;
        case 0xDE:
        key=0x1;
        break;
        case 0xBE:
        key=0x2;
        break;
        case 0x7E:
        key=0x3;
        break;
        case 0xED:
        key=0x4;
        break;
        case 0xDD:
        key=0x5;
        break;
        case 0xBD:
        key=0x6;
        break;
        case 0x7D:
        key=0x7;
        break;
        case 0xEB:
        key=8;
        break;
        case 0xDB:
        key=9;
        break;
        case 0xBB:
        key=0xA;
        break;
        case 0x7B:
        key=0xB;
        break;
        case 0xE7:
        key=0xC;
        break;
        case 0xD7:
        key=0xD;
        break;
        case 0xB7:
        key=0xE;
        break;
        case 0x77:
        key=0xF;
        break;
        }
        }
        }
        return key;//返回按鍵值
        }
        /***********************************************/
        /*******************主程序*********************/
        /***********************************************/
        void main()
        {
        uchar ik=16;//定義局部變量
        DDRB=0xff;//設置PB口為輸出
        DDRC=0xff;//設置PC口為輸出
        while(1)
        {
        ik=key_scan();//將按鍵返回值給變量IK
        if(ik<16)//如果返回值小于16就在數碼管上顯示出來
        xian(ik); //調用顯示子程序
        else//如果返回值不小于16,就顯示黑屏
        xian(16);
        }
        }


        上一頁 1 2 下一頁

        關鍵詞: AVR單片機矩陣鍵

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 崇州市| 综艺| 东安县| 玛纳斯县| 淅川县| 阜南县| 英吉沙县| 梁山县| 文山县| 沽源县| 梅河口市| 盐城市| 游戏| 双柏县| 边坝县| 道孚县| 丰镇市| 磐石市| 夏河县| 乐业县| 东辽县| 交城县| 镇巴县| 邹平县| 苏尼特左旗| 吴川市| 嘉荫县| 年辖:市辖区| 翼城县| 罗田县| 铜陵市| 吴忠市| 南靖县| 昭觉县| 裕民县| 绥宁县| 色达县| 黎平县| 富民县| 门源| 涞源县|