一、数据寄存器PORTx和数据方向寄存器DDRx为读/写寄存器,而端口输入引脚PINx为只读寄存器。但是需要注意的是,对PINx寄存器某一位写入逻辑“1”将造成数据寄存器相应位的数据发生“0”与“1”的交替变化。
当寄存器MCUCR的上拉电阻禁止位PUD置位时所有端口引脚的上拉电阻都被禁止。不论如何配置DDxn,都可以通过读取PINxn寄存器来获得引脚电平。PINxn寄存器的各个位与前面的锁存器组成了一个同步器。这样就可以避免在内部时钟状态发生改变的短时间范围内由于引脚电平变化而造成的信号不稳定。其缺点是引入了延迟。
二、AVR I/O具备多种I/O模式:
1.高阻态,多用于高阻态模拟信号输入,例如ADC数模转换器输入,模拟比较器输入。
2.弱上拉状态(Rup=20K~50K)输入用。为低电平信号输入作了优化,省去外部上拉电阻,例如按键输入,低电平中断触发信号输入。
3.推免强输出状态,驱动能力特强(>20mA),可直接推动LED,而且高低驱动能力对称。
三、写用PORTx,读取用PINx。
实验时,尽量不要把管脚直接接到GND/VCC,当设定不当,IO口将会输出/灌入80mA(Vcc=5V)的大电流,导致器件损坏。
做输入时:
1.通常要使能内部上拉电阻,悬空(高阻态)将会很容易受干扰。
2.尽量不要让输入悬空或模拟输入电平接近VCC/2,将会消耗太多的电流。
3.如果先前I/O口为输出状态,设置为输入状态后,必须等待1个时钟周期后才能正确的读到外部引脚PINx的值。
4.功能模块(中断,定时器)的输入可以是低电平触发,也可以是上升沿或下降沿触发。
5.用于高阻模拟输入信号输入,切记不要使能内部上拉电阻,影响精确度。