本节将对AVR单片机的I/O相关知识进行介绍,并和51单片机的I/O进行比较。这里具体介绍的类型是ATmega88V。
AVR单片机的I/O框图如图3.1所示。
图3.1 AVR单片机的I/O框图
AVR单片机的所有I/O端口都具有读/写修改功能,可以输出或吸收大电流,并直接驱动LED。每个I/O端口都有3个寄存器(用来设置读/写操作),分别为数据寄存器PORTx、数据方向寄存器DDRx和端口输入引脚寄存器PINx。其中数据寄存器和数据方向寄存器为读/写寄存器,而端口输入引脚寄存器为只读寄存器。将数据方向寄存器清零,数据寄存器置位,再将寄存器MCUCR(MCU控制寄存器)的PUD位置位,可使I/O端口处于高阻态。
ATmega88V有23个可编程的I/O端口,其中PORTB、PORTC和PORTD分别有7个、6个和7个I/O引脚,对于一般的应用来说是足够的。在运用过程中,不一定所有的I/O引脚都会使用到。如果有引脚未被使用,建议给其一个确定电平。例如,在一般情况下,初始化设备时,应将所有I/O端口统统设置一次,以确保I/O端口工作在已知的状态下。
另外,大多数I/O端口都具有第二功能。
使用AVR单片机时,需要设置I/O端口的方向,如果不设置,将以默认的状态存在。而51单片机的I/O端口是准双向输出类型的。准双向输出类型可用做输出和输入功能而不需要重新配置I/O端口的方向。51单片机的I/O端口只有一个寄存器Px。
举例说明:需要设置某个I/O端口为输出高电平,则AVR单片机需要设置DDRx和PORTx 2个寄存器;而51单片机只需要设置Px为高即可。对于输入,AVR单片机仍需要设置2个寄存器,而51单片机直接读取Px的值即可。
在此做这个比较,是为了让读者了解AVR单片机与51单片机I/O端口设置的不同,在编写程序时,这是需要特别注意的地方,尤其是对于刚从51单片机转过来准备学习AVR单片机的工程师而言。长时间使用一款单片机会导致工程师将很多编写习惯不知不觉地用在其他单片机上,这是大部分工程师都会犯的错误。