新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR單片機(jī)矩陣鍵盤程序(2種方法)

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

        作者: 時(shí)間:2016-11-29 來源:網(wǎng)絡(luò) 收藏
        AVR矩陣鍵盤2種方法實(shí)現(xiàn)!

        普通方法:

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

        #include//
        #include//
        #define uchar unsigned char//
        #define uint unsigned int//
        #define setb(val,bitn) (val|=(1<<(bitn)))//設(shè)置某IO口某位為1
        #define clr(val,bitn) (val&=~(1<<(bitn)))//設(shè)置某IO口某位為0
        #define get(val,bitn) (val&(1<<(bitn)))//讀取某位狀態(tài)如if(get(PORTC,7))即判斷PC7口是否為1
        #pragma data:code//數(shù)組存放位置
        const table[]={
        0xc0,0xf9,0xa4,0xb0,0x99,
        0x92,0x82,0xf8,0x80,0x90,
        0x88,0x83,0xc6,0xa1,0x86,
        0x8e
        };//共陽數(shù)碼管0--9代碼
        ucharnum,yin,temp;//鍵值碼及識(shí)別碼
        voiddelay(uchar);//延時(shí)函數(shù)
        void disy();//顯示函數(shù)
        void skk()
        {
        for(yin=0;yin<2;yin++)
        {
        PORTD=0xfe;//將第一行置0,即檢測(cè)第一行
        temp=PIND;//將值給tem
        temp=temp&0xf0;//與0xf0與門一下,
        while(temp!=0xf0)//判斷是否為0xf0
        {
        delay(10);//延時(shí)
        temp=PIND;//將P1值再給tem
        temp=temp&0xf0;//將值再與門
        while(temp!=0xf0)//再次判斷是否為0xf0
        {
        temp=PIND;//確實(shí)按下了,將tem值裝回,以便下次判斷開關(guān)語句,否則沒有它對(duì)應(yīng)的值,如原來是ee,如果再按下是第二個(gè)鍵就不是de了
        switch(temp)//開關(guān)語句
        {
        case 0xee:num=0;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0xde:num=1;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0xbe:num=2;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0x7e:num=3;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        }
        while(temp!=0xf0)//松手判斷,以便退出以上兩個(gè)while
        {
        temp=PIND;//給temp賦值
        temp=temp&0xf0;//與門一下
        }
        }
        }
        }

        for(yin=0;yin<2;yin++)
        {
        PORTD=0xfd;//將第一行置0,即檢測(cè)第一行
        temp=PIND;//將值給tem
        temp=temp&0xf0;//與0xf0與門一下,
        while(temp!=0xf0)//判斷是否為0xf0
        {
        delay(10);//延時(shí)
        temp=PIND;//將P1值再給tem
        temp=temp&0xf0;//將值再與門
        while(temp!=0xf0)//再次判斷是否為0xf0
        {
        temp=PIND;//確實(shí)按下了,將tem值裝回,以便下次判斷開關(guān)語句,否則沒有它對(duì)應(yīng)的值,如原來是ee,如果再按下是第二個(gè)鍵就不是de了
        switch(temp)//開關(guān)語句
        {
        case 0xed:num=4;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0xdd:num=5;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0xbd:num=6;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0x7d:num=7;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        }
        while(temp!=0xf0)//松手判斷,以便退出以上兩個(gè)while
        {
        temp=PIND;//給temp賦值
        temp=temp&0xf0;//與門一下
        }
        }
        }
        }
        for(yin=0;yin<2;yin++)
        {
        PORTD=0xfb;//將第一行置0,即檢測(cè)第一行
        temp=PIND;//將值給tem
        temp=temp&0xf0;//與0xf0與門一下,
        while(temp!=0xf0)//判斷是否為0xf0
        {
        delay(10);//延時(shí)
        temp=PIND;//將P1值再給tem
        temp=temp&0xf0;//將值再與門
        while(temp!=0xf0)//再次判斷是否為0xf0
        {
        temp=PIND;//確實(shí)按下了,將tem值裝回,以便下次判斷開關(guān)語句,否則沒有它對(duì)應(yīng)的值,如原來是ee,如果再按下是第二個(gè)鍵就不是de了
        switch(temp)//開關(guān)語句
        {
        case 0xeb:num=8;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0xdb:num=9;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0xbb:num=10;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0x7b:num=11;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        }
        while(temp!=0xf0)//松手判斷,以便退出以上兩個(gè)while
        {
        temp=PIND;//給temp賦值
        temp=temp&0xf0;//與門一下
        }
        }
        }
        }
        for(yin=0;yin<2;yin++)
        {
        PORTD=0xf7;//將第一行置0,即檢測(cè)第一行
        temp=PIND;//將值給tem
        temp=temp&0xf0;//與0xf0與門一下,
        while(temp!=0xf0)//判斷是否為0xf0
        {
        delay(10);//延時(shí)
        temp=PIND;//將P1值再給tem
        temp=temp&0xf0;//將值再與門
        while(temp!=0xf0)//再次判斷是否為0xf0
        {
        temp=PIND;//確實(shí)按下了,將tem值裝回,以便下次判斷開關(guān)語句,否則沒有它對(duì)應(yīng)的值,如原來是ee,如果再按下是第二個(gè)鍵就不是de了
        switch(temp)//開關(guān)語句
        {
        case 0xe7:num=12;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0xd7:num=13;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0xb7:num=14;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        case 0x77:num=15;//與num值比較是否相等,如果相等就退出switch語句
        break;//退出switch語句
        }
        while(temp!=0xf0)//松手判斷,以便退出以上兩個(gè)while
        {
        temp=PIND;//給temp賦值
        temp=temp&0xf0;//與門一下
        }
        }
        }

        }
        }


        上一頁 1 2 下一頁

        關(guān)鍵詞: AVR單片機(jī)矩陣鍵

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 永登县| 宜宾市| 休宁县| 马公市| 贞丰县| 武宣县| 平乐县| 滁州市| 封开县| 玛沁县| 德惠市| 太湖县| 兰考县| 永城市| 英吉沙县| 如皋市| 连城县| 漳州市| 陇川县| 来宾市| 朝阳市| 哈尔滨市| 文昌市| 灌阳县| 常熟市| 湾仔区| 益阳市| 南昌县| 青河县| 重庆市| 绍兴市| 镇远县| 巨野县| 民勤县| 无为县| 万州区| 高台县| 太谷县| 通河县| 宜黄县| 剑阁县|