AVR系列之外部中断测试

        现在就继续整理下 关于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);
                }
}
 
 
 

你可能感兴趣的:(职场,休闲)