新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > msp430矩陣式按鈕驅(qū)動(dòng)程序

        msp430矩陣式按鈕驅(qū)動(dòng)程序

        作者: 時(shí)間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
        寫這個(gè)程序的時(shí)候,完全沒有參考,全部是建立在匯編語言的基礎(chǔ)上,一步步的搬移到c語言上的。但是測試后,感覺效果還是十分理想,所以拿出來與眾位分享了,希望對一些朋友有所幫助~

        #include "msp430x14x.h"
        unsigned char LineScan[4]={0xef,0xdf,0xbf,0x7f}; //列值列舉

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

        void ADD()
        {
        P4OUT+=1;
        }

        void SUB()
        {
        P4OUT-=1;
        }

        unsigned int key_check(void) //檢測是否有按鍵按下
        {
        unsigned char temp;
        P1DIR=0xf0; //定義P1.4~P1.7為輸出
        temp=P1IN & 0x0f;
        if(temp!=0x0f)
        return 1;
        else
        return 0;
        }

        unsigned char scan_key(void) //掃描對應(yīng)按鍵的鍵號
        {
        P1DIR=0xf0;
        unsigned char count;
        unsigned char i,temp,m,n; //m為列的值,n為行的值
        unsigned int flag=0;
        for(i=0;i<4;i++) //列掃描
        {
        P1OUT=LineScan[i]; //獲取掃描的列
        temp=P1IN&0x0f;

        if(temp==0x07) //為第一行
        {n=0; //記錄按下按鈕的行
        flag=1; //標(biāo)志檢測出來
        break;}
        else if(temp==0x0b) //為第二行
        {n=1;
        flag=1;
        break;}
        else if(temp==0x0d) //為第三行
        {n=2;
        flag=1;
        break;}
        else if(temp==0x0e) //為第四行
        {n=3;
        flag=1;
        break;}
        }
        if(flag==1)
        {m=i;
        flag=0;
        count=n*4+m;
        switch(count)
        {
        case 0: {;break;}
        case 1: {;break;}
        case 2: {;break;}
        case 3: {;break;}
        case 4: {;break;}
        case 5: {;break;}
        case 6: {;break;}
        case 7: {;break;}
        case 8: {;break;}
        case 9: {;break;}
        case 10:{;break;}
        case 11:{SUB();break;}
        case 12:{;break;}
        case 13:{;break;}
        case 14:{;break;}
        case 15:{ADD();break;}
        }
        return;
        }
        else
        return;
        }

        void Delay(char wDelay) //延時(shí)子程序
        {
        while(wDelay!=0)
        wDelay--;
        }

        int main( void )
        {
        WDTCTL = WDTPW + WDTHOLD;
        P4DIR =0xff;
        P4OUT=0X00;
        while(1)
        {
        if(key_check())
        {Delay(10000);
        if(key_check())
        {
        scan_key();
        while(key_check());
        P1OUT=0x0f;
        }
        }
        }
        }



        評論


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

        關(guān)閉
        主站蜘蛛池模板: 博白县| 比如县| 西林县| 武山县| 吐鲁番市| 红安县| 木里| 嘉善县| 清镇市| 保亭| 象州县| 靖西县| 永兴县| 宁明县| 樟树市| 花垣县| 建湖县| 无锡市| 林口县| 梁山县| 隆尧县| 靖边县| 平原县| 玉门市| 新安县| 碌曲县| 新昌县| 高密市| 高陵县| 孝感市| 阿图什市| 龙南县| 富民县| 专栏| 龙口市| 兴业县| 宁陵县| 苍梧县| 桂林市| 宜州市| 蒙阴县|