打印
[Atmel]

用AtmelStudio6.2跑mega16例程(44)工作于异步模式的数字时钟

[复制链接]
886|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddllxxrr|  楼主 | 2014-10-31 22:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本例使用T/C2定时器工作于异步模式,由PB6(TOSC1)与PB7(TOSC)外接32768Hz晶振提供时钟,通过设置异步状态可选择T/C2的时钟源,T/C2的时钟频率为32768Hz/64 = 512Hz

以下是Proteus截图:

以下是Studio6.2溢出中断:

程序清单:
/*
* GccApplication7.c
*
* Created: 2014-10-31 21:15:59
*  Author: Administrator
*/
#define F_CPU 4000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
const uint8_t SEG_CODE[] = {0x3F,0x06,0x58,0x4F,0x66,0x6D,0x7d,0x07,0x7F,0x6F,0x00};
uint8_t Disp_Buffer[] = {0,0,0x40,0,0,0x40,0,0};
uint8_t Disp_Idx;
uint8_t Key_State = 0xFF;
uint8_t h,m,s;

void Increase_Hour()
{
   if(++h >23) h = 0;
   Disp_Buffer[0] = SEG_CODE[h/10];
   Disp_Buffer[1] = SEG_CODE[h % 10];
}

void Increase_Minute()
{
    if(++m > 59)
        {
           m = 0; Increase_Hour();
        }
        Disp_Buffer[3] = SEG_CODE[m/10];
        Disp_Buffer[4] = SEG_CODE[m % 10];
}

void Increase_Second()
{
    if(++s >59)
        {
                s = 0; Increase_Minute();
        }       
        Disp_Buffer[6] = SEG_CODE[s/10];
        Disp_Buffer[7] = SEG_CODE[s % 10];
}
int main(void)
{
    DDRA = 0xFF; PORTA = 0xFF;
        DDRD = 0xFF; PORTD = 0xFF;
        DDRB = 0x00; PORTB = 0xFF;
       
        TCCR0 = 0x03;
        TCNT0 = 256 - F_CPU/64.0 * 0.004;
        ASSR = 0x08;
        TCCR2 = 0x04;
        TCNT2 = 0;
        TIMSK =  _BV(TOIE2) | _BV(TOIE0);
       
        h = 12; m=s=0;
        Disp_Buffer[0] = SEG_CODE[h/10];
        Disp_Buffer[1] = SEG_CODE[h%10];
        Disp_Buffer[3] = SEG_CODE[m/10];
        Disp_Buffer[4] = SEG_CODE[m %10];
        Disp_Buffer[6] = SEG_CODE[s/10];
        Disp_Buffer[7] = SEG_CODE[s%10];
        sei();
       
        while(1)
    {
        if(PINB ^Key_State)
                {
                        _delay_ms(10);
                        if(PINB ^ Key_State)
                        {
                                Key_State = PINB;
                                if(!(Key_State&_BV(PB3)))
                                Increase_Hour();
                                else
                                if(!(Key_State&_BV(PB6)))
                                Increase_Minute();
                        }
                }
    }
}

ISR(TIMER0_OVF_vect)
{
   static uint8_t Disp_Idx = 0;
   TCNT0 = 256 - F_CPU/64.0*0.004;
   PORTA = 0x00;
   PORTA = Disp_Buffer[Disp_Idx];
   PORTD= ~_BV(Disp_Idx);
   Disp_Idx = (Disp_Idx+1)&0x07;       
}

ISR(TIMER2_OVF_vect)
{
   if(Disp_Buffer[2] == 0x40)
   {
       Disp_Buffer[2] = Disp_Buffer[5] = 0x00;
   }
   else
   {
           Disp_Buffer[2] = Disp_Buffer[5] = 0x40;
           Increase_Second();
   }

}
       
       


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2398

主题

6955

帖子

67

粉丝