现在就继续整理下 关于AVR的外部中断测试 关于中断的作用 在这里就不必多说什么了 至于它的中断处理过程 可以分为三个步骤 一个为中断现场保护 接着是中断服务程序 最后便是现场恢复
还是一个简单的中断测试 使用外部中断0 数码管显示中断次数
管脚的安排是这样的 还是用595驱动数码管 接法如上一篇所说的一样 即MOSI接595的SI脚 SCK接595的时钟信号端 PB4接595的数据寄存器锁存端RCK
代码如下:
#include <iom16v.h>
#include <macros.h >
#define uchar unsigned char
#define uint unsigned int
uchar IntCnt = 0 ;
uchar disp [ ] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90} ;
//中断处理函数
#pragam interrupt_handler int0_isr : 2
void int0_isr ( void )
{
IntCnt ++ ;
}
//延时子函数
void DelayMs ( uchar i )
{
uchar j ;
while ( i-- )
{
j = 167 ;
while ( j-- ) ;
}
}
//SPI的初始化为主机模式
void SPIMasterInit ( void )
{
DDRB |=( 1<<PB5 ) | ( 1<<PB7 ) ;
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);
}
//SPI传输数据
void SPIMasterData ( uchar TranData )
{
SPDR = TranData ; //传输数据
while ( ! ( SPSR & ( 1<<SPIF ) ) ) ; //等待数据传输结束
}
//通过595输出数据
void SPI595out ( uchar i )
{
PORTB &= ~ ( 1<<4 ) ; //准备锁存数据
SPIMasterData ( i ) ;
PORTB |= ( 1<<4 ) ; //锁存数据
}
//初始化各种信息
void InitDevices ( void )
{
CLI ( ); //关全部中断
SPIMasterInit ( ); //SPI初始化为主机
MCUCR = 0x02; //中断0,下降沿触发
GICR = 0x40; //开中断0,
SEI ( ); //开中断
}
//主函数
void main ( void )
{
uchar temp;
DDRA = 0x00; //方向输入
PORTA = 0xFF; //打开上拉
DDRB = 0xFF; //方向输出
PORTB = 0xF0; //电平设置
DDRC = 0x00;
PORTC = 0xFF;
DDRD = 0xFF;
PORTD = 0xFF;
InitDevices ( );
while ( 1 )
{
if ( IntCnt > 9)
{
if ( IntCnt > 99)
{
DDRB = 0xff;
PORTB = 0xff;
temp = IntCnt / 100;
SPI595Out ( disp [temp] );
PORTB = 0xfb;
DelayMs(1);
PORTB = 0xff;
temp = IntCnt%100/10;
SPI595Out(disp[temp]);
PORTB = 0xfd;
DelayMs(1);
PORTB = 0xff;
temp = IntCnt%10;
SPI595Out(disp[temp]);
PORTB = 0xfe;
}
else
{
DDRB = 0xff;
PORTB = 0xff;
temp = IntCnt/10;
SPI595Out(disp[temp]);
PORTB = 0xfd;
DelayMs(1);
PORTB = 0xff;
temp = IntCnt%10;
SPI595Out(disp[temp]);
PORTB = 0xfe;
}
}
else
{
DDRB = 0xff;
PORTB = 0xfe;
SPI595Out(disp[IntCnt]);
}
DelayMs(1);
}
}