//外部中断 只需要设置相关寄存器就可以了 程序很短也就几句就把外部中断设置好了,但是我们要理解它的用处,本程序中只写了外部中断0的下降沿方式触发,其实它还有其他的触发方式,大家不妨试试,例如电平触发。。。。/
//-----------------------------------------------------------------
// 名称: INT0中断计数
//-----------------------------------------------------------------
// 说明: 每次按下计数键时触发INT0中断,中断程序累加计数,
// 计数值显示在三只数码管上,按下清零键时数码管清零.
//
//-----------------------------------------------------------------
#include <avr/io.h>
#include <avr/interrupt.h>
#define INT8U unsigned char
#define INT16U unsigned int
//清零键按下
#define KEY_CLEAR_ON() ((PIND & _BV(PD6)) == 0x00)
//0-9的数字编码,最后一位为黑屏(索引为10)
const INT8U DSY_CODE[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
//计数值
INT8U Count = 0;
//计数值分解后的各待显示数位
INT8U Display_Buffer[3] = {0,0,0};
//-----------------------------------------------------------------
// 在数码管上显示计数值
//-----------------------------------------------------------------
void Show_Count_ON_DSY()
{
Display_Buffer[2] = Count/100;
Display_Buffer[1] = Count%100/10;
Display_Buffer[0] = Count%10;
if(Display_Buffer[2]==0)
{
Display_Buffer[2] = 10;
if(Display_Buffer[1]==0)
Display_Buffer[1] = 10;
}
PORTA = DSY_CODE[Display_Buffer[2]];
PORTB = DSY_CODE[Display_Buffer[1]];
PORTC = DSY_CODE[Display_Buffer[0]];
}
//I/O端口初始化
void Port_init()
{
DDRA = 0XFF;
PORTA = 0X00;
DDRB = 0XFF;
PORTB = 0X00;
DDRC = 0XFF;
PORTC = 0X00;
// DDRD = 0X00;
// PORTD = 0XFF;
}
//INT0初始化
void INT0_init()
{
MCUCR = 0X02; //下降沿触发
GICR = 0x40; //使能中断
GIFR = 0x40; //标志位清零
SREG = 0X80;
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
int main()
{
Port_init();
INT0_init();
while(1)
{
if(KEY_CLEAR_ON())
Count = 0;
Show_Count_ON_DSY();
}
}
//-----------------------------------------------------------------
// INT0中断函数
//-----------------------------------------------------------------
ISR (INT0_vect)
{
Count++;
}
/再来喊下口号,嘿嘿:每天成长一点点,一棵小草也能成长为参天大树/
文章评论(0条评论)
登录后参与讨论