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