AVR_studio_中断、计时器程序

本文介绍了一个基于AVR单片机的程序,该程序利用外部中断及定时器实现数码管上的数字动态显示功能。初始显示为100000,通过外部中断1减少数值,中断0增加数值,并且定时器每秒自动加一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*

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

       }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值