新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 三個I/O口實現的3*4矩陣按鍵程序

        三個I/O口實現的3*4矩陣按鍵程序

        作者: 時間:2012-08-24 來源:網絡 收藏
        uchar buttion(void)//按鍵讀寫程序
        {uchar keybuf1=0x00,keybuf2=0x00,keysta=0x00;
        bit zz=0,z12=0,z23=0,z31=0,
        ff=0,f12=0,f23=0,f31=0,gnd=0;
        //先讀三個接地按鍵
        P6CR|=0xe0;//PORT端口控制寄存器
        delay8nop();
        keybuf1=PORT60xe0;
        if(keybuf1!=0xe0)gnd=1;//有接地按鍵按下
        else{
        //正向導通測試
        //測試Z12,12正向導通測試
        P6CR=0x9f;//置23口為輸出口 10011111
        P6CR|=0x80;//置1口為輸入口 10000000
        PORT6=0xbf;//2口清0 10111111
        PORT6|=0x20;//3口置1 00100000
        delay8nop();
        if(P67==0){z12=1;zz=1;keysta+=0x01;}//12正向導通

        //測試Z23,23正向導通
        P6CR=0x5f;//置13口為輸出口 01011111
        P6CR|=0x40;//置2口為輸入口 01000000
        PORT6=0xdf;//3口清0 11011111
        PORT6|=0x80;//1口置1 10000000
        delay8nop();
        if(P66==0){z23=1;zz=1;keysta+=0x02;}//23口正向導通

        //測試Z31,31正向導通
        P6CR=0x3f;//置12口為輸出口 00111111
        P6CR|=0x80;//置3口為輸入口 00100000
        PORT6=0xbf;//1口清0 01111111
        PORT6|=0x40;//2口置1 01000000
        delay8nop();
        if(P65==0){z31=1;zz=1;keysta+=0x04;}//31正向導通

        //反向導通測試
        //測試F12,12反向導通
        P6CR=0x5f;//置13口為輸出口 01011111
        P6CR|=0x40;//置2口為輸入口 01000000
        PORT6=0xbf;//1口清0 01111111
        PORT6|=0x20;//3口置1 00100000
        delay8nop();
        if(P66==0){f12=1;ff=1;keysta+=0x08;}//12反向導通

        //測試F23,23反向導通
        P6CR=0x9f;//置12口為輸出口 00111111
        P6CR|=0x80;//置3口為輸入口 00100000
        PORT6=0xbf;//2口清0 10111111
        PORT6|=0x20;//3口置1 00100000
        delay8nop();
        if(P65==0){f12=1;ff=1;keysta+=0x10;}//23反向導通

        //測試F31,31反向導通
        P6CR=0x9f;//置23口為輸出口 10011111
        P6CR|=0x80;//置1口為輸入口 10000000
        PORT6=0xdf;//3口清0 11011111
        PORT6|=0x20;//2口置1
        delay8nop();
        if(P67==0){f31=1;ff=1;keysta+=0x20;}//31反向導通
        }
        //按鍵識別
        if(gnd==1) {P6CR|=0xe0;//PORT端口控制寄存器
        delay8nop();
        keybuf2=PORT60xe0;
        if(keybuf1==keybuf2)
        {switch(keybuf1)
        {case 0x80:return 0x01;break;
        case 0x40:return 0x04;break;
        case 0x20:return 0x08;break;
        default:return 0xff;
        }
        }
        else return 0xff;//接地三鍵按下
        }
        else//接地按鍵沒有按下
        {switch(keysta)
        {case 0x01://測試Z12,12正向導通測試
        P6CR=0x9f;//置23口為輸出口 10011111
        P6CR|=0x80;//置1口為輸入口 10000000
        PORT6=0xbf;//2口清0 10111111
        PORT6|=0x20;//3口置1 00100000
        delay8nop();
        if(P67==0)return 0x02;
        else return 0xff;break;
        case 0x02://測試Z23,23正向導通
        P6CR=0x5f;//置13口為輸出口 01011111
        P6CR|=0x40;//置2口為輸入口 01000000
        PORT6=0xdf;//3口清0 11011111
        PORT6|=0x80;//1口置1 10000000
        delay8nop();
        if(P66==0)return 0x05;
        else return 0xff;break;
        case 0x04://測試Z31,31正向導通
        P6CR=0x3f;//置12口為輸出口 00111111
        P6CR|=0x80;//置3口為輸入口 00100000
        PORT6=0xbf;//1口清0 01111111
        PORT6|=0x40;//2口置1 01000000
        delay8nop();
        if(P65==0)return 0x08;
        else return 0xff;break;
        case 0x08://測試F12,12反向導通
        P6CR=0x5f;//置13口為輸出口 01011111
        P6CR|=0x40;//置2口為輸入口 01000000
        PORT6=0xbf;//1口清0 01111111
        PORT6|=0x20;//3口置1 00100000
        delay8nop();
        if(P66==0)return 0x03;
        else return 0xff;break;
        case 0x10://測試F23,23反向導通
        P6CR=0x9f;//置12口為輸出口 00111111
        P6CR|=0x80;//置3口為輸入口 00100000
        PORT6=0xbf;//2口清0 10111111
        PORT6|=0x20;//3口置1 00100000
        delay8nop();
        if(P65==0)return 0x06;
        else return 0xff;
        case 0x20://測試F31,31反向導通
        P6CR=0x9f;//置23口為輸出口 10011111
        P6CR|=0x80;//置1口為輸入口 10000000
        PORT6=0xdf;//3口清0 11011111
        PORT6|=0x20;//2口置1
        delay8nop();
        if(P67==0)return 0x09;
        else return 0xff;
        case 0x09://測試Z12,12正向導通測試
        z12=0;
        P6CR=0x9f;//置23口為輸出口 10011111
        P6CR|=0x80;//置1口為輸入口 10000000
        PORT6=0xbf;//2口清0 10111111
        PORT6|=0x20;//3口置1 00100000
        delay8nop();
        if(P67==0)z12=1;
        //測試F12,12反向導通
        f12=0;
        P6CR=0x5f;//置13口為輸出口 01011111
        P6CR|=0x40;//置2口為輸入口 01000000
        PORT6=0xbf;//1口清0 01111111
        PORT6|=0x20;//3口置1 00100000
        delay8nop();
        if(P66==0)f12=1;
        if((z12==1)(f12==1))return 0x0a;
        else return 0xff;break;
        case 0x12: //測試Z23,23正向導通
        z23=0;
        P6CR=0x5f;//置13口為輸出口 01011111
        P6CR|=0x40;//置2口為輸入口 01000000
        PORT6=0xdf;//3口清0 11011111
        PORT6|=0x80;//1口置1 10000000
        delay8nop();
        if(P66==0)z23=1;
        //測試F23,23反向導通
        f23=0;
        P6CR=0x9f;//置12口為輸出口 00111111
        P6CR|=0x80;//置3口為輸入口 00100000
        PORT6=0xbf;//2口清0 10111111
        PORT6|=0x20;//3口置1 00100000
        delay8nop();
        if(P65==0)f23=1;
        if((z23==1)(f23==1))return 0x00;
        else return 0xff;
        case 0x24://測試Z31,31正向導通
        z31=0;
        P6CR=0x3f;//置12口為輸出口 00111111
        P6CR|=0x80;//置3口為輸入口 00100000
        PORT6=0xbf;//1口清0 01111111
        PORT6|=0x40;//2口置1 01000000
        delay8nop();
        if(P65==0)z31=1;
        //測試F23,23反向導通
        P6CR=0x9f;//置12口為輸出口 00111111
        P6CR|=0x80;//置3口為輸入口 00100000
        PORT6=0xbf;//2口清0 10111111
        PORT6|=0x20;//3口置1 00100000
        delay8nop();
        if(P65==0)f31=1;
        if((z31==1)(f31==1))return 0x0b;
        else return 0xff;
        default:return 0xff;break;

        }
        }
        return 0xff;}


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 桃园市| 若尔盖县| 堆龙德庆县| 抚顺县| 招远市| 汝城县| 阳高县| 万盛区| 阿拉尔市| 禹城市| 宾川县| 太保市| 兴城市| 苏州市| 长兴县| 沈阳市| 如皋市| 德惠市| 兴城市| 乌苏市| 阿图什市| 湄潭县| 安阳县| 崇文区| 乌什县| 博罗县| 长治县| 炉霍县| 顺平县| 绿春县| 都昌县| 天水市| 宁阳县| 油尖旺区| 雷山县| 乐亭县| 德惠市| 浦江县| 方城县| 会同县| 察雅县|