以下讲述以ATmega16为例:
有PORTA、PORTB、PORTC、PORTD,共32路通用I/O接口,分别对应于芯片上32个I/O引脚,
所有的管脚都是复用的,其中第一功能作为数字通用I/O使用,复用功能为其他功能。 使用AVR的I/O口,首先是要设置其工作方式,确定其工作在输出还是输入方式,否则无法正常使用。 当设置为输入时,要考虑是否启用上拉电阻。
I/O口复位以后的初始状态全部是输入工作方式,内部上拉电阻无效,因此,I/O外部引脚呈现三态高
阻的输状态。
当I/O工作在输入状态时,如果要读取外部引脚的电平,必须是读取PINxn的值,而不是PORTxn的
值,PINxn反映的才是真实电平。
一旦将I/O口由输出设置为输入方式后,必须等待1个时钟周期后才能正确的读到外部引脚PINxn的
值。
AVR的IO口灌电流能力与拉电流能力均达30mA 51的拉电流能力<100uA,灌电流能力10mA 拉电流能力: 灌电流能力:
能够从IO口流出的最大电流。 能够流入IO口的最大电流。
I/O口输出功能时设计要点
使用方法
先定义I/O口的工作方式为输出,通过设置PORTx,可以控制I/O口对外输出“0”或“1”。
1
IO口与IO寄存器的映射(x代表A~D)
方向寄存器:DDRx 数据寄存器:PORTx 输入寄存器:PINx
C语言变量与寄存器的映射
io.h这个文件中将所有寄存器映射为同名的变量,对这些变量的读写相当于对寄存器的读写
输出状态IO寄存器设置
DDRx某一位置1,相应位的IO口被设置为输出
PORTx某一位置1或0,对应IO口相应位的电平高低
当输出“1”时,可提供20mA左右的驱动电流;当输出“0”时,可吸收20mA左右的灌电流(最大
为40mA)。
当连接的外围器件和电路需要大电流驱动或者有大电流灌入时时,应该考虑使用功率驱动电路。 IO口输出操作总结
第一步:IO设置为输出 DDRB = 0xff;
DDRB |= (1 << 5); //第五位设为输出 第二步:对应位输出数据 输出1: PORTB |= (1 << 5); //第五位输出高电平 输出0: PORTB &= ~(1 << 5); //第五位输出低电平 对应位取反:PORTB ^= (1 << 5); //第五位取反
2
因篇幅问题不能全部显示,请点此查看更多更全内容