AVR单片机对数码管的控制设计

控制/MCU

1813人已加入

描述

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

#include

#include

#include

#include

#include

#define code PROGMEM

#define uchar unsigned char

#define uint unsigned int

code const ucharLED_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};

AVR单片机

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;

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分