//含IO操作,外部中断操作 By AnalogMaster
#include <mega8.h>
#define uchar unsigned char
#define uint unsigned int
#define SEI SREG|=0x80
//uchar dtab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
uchar dtab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴
uchar num;
void delayms(void)
{
uint i;
for(i=1;i<1140;i++){;}
}
void delaynms(uint n)
{
uint i;
i="0";
while(i<n)
{
delayms();
i++;
}
}
uchar keyscan(void) //单键扫描
{
if (PINC.0==0) //读入IO电平状态
{
delaynms(10);
if (PINC.0==0)
{
for(;;){if (PINC.0==1){return 10;}} //等待按下键释放
}
else return 0;
}
else return 0;
}
void INT_Init(void)
{
SEI; //全局中断使能
MCUCR|=0x0a; //INT0 INT1下降沿
GICR|=0xc0; //INT0 INT1使能
GIFR&=0x3f; //清除INT0 INT1中断标志
}
interrupt [EXT_INT0] void INT0_INT(void) //INT0中断服务函数,
{ //中断标志自动清除
num++;
if (num==10){num=0;}
PORTB="dtab"[num];
}
interrupt [EXT_INT1] void INT1_INT(void) //INT1中断服务函数
{
if (num==0){num=9;}
else {num--;}
PORTB="dtab"[num];
}
void main(void)
{
DDRD.0=1; //PD0引脚为输出
PORTD.0=1; //IO输出设置:DDRX.n=1;之后PORTX.n=0则输出0;PORTX.n=1则输出1.
DDRC.0=0; //PC0为读入
PORTC.0=1; //IO读入设置:DDRX.n=0;之后PORTX.n=1;则该IO设为读入方式.
DDRD.2=0;
PORTD.2=1;
DDRD.3=0;
PORTD.3=1;
DDRB="0xff";
PORTB="dtab"[0];
INT_Init();
while (1)
{
if (keyscan()==10)
{
num++;
if (num==10){num=0;}
PORTB="dtab"[num];
while(1)
{
delaynms(50); //延时
PORTD.0=~PORTD.0;
if (keyscan()==10){break;}
}
}
}
}
文章评论(0条评论)
登录后参与讨论