專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

AVR中斷運(yùn)用報(bào)警2路指示

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年10月30日   【字體:

#include <iom16.h>
#include <intrinsics.h>
#define uchar unsigned char
#define uint unsigned int
__flash uchar seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,  //段碼
  0x7f,0x6f};
__flash uchar tab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   //位選碼
uchar flag1=0;       //初始化報(bào)警標(biāo)志1為0
uchar flag2=0;      //初始化報(bào)警標(biāo)志2為0
void delay(uint k)           //延時(shí)k ms子程序
{
 uint i,j;
 for(i=0;i<k;i++)
 for(j=0;j<1140;j++);
}
void show(uint d)           //顯示數(shù)碼管數(shù)值程序
{
  uchar buf[8];
  uchar i=0;
  do
  {
    buf[i]=d%10;
    d=d/10;
    i++;
  }
  while(d);
  while(i)
  {
    PORTA=seg[buf[i-1]];
    PORTC=tab[i-1];
    delay(100);
    PORTA=0xff;
    PORTC=0xff;
    i--;
  }
}
   
void port_init()    //端口初始化設(shè)置
{
 PORTA=0xff;
 DDRA=0xff;
 PORTC=0xff;
 DDRC=0xff;
 PORTD=0xff;
 DDRD=0xff;
 PORTB=0xff;
 DDRB=0xff;
 }
 
void init()            //中斷寄存器設(shè)置
{
  MCUCR=0x4a;          //設(shè)置INT0  和 INT1 為下降沿觸發(fā)   開(kāi)啟睡眠模式
  GICR=0xc0;          //設(shè)置INT0  和 INT1 使能
  SREG=0x80;          //總中斷開(kāi)關(guān)使能
}
 
void main()
 {
   port_init();
   init();
   while(1)
   {
    if(flag1==1)           //INT0時(shí)  數(shù)碼管顯示1
    {
      show(1);
      delay(1000);
    }
    __sleep();              //調(diào)用休眠模式
    if(flag2==1)            //INT0時(shí) 數(shù)碼管顯示2
    {
      show(2);
      delay(1000);
    }
    if(flag1&flag2)         //當(dāng)INT0  和INT1都按下去過(guò)后,表示2路都報(bào)警了 發(fā)光管取反報(bào)警顯示
    {
      PORTB=0xff;
      delay(100);
      PORTB=0x00;
      delay(100);
    }
 }
 }
 
#pragma vector = 0x04
__interrupt void int0()
{
 flag1=1;
}
 
#pragma vector = 0x08
__interrupt void int1()
{
flag2=1;
}
 
注:  調(diào)用休眠模式時(shí) 表示程序到此停止,只有用外部中斷才能喚醒,繼續(xù)下面程序。
      數(shù)碼管顯示函數(shù)采用工程算法。
 

關(guān)閉窗口

相關(guān)文章