您的位置:首页 > 其它

AVR_studio_中断、计时器程序

2012-12-13 14:18 405 查看
/*

本程序应用了外部中断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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: