• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于AVR的4*4矩陣鍵盤掃描與LED顯示程序

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

    作者: 時(shí)間:2012-08-02 來源:網(wǎng)絡(luò) 收藏

    /**************
    此程序在別人的基礎(chǔ)上進(jìn)行了一些修改,能應(yīng)用到我的開發(fā)板中,
    并與我自制的外接按鍵和LED燈配合使用,在此感謝原創(chuàng)者!!!
    硬件:M16
    作用:當(dāng)按下按鍵時(shí)顯示相對(duì)應(yīng)的按鍵控制的LED燈
    頻率:8.000000MHZ
    開發(fā)板: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;
    //以下為左右移動(dòng)參數(shù)宏定義
    #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;//初始運(yùn)行時(shí)輸出全為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;//無鍵按下則返回初始狀態(tài)
    }
    }
    }
    void led_display(void)//按鍵按下時(shí)在LED上顯示相應(yīng)的狀態(tài)
    {
    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();//調(diào)用端口初始化函數(shù)
    while(1)
    {
    key_scan();//調(diào)用按鍵掃描函數(shù)
    led_display();//調(diào)用顯示函數(shù)
    }
    }



    關(guān)鍵詞: AVR 4*4矩陣鍵盤掃描 LED顯示

    評(píng)論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 湖南省| 孝感市| 赫章县| 宁陵县| 宜城市| 林州市| 岳阳县| 靖西县| 桂林市| 张掖市| 高碑店市| 陈巴尔虎旗| 吉木萨尔县| 玉田县| 新建县| 偃师市| 陇西县| 忻城县| 松江区| 湖州市| 镇原县| 株洲县| 临汾市| 河源市| 金阳县| 漾濞| 基隆市| 穆棱市| 三河市| 金塔县| 绵竹市| 榆树市| 板桥市| 平潭县| 临城县| 安丘市| 宁乡县| 石河子市| 浦东新区| 邵武市| 孝昌县|