新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于AVR的4*4矩陣鍵盤掃描與LED顯示程序

        基于AVR的4*4矩陣鍵盤掃描與LED顯示程序

        作者: 時間:2012-08-02 來源:網絡 收藏

        /**************
        此程序在別人的基礎上進行了一些修改,能應用到我的開發板中,
        并與我自制的外接按鍵和LED燈配合使用,在此感謝原創者!!!
        硬件:M16
        作用:當按下按鍵時顯示相對應的按鍵控制的LED燈
        頻率:8.000000MHZ
        開發板:Easy M16 v12
        編譯軟件:ICC6.31A
        下載軟件:studio4.14
        編寫人:伍建忠
        編寫日期:2011.10.14
        修改日期:
        ************/
        #includeiom16v.h>
        #includemacros.h>
        #define uchar unsigned char
        #define uint unsigned int
        uint key_num=20;
        //以下為左右移動參數宏定義
        #define crol(a,n)a=(a>(8-n))
        #define cror(a,n)a=(a>>n)|(a(8-n))
        void delay(void)
        {
        uint i;
        for(i=1;i100;i++);
        }
        void delay_1ms(void)
        {
        uint i;
        for(i=1;i(uint)(8*143-2);i++);
        }
        void delay_ms(uint time)
        {
        uint i=0;
        while(i)
        {
        delay_1ms();
        i++;
        }
        }
        void port_init(void)
        {
        DDRA=0xff;
        PORTA=0xff;
        DDRB=0x00;
        PORTB=0x00;
        DDRC=0xff;//
        PORTC=0xff;//
        DDRD=0xf0;//D口低四位為輸入,置高電平。
        PORTD=0x00;//高四位為輸出,置低電平。
        }
        uchar key_scan(void)
        {
        uchar i,j;
        DDRD=0xf0;
        PORTD=0x00;//初始運行時輸出全為0
        if((PIND0x0f)==0x0f)//判斷有無按鍵按下
        return 20;
        else
        {
        delay_ms(10);
        if((PIND0x0f)==0x0f)//第二次判斷,必不可少
        return 20;
        else
        {
        for(i=4;i8;i++)//掃描行線
        {
        PORTD=~(1i)|0x0f;//行線上是否有拉低
        for(j=0;j4;j++)//掃描列線
        {
        if((PIND(1j))==0)//列線上有無按鍵按下
        key_num=((i-4)*4+j);//確定按鍵值
        }
        }
        return key_num;//無鍵按下則返回初始狀態
        }
        }
        }
        void led_display(void)//按鍵按下時在LED上顯示相應的狀態
        {
        switch(key_num)
        {
        case 0: PORTA=0xfe; PORTD=0xee; break;
        case 1: PORTA=0xfc; PORTD=0xde; break;
        case 2: PORTA=0xf8; PORTD=0xbe; break;
        case 3: PORTA=0xf0; PORTD=0x7e; break;
        case 4: PORTA=0xe0; PORTD=0xed; break;
        case 5: PORTA=0xc0; PORTD=0xdd; break;
        case 6: PORTA=0x07; PORTD=0xbd; break;
        case 7: PORTA=0x55; PORTD=0x7d; break;
        case 8: PORTA=0xaa; PORTD=0xeb; break;
        case 9: PORTA=0xcc; PORTD=0xdb; break;
        case 10: PORTA=0xbb; PORTD=0xbb; break;
        case 11: PORTA=0x77; PORTD=0x7b; break;
        case 12: PORTA=0xf0; PORTD=0xe7; break;
        case 13: PORTA=0x66; PORTD=0xd7; break;
        case 14: PORTA=0xee; PORTD=0xd7; break;
        case 15: PORTA=0xdd; PORTD=0x77; break;
        default: break;
        key_num=16;
        }
        }
        void main(void)
        {
        #ifdef debag1
        key_code=2;
        #endif
        port_init();//調用端口初始化函數
        while(1)
        {
        key_scan();//調用按鍵掃描函數
        led_display();//調用顯示函數
        }
        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 新营市| 永德县| 博乐市| 米泉市| 定结县| 睢宁县| 大竹县| 宁远县| 兴仁县| 军事| 太仆寺旗| 社旗县| 绿春县| 浪卡子县| 镇康县| 独山县| 长葛市| 临武县| 永丰县| 韶关市| 襄汾县| 津南区| 榆林市| 高邮市| 峨山| 天门市| 阳高县| 格尔木市| 丰原市| 古丈县| 古交市| 淄博市| 普洱| 天镇县| 兖州市| 萨嘎县| 应用必备| 东安县| 宜章县| 武汉市| 澄江县|