aVR中断数码显示程序

//文件名:INT0.C,int0中断每按一次显示数据正常,INT1,每按一次按键显示不正常
//功能:外部中断的应用
//晶振:8MZH
//MCU:ATMEGA8
#include <iom8.h>
#include<AVRdef.h>
unsigned char countnum;


//以下是延时函数
void Delay(unsigned int i)
{
  unsigned int j;
  for(;i>0;i--)
    for(j=0;j<125;j++);
}
#pragma vector=INT0_vect //中断0中断
__interrupt void int0_isr(void)
{
  if(++countnum>=100)
    countnum=0;
}
#pragma vector=INT1_vect //中断1中断
__interrupt void int1_isr(void)
{
  if(++countnum>=100)
    countnum=0;
}
//
void main()
{
  unsigned char temp;
  unsigned char num[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,
   0xe0,0xfe,0xf6};    //0-9数字段码表
  //
  DDRB=0XFF;    //设置B口为输出模式
  PORTB=0XFF;   //置高电平
  DDRC=0X03;  //11
  PORTC=0XFF;
  DDRD=0XFF;
  PORTD=0XFF;
  MCUCR=0X02;   //10,INT0的下降沿产生中断请求,INT1为低电平时产生中断请求,
//如果选择上升沿中断请求,没看到有什么差别
  GICR|=0XC0;   //11000000
  GIFR=0XC0;    //11000000
  countnum=0;  //初始化全局变量
  SEI();      //打开局中断
  while(1)
  {
    CLI();      //关闭全局中断
    temp=countnum/10;//没有/10,个位十位一起显示,如到2时显22,十位过后显示更不对,个位显示
   PORTC&=~(1);    //LED取第个位,显示个位数
    PORTB=num[temp];//没有此行,不分个位十位,按一下出11,再按出22
    Delay(1);
    PORTC|=0XFF;
    temp=countnum%10;  //没有%10时,到十位以上显示就不正常
    SEI();
   PORTC&=~(2);   //LED取第十位,显示十位数
  PORTB=num[temp];  //没有此行,按INT0没有作用,按INT1同时显示两个数
   Delay(1);
   PORTC|=0XFF;
   SEI();   //打开全局中断
   Delay(1);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值