<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        msp430 io口的配置和使用

        作者:未知   來源:不詳   點擊數:  更新時間:2014年08月31日   【字體:

         一 I/O的簡介

        1、各種復用和各種設置(可以作為簡單IO功能也可以作各種第二功能;可控制為輸入、輸出、接上拉電阻、接下拉電阻、接受中斷等各種情況);

        2、IO口常用寄存器有:PXDIR、PXIN、PXOUT、PXREN、PXSEL、PXDS;其中,X可以是1~8,也可以是A~D,因為P1、P2可以合稱為PA。例如(PAREN=0x0480)就等價于(P2REN=0x04、P1REN=0x80)。
        IO口中斷相關寄存器:PXIV、PXIFGX、PXIE、PXIES;由于IO中斷僅存在于P1口和P2口,因此X只能為1或2,而且不可以為A。

        3、msp430f5529.h中定義了BIT0~BITF,方便用戶進行位操作。例如要設置P1.7和P2.2為輸入,代碼可如下:PADIR &= ~(BITA + BIT7)。

        二 IO口常用寄存器配置

        1、PxDIR,Px口方向寄存器
        0 端口配置為輸入(默認)
        1 端口配置為輸入

        2、PxOUT,Px口輸出寄存器(輸入、輸出兩種模式)
        當IO口配置為輸出模式時:
        0 輸出低電平
        1 輸出高電平
        當IO口配置為輸入模式并且置高/ 置低使能時:
        0置低
        1置高

        3、PxIN,Px 口輸入寄存器
        只讀

        4、PxREN,Px口置高/ 置低使能寄存器
        0關閉置高/ 置低
        1使能置高/ 置低

        5、PxSEL,Px功能選擇寄存器(IO中斷只有在普通IO下才能使用)
        0普通的I/O(默認)
        1有連接外圍電路的特殊用途

        6、PxDS,Px 口輸出驅動能力寄存器(我都是用的默認)
        0減弱輸出驅動能力(默認)
        1全力輸出驅動能力

        三 普通IO使用舉例

        說明:本例程是流水燈加按鍵控制,每次S1按下,便在等待S2按下,否則,所有LED一直閃爍。若無按鍵按下,則八盞燈以流水燈方式顯示。

        #include <msp430f5529.h>
        #define uint8_t unsigned char
        #define uint16_t unsigned int

        //********* 控制LED的IO口宏定義 *************
        #define LED145678_PORT_DIR          P1DIR
        #define LED145678_PORT_OUT          P1OUT
        #define LED23_PORT_DIR              P8DIR
        #define LED23_PORT_OUT              P8OUT

        //************ LED的IO口宏定義 *************
        #define LED1        0x01
        #define LED2        0x02
        #define LED3        0x04
        #define LED4        0x08
        #define LED5        0x10
        #define LED6        0x20
        #define LED7        0x40
        #define LED8        0x80
        #define LED_ALL     0xFF

        //************ 按鍵的IO口宏定義 *************
        #define BUTTON_S1        (P1IN & BIT7)
        #define BUTTON_S2        (P2IN & BIT2)

        //**********************************************************
        //*函數: void delay(uint16_t x_ms)
        //*功能: 延時程序
        //*參數: x_ms(單位:ms)
        //*返回: 無
        //*備注: 無
        //**********************************************************
        void delay(uint16_t x_ms)
        {
        uint16_t i=0,j=0;
        for(i=x_ms;i>0;i--)
          for(j=110;j>0;j--);
        }

        //**********************************************************
        //*函數: void LED_Init()
        //*功能: LED的IO口方向初始化
        //*參數: 無
        //*返回: 無
        //*備注: 無
        //**********************************************************
        void LED_Init()
        {
        LED145678_PORT_OUT &= ~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5);
            LED145678_PORT_DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5;
            LED23_PORT_OUT &= ~(BIT1 + BIT2);
            LED23_PORT_DIR |= BIT1 + BIT2;
        }

        //**********************************************************
        //*函數: void Board_ledOn(uint8_t ledMask)
        //*功能: 打開輸入的那盞燈
        //*參數: ledMask
        //*返回: 無
        //*備注: 無
        //**********************************************************
        void Board_ledOn(uint8_t ledMask)
        {
            if (ledMask & LED1) LED145678_PORT_OUT |= BIT0;
            if (ledMask & LED2) LED23_PORT_OUT |= BIT1;
            if (ledMask & LED3) LED23_PORT_OUT |= BIT2;
            if (ledMask & LED4) LED145678_PORT_OUT |= BIT1;
            if (ledMask & LED5) LED145678_PORT_OUT |= BIT2;
            if (ledMask & LED6) LED145678_PORT_OUT |= BIT3;
            if (ledMask & LED7) LED145678_PORT_OUT |= BIT4;
            if (ledMask & LED8) LED145678_PORT_OUT |= BIT5;
        }

        //**********************************************************
        //*函數: void Board_ledOff(uint8_t ledMask)
        //*功能: 關閉輸入的那盞燈
        //*參數: ledMask
        //*返回: 無
        //*備注: 無
        //**********************************************************
        void Board_ledOff(uint8_t ledMask)
        {
            if (ledMask & LED1) LED145678_PORT_OUT &= ~BIT0;
            if (ledMask & LED2) LED23_PORT_OUT &= ~BIT1;
            if (ledMask & LED3) LED23_PORT_OUT &= ~BIT2;
            if (ledMask & LED4) LED145678_PORT_OUT &= ~BIT1;
            if (ledMask & LED5) LED145678_PORT_OUT &= ~BIT2;
            if (ledMask & LED6) LED145678_PORT_OUT &= ~BIT3;
            if (ledMask & LED7) LED145678_PORT_OUT &= ~BIT4;
            if (ledMask & LED8) LED145678_PORT_OUT &= ~BIT5;
        }

        //**********************************************************
        //*函數: void Board_ledToggle(uint8_t ledMask)
        //*功能: 輸入的那盞燈的狀態取反
        //*參數: ledMask
        //*返回: 無
        //*備注: 無
        //**********************************************************
        void Board_ledToggle(uint8_t ledMask)
        {
            if (ledMask & LED1) LED145678_PORT_OUT ^= BIT0;
            if (ledMask & LED2) LED23_PORT_OUT ^= BIT1;
            if (ledMask & LED3) LED23_PORT_OUT ^= BIT2;
            if (ledMask & LED4) LED145678_PORT_OUT ^= BIT1;
            if (ledMask & LED5) LED145678_PORT_OUT ^= BIT2;
            if (ledMask & LED6) LED145678_PORT_OUT ^= BIT3;
            if (ledMask & LED7) LED145678_PORT_OUT ^= BIT4;
            if (ledMask & LED8) LED145678_PORT_OUT ^= BIT5;
        }

        //**********************************************************
        //*函數: void main(void)
        //*功能: 主函數
        //*參數: 無
        //*返回: 無
        //*備注: 無
        //**********************************************************
        void main(void)
        {
            uint8_t LED = LED1;   //定義變量LED
            WDTCTL = WDTPW | WDTHOLD;  //關閉看門狗
            LED_Init();    //初始化LED的IO口方向
            PADIR &= ~(BITA + BIT7);   //將按鍵的IO口方向設為輸入
            PAREN |=  (BITA + BIT7);   //置高/ 置低使能
            PAOUT |=  (BITA + BIT7);   //置高(類似于上拉)
            while(1)
           {
                Board_ledOn(LED);
                delay(1000);   //延時1s左右
                Board_ledOff(LED);
                LED = LED << 1;
                if(LED == 0x00) LED = LED1;
                if(!BUTTON_S1)
               {
                    delay(10); //消抖
                    if(!BUTTON_S1)
                   {
                         while(!BUTTON_S1);//等待S1釋放
                         while(BUTTON_S2)  //等待S2按下
                        {
                             Board_ledToggle(LED_ALL);//所有LED狀態取反
                             delay(300);   
                         }
                         Board_ledOff(LED_ALL);//關閉所有LED
                    }
                }
            }
        }

         
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮