/*
本程序应用了外部中断1、0,定时器中断0,
初始显示变量uname(100000),
按下中断1显示内容减1,中断0加1,定时器每隔一秒加1
显示子函数AVR_display;
频率1M
A口接数码管段选
B口接数码管位选
*/
#include<avr/io.h>
#include <avr/interrupt.h>
volatile unsigned long Ex_i; //定时器用的变量
volatile unsigned long uname=100000;//初始显示内容
/*=====0-9=====A-G=====*/
unsigned char table[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
//共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F
/*0-7*/
unsigned char num[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//共阳极数码管的wei码0 1 2 3 4 5 6 7 8
void init_avrinter();//外部中断初始化
void init_avrtimer0();//计数器0初始化
void delay(unsigned int x);//延时函数
void AVR_display(unsigned long nnn);//显示函数
int main() //主程序
{
DDRA=0xff; //设置方向寄存器为输出
DDRB=0xff;
DDRD=0xff;
PORTD=0xff;
init_avrinter();
init_avrtimer0();
while(1)
{
AVR_display(uname);
}
}
void init_avrinter()//外部中断初始化
{
sei(); //开总中断
MCUCR |= (1 << ISC10)|(1 << ISC00)|(1 << ISC01); //INT1下(shang)降沿触发 INT0上降沿触发
GICR |= (1 << INT1)|(1 << INT0);//使能INT1 INT0
}
void init_avrtimer0()//定时器0初始化
{
TCNT0 = 5;
TIMSK |= (1 << TOIE0);//使能TC0溢出中断
TCCR0 |= (1 << CS01);// 8分频
}
SIGNAL(SIG_INTERRUPT0)//外部中断0程序
{
uname++; //显示内容加1
}
SIGNAL(SIG_INTERRUPT1)//外部中断1程序
{
uname--; //显示内容减1
}
SIGNAL(SIG_OVERFLOW0)//外部中断1程序
{
Ex_i ++;
TCNT0 = 5;
if(Ex_i>=500)
{
Ex_i=0; uname++;
}
}
void delay(unsigned int x)//延时
{
unsigned int Dl_i;
for(Dl_i=0;Dl_i<x;Dl_i++);
}
void AVR_display(unsigned long nnn)//显示 9999 9999一下十进制数
{
unsigned char n[8],i,j=8;
unsigned long nn;
nn = nnn;
for(i=0;i<8;i++)
{
n[i] = nn%10;
nn /= 10;
}
for(i=0;i<8;i++)
{
if(n[7-i])break;
j--;
}
for(i=0;i<j;i++)
{
PORTA = table[n[i]];
PORTB = num[7-i]; //板子上数码管 位方向 是高位到低位(7>>>0);
delay(270);
PORTA = 0xff;
PORTB = 0xff;
}
}
AVR_studio_中断、计时器程序
最新推荐文章于 2022-03-30 15:22:19 发布