新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 按鍵程序 PORT中斷程序

        按鍵程序 PORT中斷程序

        作者: 時間:2016-11-25 來源:網絡 收藏
        MSP 430里面 P1口和P2口有中斷功能。

        我們的項目里面,P1口的1-7管腳做鍵盤,0腳做風速傳感器的輸入。P2口的0-4做鍵盤,5-7做其他用。

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


        //鍵盤引腳配置
        P1DIR=0x00; // P1 口為輸入(0:風速傳感器輸入,1-7中斷信號輸入)

        P2DIR&=~(BIT0+BIT1+BIT2+BIT3+BIT4); //把P2.0-P2.4設為輸入
        //下降沿觸發是指按下的時候進入中斷,上升沿觸發是在放開按鍵的時候進入中斷
        P1IES|=BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7;//設置P1口中斷邊沿選擇寄存器,置1為下跳沿,置0為

        //上跳沿
        P1IE=0xFE;//設置P1中斷使能寄存器,置1為允許中斷,置0為禁止中斷

        //(因為P1.0他用,為了不影響我們的按鍵的判斷,所以P1.0腳的中斷我們不打開,只開P1.1-P1.7,所以

        //就是P1IE的bit置位是:1111 1110 =P1IE)
        P2DIR=0x00;//設置P2口方向寄存器,置0為輸入,置1為輸出
        P2IES|=BIT0+BIT1+BIT2+BIT3+BIT4;//設置P2口中斷邊沿選擇寄存器,置1為下跳沿,置0為上跳沿
        P2IE=0x1F; //設置P2中斷使能寄存器,置1為允許中斷,置0為禁止中斷

        (因為P2.5-P2.7他用,為了不影響我們的按鍵的判斷,所以這些腳的中斷我們不打開,只開P2.0-P2.4,所以就是P2IE的bit置位是:0001 1111 =P1IE)

        I/O口的每一bit都可以單獨設置,為了不影響其他管腳的工作,我們設定我們按鍵所需管腳的時候,都是使用位操作來設定相應的位,無關位保存原樣,如:P2IES|=BIT0+BIT1+BIT2+BIT3+BIT4;只選擇了P2.0-P2.4為下降沿觸發,P2.5-P2.7保持原設置,否則容易相互干擾出錯。

        在頭文件中我們可以找到P1口的中斷向量集是:PORT1_VECTOR
        P2口的中斷向量集是:PORT2_VECTOR


        所以中斷函數可以寫成:

        #pragma vector=PORT1_VECTOR
        __interrupt void PORT1_ISR (void)
        {
        unsigned temp1; //局部變量:? //temp 暫時存放端口的中斷標志寄存器中的值
        //temp 暫時存放端口的中斷標志寄存器中的值
        delay(250000); // 消除抖動20ms延時(一般是10ms-20ms,看后面備注1)
        if ((P1IN&0xFE)!=0xFE) //如果有鍵按下

        {
        temp1=P1IFG; //temp1 記錄中斷標志
        switch(temp1)
        {
        case 1:
        draw_circle(400,300,cyclenum*15,0,0xec);
        break;
        case 2:
        draw_circle(600,300,cyclenum*15,0,0xec);
        break;
        case 4:
        break;
        case 8:
        break;
        case 16:
        break;
        case 32:
        break;
        case 64:
        break;
        case 128:
        break;
        //default: keyvaluep1=0;break;
        }
        }
        P1IFG=0X00; //清除中斷標志,返回主程序
        }
        //以下是port2的中斷服務程序
        #pragma vector=PORT2_VECTOR
        __interrupt void PORT2_ISR (void)
        {
        unsigned char temp1;
        __delay_cycles(250000);// 20MS消除抖動延時備注1:
        if ((P2IN&0x1F)!=0x1F) //僅使用了0、1、2、3、4腳所以與0x1F

        {
        temp1=P2IFG;
        switch(temp1)
        { case 1:
        程序1;

        break;
        case 2:
        程序2;

        break;
        case 4:
        程序3;
        break;
        case 8:
        break;
        case 16:
        break;
        case 32:
        break;
        case 64:
        break;
        case 128:
        break;
        //default: keyvaluep2=0;break;
        }
        }
        P2IFG=0X00;
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 石楼县| 乌恰县| 定西市| 阳曲县| 太原市| 蒲城县| 株洲市| 贡山| 昌吉市| 五寨县| 江山市| 鲁山县| 宣威市| 甘孜县| 新兴县| 芦山县| 临湘市| 天台县| 曲周县| 芒康县| 崇阳县| 晋城| 岳普湖县| 民丰县| 万安县| 永年县| 汕尾市| 乌海市| 鄄城县| 阿瓦提县| 鲁山县| 阿坝| 黄浦区| 准格尔旗| 吉首市| 大名县| 西乌珠穆沁旗| 鄂温| 阿合奇县| 曲麻莱县| 英吉沙县|