I/O口的基本结构
AVR单片机每组I/O口配备3个8位寄存器,它们分别是方向控制寄存器DDRx、数据寄存器PORTx和输入引脚寄存器PINx(x=A/B/C/D)。
当DDRx=1时,I/O口处于输出工作方式。此时数据寄存器PORTx中的数据通过一个推挽电路输出到外部引脚。
AVR的输出采用推挽电路是为了提高I/O口的输出能力,当PORTx=1时,I/O口引脚呈现高电平,同时可提供输出20mA的电流;而当PORTx=0时,I/O引脚呈现低电平,同时可吸纳20mA电流。
当DDRx=0时,I/O口处于输入工作方式。此时引脚寄存器的PINx中的数据就是外部引脚的实际电平(PINx的读取最好是等待一个时钟读取,读取PORTx的值无法得到外部引脚电平,不要搞混),通过读I/O指令可将物理引脚的真实数据读入MCU。此外,当I/O口定义为输入时,通过PORTx的控制,可使用或不使用内部的上拉电阻。
DDRXn | PORTXn | PUD | I/O方式 | 内部上拉电阻 | 引脚状态说明 |
---|---|---|---|---|---|
0 | 0 | X | 输入 | 无效 | 三态(高阻) |
0 | 1/0 | 0 | 输入 | 有效/无效 | 有效时外部引脚拉低输出电流(μA) |
0 | X | 1 | 输入 | 无效 | 三态(高阻) |
1 | 0 | X | 输出 | 无效 | 推挽0输出,吸收电流(20mA) |
1 | 1 | X | 输出 | 无效 | 推挽1输出,输出电流(20mA) |
表中的PUD为寄存器SFIOR中的一位,它的作用相当于AVR全部I/O口内部上拉电阻总开关。
当PUD=1时,AVR所有I/O内部上拉电阻都不起作用;
当PUD=0时,各个I/O口内部上拉电阻取决于PORTn的设置。
AVR通用I/O口的主要特点如下:
- 双向可独立位控的I/O口。ATmega16的PA、PB、PC、PD 4个接口都是8位双向I/O口,每一位引脚都可以单独进行定义,相互不受影响。
- Push-Pull大电流驱动(最大40mA)。每个I/O口输出方式均采用推挽式缓冲器输出,提供大电流的驱动,可以输出(吸入)20mA的电流,因而能直接驱动LED显示器。
- 可控制的引脚内部上拉电阻。每一位引脚内部都有独立的、可通过编程设置的,设定为上拉有效或无效的内部上拉电阻。当I/O口用于输入状态,且内部上拉电阻激活(有效)时,如果外部引脚被拉低,则构成电流源输出电流(μA量级)。
- DDRx可控的方向寄存器。
I/O接口寄存器
ATmega16的4个8位接口都有各自对应的3个I/O口寄存器,它们占用了I/O空间的12个地址。
名称 | I/O空间地址 | RAM地址 | 作用 |
---|---|---|---|
PORTA | $1B | 0x003B | A口数据寄存器 |
DDRA | $1A | 0x003A | A口方向寄存器 |
PINA | $19 | 0x0039 | A口输入引脚寄存器 |
PORTB | $18 | 0x0038 | B口数据寄存器 |
DDRB | $17 | 0x0037 | B口方向寄存器 |
PINB | $16 | 0x0036 | B口输入引脚寄存器 |
PORTC | $15 | 0x0035 | C口数据寄存器 |
DDRC | $14 | 0x0034 | C口方向寄存器 |
PINC | $13 | 0x0033 | C口输入引脚寄存器 |
PORTD | $12 | 0x0032 | D口数据寄存器 |
DDRD | $11 | 0x0031 | D口方向寄存器 |
PIND | $10 | 0x0030 | D口输入引脚寄存器 |
PORTx支持读和写,复位后默认为0;
DDRx支持读和写,复位后默认为0;
PINx支持读,没有默认值(本身用于读取外部电压的);
注意:
- 使用AVR的I/O口要注意,要先正确设置DDRx方向寄存器,再进行I/O口的读/写操作。
- AVR的I/O口复位后的初始状态全部为输入工作方式,内部上拉电阻无效。因此,外部引脚呈现三态高阻输入状态。
- 用户程序首先需要对要使用的I/O口进行初始化设置,然后根据实际需要设定使用I/O口的工作方式。放设定为输入方式时,还要考虑是否使用上拉电阻。
- 在硬件电路设计时,如果利用AVR内部I/O的上拉电阻,则可节省外部的上拉电阻。
通用数字I/O接口的设置与编程
在AVR汇编指令系统中,直接用于对I/O寄存器的操作指令有以下3类,全部为单周期指令:
- IN/OUT指令:实现了32个通用寄存器与I/O寄存器之间的数据交换,格式为:
IN Rd,A ;从I/O寄存器A读取数据到通用寄存器Rd
OUT A,Rr ;通用寄存器Rr数据送I/O寄存器A
- SBI/CBI指令:实现了对I/O寄存器中指定位的置1或清0,格式为:
SBI A,b ;将I/O寄存器A的第b位置1
CBI A,b ;将I/O寄存器A的第b位清0
- SBIC/SBIS指令:为转移类指令,它根据I/O寄存器中指定位的数值实现跳行转移,格式为:
SBIC A,b ;I/O寄存器A的第b位为0时,跳行执行
SBIC A,b ;I/O寄存器A的第b位为1时,跳行执行