單片機(jī)普通I/O口是最常用的功能之一,下面通過(guò)AVR單片機(jī)控制發(fā)光二極管點(diǎn)亮和熄滅來(lái)學(xué)習(xí)單片機(jī)的I/O口功能。
RP1為排阻,1腳為公共端——接地,其余串聯(lián)發(fā)光二極管后接單片機(jī)I/O口(PB0-PB7)。
單片機(jī)的PB0-PB7口中的任一個(gè)輸出高電平(5V),則相應(yīng)的發(fā)光二極管點(diǎn)亮。
1、AVR單片機(jī)I/O口具有8個(gè)寄存器:方向控制寄存器(DDRx)、數(shù)據(jù)寄存器(PORTx)、輸入引腳寄存器(PINx)(其中x=A/B/C/D),I/O口的功能由這三個(gè)寄存器配置;
2、方向控制寄存器(DDRx)用于控制I/O口屬于輸入還是輸出,
DDRx=1時(shí),I/O口為輸出,此時(shí)數(shù)據(jù)寄存器PORTx中的數(shù)據(jù)輸出到外部引腳。
DDRx=0時(shí),I/O口為輸入,此時(shí)輸入引腳寄存器PINx中的數(shù)據(jù)就是外部引腳的實(shí)際電平。
3、輸入寄存器 PINx 實(shí)際不是一個(gè)寄存器,而是一個(gè)可選通的三態(tài)緩沖器,外部引腳通過(guò)該三態(tài)緩沖器與 MCU 的內(nèi)部總線連接,因此,讀 PINx 時(shí)是讀取外部引腳上的真實(shí)和實(shí)際邏輯值,實(shí)現(xiàn)了外部信號(hào)的同步輸入。
例子程序:
int main(void) // main函數(shù)為主函數(shù)入口
{
DDRB = 0X01; //配置端口PB0為輸出口
//DDRB = 0XFF; //配置端口PB全部為輸出口
PORTB = 0X00; //初始化,PORTB輸出低電平,使LED熄滅
while(1)
{
//PORTB = 0X01; //使PB0輸出高電平,點(diǎn)亮PB0的LED,其余各口保持原來(lái)狀態(tài)不變
PORTB |= (1 < pb0);="" 功能等同于portb="">
//其余位的狀態(tài),平時(shí)程序中推薦這種使用方法
//PORTB = 0XFF; //使PB的8個(gè)口全部輸出輸出高電平,當(dāng)PB口全部置為輸出口后
//點(diǎn)亮所有8個(gè)LED
編寫代碼時(shí)注意事項(xiàng):
1)AVR單片機(jī)中的端口配置寄存器: I/O口為標(biāo)準(zhǔn)的三態(tài)口(高電平、低電平、高阻態(tài)這三種狀態(tài));
2) 使用 I/O 口時(shí),首先要設(shè)置其為輸入還是輸出方式;
3) 當(dāng) I/O 為輸入端口時(shí),讀取外部電平的值為PINxn 的值,不是PORTxn 的值;
4) 當(dāng) I/O 工作在輸入方式,要根據(jù)實(shí)際情況使用或不使用內(nèi)部的上拉電阻;
5) 當(dāng)I/O口由輸出設(shè)置成輸入后,必須等待一個(gè)時(shí)鐘周期后才能正確的讀到外部引腳 PINxn 的值。
聯(lián)系客服