Atmega16
IO相关寄存器
学习每种单片机要从控制各IO口的高低电平开始,avr系列与IO有关的寄存器每组有三类,PORTn ,DDRn , PINn,及SFIOR内PUD位,PORTn与DDRn是控制端口的状态,对应关系如图。
PINn为读端口当前高低电平状态。
现在以keil中51系列为例,定义端口然后对等关系定义AVR端口在ICCARV中。
51 : Sbit led=P1^2; led=0; led=1;
AVR: #define ledh PORTA|=(1<<PA0) led=1;
#define ledl PORTA&=~(1<<PA0) led=0;
PINn return PINn; if(PINn==XX)
中断向量及中断程序写法
ICCAVR中断函数书写格式;
#pragma interrupt_handler timer0_ovf:10 //定时器溢出
Void timer0_ovf(void) 中断源中断向量
{}
外部中断
外部中断有三个,分别为INT0,INT1,INT2;对应端口为PD2,PD3,PB2;首先设置端口状态INT0为例,PORTD|=(1<<PD2);
DDRD&=~(1<<DDD2);
中断产生条件设置
外部中断0、1MCUCR Bit0:3 位ISC00 ISC01 ISC10 ISC11
外部中断 2 MCUCSR Bit :6 ISC2
INT0于INT1 引脚中断产生条件是一样的如上表
INT2 ISC2写0时低电平触发,写1时高点批评触发
中断控制寄存器: GICR Bit 5:7 INT2,INT0,INT1
需要哪个中断时将其写1 GICR|=(1<<INTn);
中断标志位寄存器:GIFR Bit5:7 INTF2/INTF0/INTF1
全局中断打开,中断控制位打开,引脚上发生合适的电平变化,对应的中断标志位就会置位,对其写1实现清零。
下边写个INT0的程序发生中断时将PORTA取反
本章到这里,不定期更新,后边有、定时器,UART,AD,SPI,EEPROM、IIC总线。更有Atmega128等着你,不要走开,哈哈哈