1. 程式人生 > >使用STC15W4K系列微控制器需要注意I/O口的一些問題

使用STC15W4K系列微控制器需要注意I/O口的一些問題

在STC15W4K系列微控制器中,與PWM2—PWM7相關的12個I/O口[P3.7/PWM2,P2.1/PWM3,P2.2/PWM4,P2.3/PWM5,P1.6/PWM6,P1.7/PWM7,P2.7/PWM2_2,P4.5/PWM3_2,P4.4/PWM4_2,P4.2/PWM5_2,P0.7/PWM6_2,P0.6/PWM7_2],上電覆位後是高阻輸入狀態,要對外能輸出,要軟體將其改為強推輓輸出或準雙向口/弱上拉,與PWM2—PWM7相關的I/O口引腳如下:


配置I/O口為強推輓輸出、準雙向口/弱上拉、高阻輸入和開漏狀態如下表格所示:


根據上述微控制器I/O口引腳和I/O設定狀態表格,用P2口作例子,

(1)將P2埠與PWM相關的I/O配置為強推輓輸出用C語言表示如下:

           P2M1 = 0x00; //0000 0000B

           P2M0 = 0x9E; //1001 1110B

(2)將P2埠與PWM相關的I/O配置為準雙向口/弱上拉用C語言表示如下:

           P2M1 = 0x00; //0000 0000B

           P2M0 = 0x00; //0000 0000B

(3)將P2埠與PWM相關的I/O配置為高阻輸入用C語言表示如下:

           P2M1 = 0x9E; //1001 1110B

           P2M0 = 0x00; //0000 0000B

(4)將P2埠與PWM相關的I/O配置為開漏用C語言表示如下:   

           P2M1 = 0x9E; //1001 1110B

           P2M0 = 0x9E; //1001 1110B

注:以上STC15W4K系列微控制器引腳圖和I/O設定狀態表格是從STC官方下載的STC15W4K系列微控制器的資料手冊上擷取的。

如果想要讓STC15W4K系列微控制器的所有I/O口與8051微控制器的I/O一樣,只要把STC15W4K系列微控制器的I/O口配置為準雙向口/弱上拉即可,我們將上面的STC15W4K系列微控制器涉及到的所有埠都配置為準雙向口/弱上拉:

P0埠的8個I/O配置為準雙向口/弱上拉:P0M1 = 0x00;    //0000 0000B

                                                               P0M0 = 0x00;    //0000 0000B

P1埠的8個I/O配置為準雙向口/弱上拉:P1M1 = 0x00;    //0000 0000B

                                                               P1M0 = 0x00;    //0000 0000B

P2埠的8個I/O配置為準雙向口/弱上拉:P2M1 = 0x00;    //0000 0000B

                                                               P2M0 = 0x00;    //0000 0000B

P3埠的8個I/O配置為準雙向口/弱上拉:P3M1 = 0x00;    //0000 0000B

                                                               P3M0 = 0x00;    //0000 0000B

P4埠的8個I/O配置為準雙向口/弱上拉:P4M1 = 0x00;    //0000 0000B

                                                               P4M0 = 0x00;    //0000 0000B

P5埠的8個I/O配置為準雙向口/弱上拉:P5M1 = 0x00;    //0000 0000B

                                                              P5M0 = 0x00;    //0000 0000B

我們想用P2埠點亮LED,在開發程式中可以這樣寫:

#include <STC15.h>

sbit LED0 = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;

void SetPortMode(unsigned char port)
{
     switch(port){
          case 0:
              P0M1 = 0x00;
              P0M0 = 0x00;
          break;
          case 1:

             P1M1 = 0x00;

             P1M0 = 0x00; 

          break;
          case 2:
              P2M1 = 0x00;    
              P2M0 = 0x00;
          break;
          case 3:
               P3M1 = 0x00;
               P3M0 = 0x00;
          break;
          case 4:
               P4M1 = 0x00;
               P4M0 = 0x00;
          break;
          case 5:
               P5M1 = 0x00;
               P5M0 = 0x00;
          break;
      }
}

int main(void)

       SetPortMode(2);
       P2 = 0;
       LED0 = 0;
       LED1 = 0;
       LED2 = 0;
       LED3 = 0;
       LED4 = 1;
       LED5 = 1;
       LED6 = 1;
       LED7 = 1;
       while(1);
}