//实验名称:INT1,INT0 中断实验
//实验现象: 按下INT1键开始计数,按下INT0键停止计数并清零。数据通过数码管显示
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
uchar const SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar const ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint cnt1,cnt2,flag;
//=======================
void delay_ms(uint k)
{ uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<1140;j++);
}
}
//======================
void show(uint j,uint k)
{
PORTB=0xff;
PORTA=SEG7[j];
PORTB=ACT[k];
delay_ms(1);
}
//=======================
void show_mark(uint j,uint k)
{
PORTB=0xff;
PORTA=SEG7[j]|0x80;
PORTB=ACT[k];
delay_ms(1);
}
//=========================
void port_init()
{
DDRA=0xff;//段选
PORTA=0x00;
DDRB=0xff;//位选
PORTB=0x00;
DDRC=0xff;
PORTC=0x00;
DDRD=0x00;//按键
PORTD=0xff;
}
//======================
void main(void)
{
uint i,j;
port_init();
MCUCR = 0x0a;
GICR = 0xc0;
SREG=0x80;
while(1)
{
if(flag==1)
{
if(++cnt1>59){cnt1=0;cnt2++;}
if(cnt2>59)cnt2=0;
for(i=0;i<10;i++)
{
j++;
if(j>3)j=0;
switch(j)
{
case 0:show(cnt1%10,0);break;
case 1:show(cnt1/10,1);break;
case 2:show_mark(cnt2%10,2);break;
case 3:;show(cnt2/10,3);break;
default:break;
}
}
}
}
}
//***************************************************
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
flag=1;
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
flag=0;
cnt1=0;cnt2=0;
}