- 4
- 0
- 约3.17千字
- 约 5页
- 2017-08-11 发布于重庆
- 举报
基于avr-Atmega16单片机实现六位时钟程序-并用proteus仿真
基于avr-Atmega16单片机实现六位时钟程序,并用proteus仿真
#includeiom16v.h
#define uchar unsigned char
#define uint unsigned int
uchar SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar ACT[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar sec=0,min=0,ms_sec=0,hr=0,cnt=0,set_sec=0,set_min=0,set_hr=0,key_cnt=0,flag1=0,flag2=0,i=0,j=0,k=0;
void delay_ms(uint k)
{
uint i,j;
for(i=0;ik;i++)
{
for(j=0;j1000;j++)
;
}
}
void port_init(void)
{
DDRA=0XFF;
PORTA=0XFF;
DDRB=0XFF;
PORTB=0X00;
DDRC=0XFF;
PORTC=0XFF;
DDRD=0X00;
PORTD=0XFF;
}
void timer_init(void)
{
TCNT0=0X83;
TCCR0=0X03;
TIMSK=0X01;
}
void W_EEP(uchar add,uchar dat)
{
while(EECR(1EEWE));
EEAR=add;
EEDR=dat;
EECR|=(1EEMWE);
EECR|=(1EEWE);
}
uchar R_EEP(uchar add)
{
while(EECR(1EEWE));
EEAR=add;
EECR|=(1EERE);
return EEDR;
}
//10非常重要
#pragma interrupt_handler timer_isr:10
void timer_isr(void)
{
TCNT0=0X83;
if(++key_cnt5)key_cnt=0;
if(++cnt5)cnt=0;
if(++ms_sec99){sec++;ms_sec=0;}
if(sec59){min++;sec=0;}
if(min59){hr++;min=0;}
if(hr24)hr=0;
if(key_cnt==0)
{
if((PIND0X80)==0)
{
if(set_sec59)set_sec++;
else set_sec=0;
delay_ms(30);
}
if((PIND0X40)==0)
{
if(set_min59)set_min++;
else set_min=0;
delay_ms(30);
}
if((PIND0X20)==0)
{
if(set_hr24)set_hr++;
else set_hr=0;
delay_ms(30);
}
}
if(flag1==0)
{
i=sec,j=min,k=hr;
}
else
{
i=set_sec,j=set_min,k=set_hr;
}
switch(cnt)
{
case 0:/*if(flag1=1)
{
PORTB=ACT[0];PORTA=SEG[set_sec%10];
}
else {*/
PORTB=ACT[0];PORTA=SEG[i%10];
// }
break;
case 1:/*if(flag1=1)
{
PORTB=ACT[1];PORTA=SEG[set_sec/10];
}
else {*/
PORTB=ACT[1];PORTA=SEG[i/10];
//}
break;
case 2:/*if(flag1=1)
{
PORTB=ACT[2];PORTA=SEG[set_min%10];
}
else {*/
PORTB=ACT
原创力文档

文档评论(0)