×
单片机 > 单片机程序设计 > 详情

avr单片机数码管显示时钟

发布时间:2020-06-19 发布时间:
|

//数码管数据P0口,数码管控制P2口 

#include  
#include  
#include PACe.h> 
#include  
#include 

#define code PROGMEM 
#define uchar unsigned char 
#define uint  unsigned int 

code const uchar LED_7[16] = {0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};//common of + 

code const uchar position[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; 


uchar time[4];             //时间计数 
volatile uchar disp_buff[8];        //显示缓冲区 
volatile uchar time_count = 0; 

volatile uchar point_on = 0; 
volatile uchar posit = 0; 
volatile uchar time_10ms_ok = 0; 

void time_to_dispbuff(void); 
void time1_init(void); 
void time0_init(void); 
void display(void); 

int main(void) 

    PORTA = 0xff; 
    DDRA = 0xff; 
    PORTC = 0xff; 
    DDRC = 0xff; 

    time[0] = 00;//1/10sec 
    time[1] = 30;//sec 
    time[2] = 59;//minute 
    time[3] = 23;//hour 
    time_to_dispbuff(); 

    time1_init(); 
    sei(); 

    while(1) 
    { 
        if(time_10ms_ok) 
        { 
            time_10ms_ok = 0; 
            if(++time[0]>=100) 
            { 
                time[0] = 0; 
                point_on = ~point_on; 
                if(++time[1]>=60) 
                { 
                    time[1] = 0; 
                    if(++time[2]>=60) 
                    { 
                        time[2] = 0; 
                        if(++time[3]>=24) 
                        { 
                            time[3] = 0; 
                        } 
                    } 
                } 
            } 
            time_to_dispbuff(); 
        } 
    } 
}  

void time0_init(void) 

    TCCR0 = 0x05; 
    TCNT0 = 0xea; 
    TIFR |= 0x02; 
    TIMSK |= 0x02; 



void time1_init(void) 

    TCCR1A = 0x00; 
    TCCR1B = 0x01; 
    TCNT1 = 0xa99a; 
    //TCNT1H = 0xa9; 
    //TCNT1L = 0x9a; 
    TIFR |= 0x80; 
    TIMSK |= 0x80; 


SIGNAL(SIG_OVERFLOW1) 

    TCNT1 = 0xa99a; 
    display(); 
    if(++time_count >=5) 
    { 
        time_10ms_ok = 1; 
        time_count = 0; 
    } 


void display(void) 

    PORTC = 0xff; 
    PORTA = pgm_read_byte(&led_7[disp_buff[posit]]); 
    if(point_on && ((posit==2)||(posit==4)||(posit==6)))PORTA &= 0x7f; 
    PORTC = pgm_read_byte(&position[posit]); 
    if(++posit>=8)posit = 0; 


void time_to_dispbuff(void) 

    uchar i,j=0; 
    for(i=0;i<=3;i++) 
    { 
        disp_buff[j++] = time[i]%10; 
        disp_buff[j++] = time[i]/10; 
    } 


关键字:avr单片机  数码管  显示时钟 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计