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

AVR 单片机数码管显示时钟程序

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

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

#include
#include
#include
#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;
    }
}



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

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单