專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

PIC32MX220F032B學(xué)習(xí)筆記之I/O口

作者:佚名   來源:枯葉之碟的博客   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月09日   【字體:

學(xué)校發(fā)的實(shí)驗(yàn)例子太高深了,對于我們零基礎(chǔ)的孩子來說太痛苦了,只有自己找資料湊湊了。邊學(xué)習(xí)邊記錄,提供大家參考和指正。

 

先說說基礎(chǔ)定義吧:

1.一般要先定義端口的輸入和輸出TRISx(數(shù)據(jù)方向寄存器)

如果相應(yīng)的TRISx的位為0表示為輸出,這個(gè)很容易記住,Output的第一個(gè)字母O和數(shù)字0相象。
如果相應(yīng)的TRISx的位為1表示為輸入,這個(gè)很容易記住,Input的第一個(gè)字母I和數(shù)字1相象。

如:
TRISB=0b11001010;(二進(jìn)制表示0b)注意的是二進(jìn)制從右向左數(shù)依次為0,1,2...
TRISB=0xCA;(十六進(jìn)制0x)  十六進(jìn)制1位換成4位二進(jìn)制0xf=0b1111
TRISB=202;(十進(jìn)制)

他們的效果都是一樣的表示RB7,RB6,RB3,RB1為輸入,其余(RB5,RB4,RB2,RB0)為輸出。

也可以單獨(dú)的對某個(gè)位進(jìn)行操作:

TRISAbits.TRISA7=0;//A端的編號七設(shè)置為輸出

TRISBbits.TRISB1=1;//B端的編號一設(shè)置為輸入

 

1.1也可以用我們實(shí)驗(yàn)例子中所用到的在plib.h頭文件中的庫函數(shù)

PORTSetPinsDigitalOut(IOPORT_B, BIT_7);//將B端的RB7設(shè)為數(shù)字輸出端口

 

順便說一下,PIC默認(rèn)時(shí),引腳是輸入的,即默認(rèn)時(shí),TRISx=0xFF.F=1111;

 

關(guān)于何時(shí)輸入輸出的問題百度了以下:

輸出:如果你要用某個(gè)引腳控制一個(gè)東東,如讓它高電平或低電平,則這個(gè)引腳就得設(shè)置為輸出。(例如點(diǎn)亮一個(gè)燈)
輸入:如果你想知道某個(gè)引腳是高電平或低電平,則這個(gè)引腳就得設(shè)置為輸入。還有如果作為AD轉(zhuǎn)換,相應(yīng)的引腳就得做為輸入。(例如獲取按鈕的狀態(tài))

 

 

2.然后就是設(shè)置I/O口的值PORTx ——— 端口寄存器(可以點(diǎn)亮led燈了)

如果相應(yīng)的PORTx的位為1表示為高電位

如果相應(yīng)的PORTx的位為0表示為低電位

如:

PORTA=0b10100010;        或        PORTA=0xA2;
都表示RA1,RA5,RA7為高電位,其他的為低電位。

同樣也可以單個(gè)控制

PORTBbits.RB6=1;//B端的RB6為高電位

 

2.1也可以用我們實(shí)驗(yàn)例子中所用到的在plib.h頭文件中的庫函數(shù)

PORTSetBits(IOPORT_B,BIT_7|BIT_8|BIT_9);//將B端IO口的RB7,RB8,RB9置1高電位

PORTClearBits(IOPORT_A,BIT_0|BIT_1|BIT_3);//將A端IO口的RA0,RA1,RA3清零低電位

注意:要引用這些庫函數(shù)需要在起始位置添上#include

 

先寫個(gè)簡單的流水燈例子吧

開發(fā)板電路原理圖如下:


注意到有四個(gè)led D10,D12,D13,D4燈分別對應(yīng)RB7,RB8,RB9,RB13只需控制這幾個(gè)端口就可以做簡單的流水燈了。

但觀察實(shí)際的開發(fā)板從上到下為D13,D12,D10,D4,也就是從上到下控制RB9,RB8,RB7,RB13要以實(shí)際為主。

代碼如下:


#include //32位的基本頭文件
#include//定義了多種庫函數(shù)的頭文件
#pragma config JTAGEN = OFF//好像用MPLABX IDE測試都要關(guān)閉JTAGEN端口(不太懂)

int main()
{
    int i;
    TRISBbits.TRISB7=0;
    TRISBbits.TRISB8=0;
    TRISBbits.TRISB9=0;
    TRISBbits.TRISB13=0;

//設(shè)置RB7,RB8,RB9,RB13為輸出

//也可直接用PORTSetPinsDigitalOut(IOPORT_B, BIT_7|BIT_8|BIT_9|BIT_13);代替

PORTSetBits(IOPORT_B,BIT_7|BIT_8|BIT_9|BIT_13);

//將RB7,RB8,RB9,RB13 置1 (我發(fā)現(xiàn)這開發(fā)板置1的時(shí)候燈滅,置0的時(shí)候亮不太清楚為什么)

while(1)
    {
     for(i=0;i<100000;i++)
    {
//    單個(gè)命名賦值有沖突錯(cuò)誤 ,單個(gè)賦值時(shí)發(fā)現(xiàn)燈沒有正常的流水亮,多次調(diào)試都不成功最終放棄
//    PORTBbits.RB9=0;
//    PORTBbits.RB13=1;
//    PORTBbits.RB8=1;
//    PORTBbits.RB7=1;
  
    }
//     PORTB=0b11110111111111;//這個(gè)可以用,與下面兩句等效
     PORTClearBits(IOPORT_B,BIT_9);
    PORTSetBits(IOPORT_B,BIT_7|BIT_8|BIT_13);
     for(i=0;i<100000;i++)
    {
      
//    PORTBbits.RB9=1;
//    PORTBbits.RB13=1;
//    PORTBbits.RB8=0;
//    PORTBbits.RB7=1;
   
    }
//    PORTB=0B11111011111111;//同上(使用時(shí)注意去掉下面兩句)
    PORTClearBits(IOPORT_B,BIT_8);
    PORTSetBits(IOPORT_B,BIT_7|BIT_9|BIT_13);
     for(i=0;i<100000;i++)
     {
       
//    PORTBbits.RB9=1;
//    PORTBbits.RB13=1;
//    PORTBbits.RB8=1;
//    PORTBbits.RB7=0;
  
     }
//  PORTB=0B11111101111111;
 PORTClearBits(IOPORT_B,BIT_7);
 PORTSetBits(IOPORT_B,BIT_8|BIT_9|BIT_13);
 
    for(i=0;i<100000;i++)//等待延時(shí)的簡單設(shè)置
    {
      
//    PORTBbits.RB9=1;
//    PORTBbits.RB8=1;
//    PORTBbits.RB7=1;
//    PORTBbits.RB13=0;
    }
//  PORTB=0B01111111111111;
  PORTClearBits(IOPORT_B,BIT_13);//先點(diǎn)亮RB13
  PORTSetBits(IOPORT_B,BIT_7|BIT_8|BIT_9);//確保其他端口滅
    }
  
}

3.總結(jié)

面對一個(gè)新的領(lǐng)域確實(shí)有點(diǎn)摸不著頭腦,還有一些語句也太多了,幾條不同的語句竟然都表示同一個(gè)意思甚至匯編,C語言,偽指令都混用。

雖然這樣可移植性和適用語言性大大增強(qiáng)了,但對我們初學(xué)者也太多了,有點(diǎn)混亂?磥砦业幕A(chǔ)也沒有掌握,還有這么多語句要理解。

 有些疑問還需要慢慢的查詢和解決。

 

轉(zhuǎn)載請說明出處謝謝。

關(guān)閉窗口

相關(guān)文章