ATMEGA16 IO端口相关的寄存器总共有三个DDRX、PORTX和PINX。如果要对IO操作基本上就是对这三个寄存器进行相关的操纵。DDRX也称为数据方向寄存器、PORTX称为数据寄存器、PINX称为端口输入引脚。
DDRX的作用:
当DDRX = 0时,表示的是某端口的引脚为输入;当DDRX = 0xff时表示某端口的引脚为输出。
引脚的状态:输入或者输出是根据什么定义的呢?
是根据高低电平是输入单片机还是从单片机输出。输入是指:不属于单片机的外部的电平输入到单片机;输出是指:单片机的电平输出到单片机的外部。
PORTX的作用:
当DDRX = 0时,若把PORTX置位则表示启动了上拉电阻;若PORTX为0,则不启动上拉电阻。当DDRX = 0xff时,若把PORTX置位则表示输出高电平;若PORTX为0,则输出低电平。
PINX的作用:
PINX寄存器的值与DDRX寄存器的值(输入还是输出)没有任何关系;只与端口引脚上面的值有关系(PORTX)。如果PORTXn = 0xdd,则无论DDTX取什么样的值,其PINX都为0Xdd。
#include #include int main(void) { uint8_t temp; DDRC = 0xff; PORTC = 0xff; DDRA = 0; PORTA = 0xdd; asm("nop");//汇编指令nop,即空操作,其执行时间为一个时钟周期 PORTC = PINA; return 0; }
其中无论DDRA的值是0还是0xff,结果都是一样的。
因此也可以得出一个结论:PINX寄存器里的值是可以按照自己的意愿设定的。原因是单片机能捕捉端口的电平,并置位PINX寄存器。
初始值问题:
单片机刚上电后,端口上的寄存器的初始值是什么?
上电后,默认的初始值为0,即DDRX= 0;PORTX = 0;PINX = 0;
#include #include //#includeint main(void) { uint8_t temp; DDRC = 0xff; PORTC = 0xff; //DDRA = 0; //PORTA = 0xdd; asm("nop");//汇编指令nop,即空操作,其执行时间为一个时钟周期 //_nop(); PORTC = PINA; return 0; }
初始化方法1:
PORTA=0xFF; //内部上拉,高电平
DDRA=0xFF; //输出高电平---------灯一直是灭的
初始化方法2:
DDRA=0xFF; //输出低电平--------灯被错误点亮了
PORTA=0xFF; //输出高电平--------马上被熄灭了,时间很短(1个指令不到uS时间),灯闪了一下,眼睛无法察觉
上一篇:IAR for AVR 报array is too large错误 【已解决】
下一篇:bascom avr版热电偶TCK+AD8495+ADC测温
设计资源 培训 开发板 精华推荐
- LT6656BIS6-5 的典型应用,用于基本连接的 5V 电压基准
- AM2LS-1215S-NZ 15V 2瓦DC-DC转换器的典型应用
- FRDM-K64F: 面向Kinetis® K64、K63和K24 MCU的Freedom开发平台
- LT1085IM-3.6、3.6V/7.5A 线性稳压器和基准电压源的典型应用电路
- SenseTemp:用于仪表电子设备的准确灵活的四通道温度传感器
- 使用 Analog Devices 的 LT1110CN8 的参考设计
- 紧凑型热插拔解决方案简化了高级夹层卡设计
- 使用 MaxLinear, Inc 的 SPX2815 的参考设计
- LT3663IDCB、具有隔离式 3.3V 输出的 5V 降压型稳压器的典型应用
- NCP3163 3.4A 降压型开关稳压器的典型降压应用电路