• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > AVR單片機(jī)入門系列--MEGA端口操作

    AVR單片機(jī)入門系列--MEGA端口操作

    作者: 時間:2012-08-16 來源:網(wǎng)絡(luò) 收藏

    端口是真正的雙向端口,不像51偽雙向。這也是的一項優(yōu)勢,只是時大家注意DDRn就可以了。真正雙向端口在模擬時序方面不如偽雙向的方便。

    本文引用地址:http://www.czjhyjcfj.com/article/148587.htm

    DDRn PORTn PINn 解釋:n為端口號:ABCDE

    DDRn:控制端口是輸入還是輸出,0為輸入,1為輸出。個人記憶方法:一比零大所以往外擠,即1為輸出,0為輸入。

    PORTn:從引腳輸出信號,當(dāng)DDRn為1時,可以通過PORTn=x等端口語句給引腳輸出賦值。

    PINn:從引腳讀輸入信號,無論DDRn為何值,都可以通過x=PINn獲得端口n的外部電平。

    當(dāng)引腳配置為輸入時,若PORTxn 為1“,上拉電阻將使能。內(nèi)部上拉電阻的使用在鍵盤掃描的時候還要說到。

    端口更詳細(xì)功能及介紹以及端口第二功能請參考數(shù)據(jù)手冊。

    端口引腳配置

    DDxn PORTxn PUD (in SFIOR) I/O 上拉電阻說明

    0 0 X 輸入 No 高阻態(tài) (Hi-Z)

    0 1 0 輸入 Yes被外部電路拉低時將輸出電流

    0 1 1 輸入 No高阻態(tài)(Hi-Z)

    1 0 X 輸出 No輸出低電平 ( 漏電流)

    1 1 X 輸出 No輸出高電平 ( 源電流)

    如果有引腳未被使用,建議給這些引腳賦予一個確定電平。最簡單的保證未用引腳具有確定電平的方法是使能內(nèi)部上拉電阻。但要注意的是復(fù)位時上拉電阻將被禁用。如果復(fù)位時的功耗也有嚴(yán)格要求則建議使用外部上拉或下拉電阻。不推薦直接將未用引腳與VCC 或GND 連接,因為這樣可能會在引腳偶然作為輸出時出現(xiàn)沖擊電流。

    下面我們來看例子:

    void port_init(void)

    {

    PORTA = 0x03;

    DDRA = 0x03;

    PORTB = 0x00;

    DDRB = 0x01;

    PORTC = 0x00;

    DDRC = 0x00;

    PORTD = 0x00;

    DDRD = 0x00;// 建議賦值為零

    }

    PORTA = 0x03;DDRA = 0x03;這兩句使PA口的PA1和PA0處于輸出狀態(tài),PA7—PA2處于輸入狀態(tài)。這里的0x03即二進(jìn)制的00000011,從左到右對應(yīng)于Pn7--Pn0八個IO口。

    通過跑馬燈程序來深入理解IO口的

    CODE:

    //ICC- application builder : 2006-11-21 9:20:57

    // Target : M32

    // Crystal: 7.3728Mhz

    #include

    #include

    void _delay(unsigned char n) //延時函數(shù)定義

    {

    unsigned char i,j;

    for(;n!=0;n--) //n*10ms

    {

    for(j=100;j!=0;j--) //100us*100=10ms

    {

    for(i=147;i!=0;i--) //delay 100us

    ;

    }

    }

    }

    int main(void)

    {

    unsigned char i,j,k; //

    PORTA=0xFF; //PA口設(shè)為輸出高電平,燈滅

    DDRA=0xFF; //PA口設(shè)置為輸出

    while(1)

    {

    i=1;

    for (j=0;j8;j++) //循環(huán)8次,即PA0~~PA7輪流閃亮

    {

    PORTA=~i; //反相輸出,低電平有效,對應(yīng)的燈亮

    for (k=0;k10;k++) _delay(100); //延時 100*10=1秒,可自行調(diào)節(jié) i=i1; //左移一位,I的值將向下面的列表那樣變化

    // 0b00000001 PA0

    // 0b00000010 PA1

    // 0b00000100 PA2

    // 0b00001000 PA3

    // 0b00010000 PA4

    // 0b00100000 PA5

    // 0b01000000 PA6

    // 0b10000000 PA7

    }

    }

    }[Copy to clipboard]

    其他IO口操作指令:

    void main(void)

    {

    PORTA=0xff;

    DDRA=0xff; //輸出 模式 ,IO口上拉電阻有效,1為輸出,0為輸入。

    PORTA=0xf0; //等

    以下三條指令只對操作符號右邊的數(shù)字位是一的位操作。

    PORTA=~0x70; //清零 0x70為 01110000 ,即把*三位清零,其余數(shù)位不變。

    PORTA|=0x77; //置一 0x77為 01110111 ,即把*210六位清零,其余數(shù)位不變。

    PORTA^=0x70; //翻轉(zhuǎn) 0x70為 01110000,即*三位,如果是零變成1,是一變成0。

    (P 0x80)==0x80; //按位與 判斷p的第七位是否是一,是則成立

    }

    關(guān)于1

    ADIF是一個寄存器變量,可以堪稱數(shù)字4, 跟手冊中的定義,包含芯片頭文件的定義是一樣的。

    (1

    ADCSR=(1

    ADCSR|=(1

    ADCSR=~(1

    while(ADCSR(1

    while(1)

    {

    while(ADCSR(1

    {

    程序......

    }

    }

    實踐出真知:只看這樣的說明是很枯燥的,從實踐中去學(xué)習(xí)會是更好的途徑,把這些代碼都寫到里,一步一步調(diào)試運行,看看各個端口以及寄存器的效果,也鍛練程序調(diào)試能力,和樂而不為呢?



    評論


    相關(guān)推薦

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

    關(guān)閉
    主站蜘蛛池模板: 房产| 海阳市| 石首市| 巴中市| 静乐县| 遂溪县| 垣曲县| 青冈县| 霍邱县| 广宗县| 莆田市| 怀远县| 扎兰屯市| 拉萨市| 潞城市| 威海市| 广汉市| 鄂伦春自治旗| 望奎县| 错那县| 永德县| 乐都县| 阜宁县| 绥芬河市| 武宁县| 东乌| 乌鲁木齐县| 芒康县| 吉安市| 呼伦贝尔市| 沙雅县| 广东省| 阿拉尔市| 陇川县| 滦平县| 三明市| 金川县| 林芝县| 连城县| 新干县| 黎川县|