我想做个时钟,当设置时,设置位数码管闪烁,我是通过设置标志位segcs和闪烁标志位来做的,可是当我在 display时不能获得segcs的值
那位高人可以帮一下吗?
/*
* clock2.c
*
* Created: 2015/5/28 23:16:32
* Author: Administrator
*/
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#define F_CPU 1000000UL
//unsigned char dis_segment[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //共阳0~F
unsigned char dis_segment[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //共阳0~F
unsigned char dis_select[]={0x04,0x08,0x10,0x20,0x40,0x80}; //共阳0~F
unsigned char buff[5]={0,0,0,0,0,0};
unsigned char flag=0,segcs=0,alram=0;
volatile signed char hour,minutes,second,ahour,aminutes,asecond;
void port_init(void)
{
hour=12;
minutes=12;
second=00;
PORTA=0xff;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0xff;
DDRC=0XFF;
PORTD=0xff;
DDRD=0xe3;
SREG=0x00;
}
void display(signed char hour,signed char minutes,signed char second)
{
if (segcs==1)
{
buff[0]=0;
buff[1]=hour%10;
}
else
{
buff[0]=hour/10;
buff[1]=hour%10;
}
buff[2]=minutes/10;
buff[3]=minutes%10;
buff[4]=second/10;
buff[5]=second%10;
for(short i=0;i<6;i++)
{
PORTB=0xff;
PORTB=dis_segment[buff];
PORTC=dis_select;
_delay_ms(2);
}
}
void qudou(signed char hour,signed char minutes,signed char second)
{
unsigned char i;
for (i=0;i<15;i++)
{
display(hour,minutes,second);
}
}
int main(void)
{
port_init();
unsigned char segcs;
//TIMSK |=(1<<TOIE0);
//SREG=0x80;
SREG=0x80;
TIMSK=0x04;
TCNT1H=0x1A;
TCNT1L=0x81;
TCCR1B=0x03;
while(1)
{
if (segcs!=0)
{
if(second>59)second=0;
if(minutes>59)minutes=0;
if(hour>23)hour=0;
if(second<0)second=59;
if(minutes<0)minutes=59;
if(hour<0)hour=23;
}
else
{
if (second>59)
{
second=0;
minutes++;
}
if (minutes>59)
{
minutes=0;
hour++;
}
if (hour>23)
{
hour=0;
minutes=0;
second=0;
}
}
display(hour,minutes,second);
//+键功能
if (PIND==0xFB)
{
qudou(hour,minutes,second);
if(PIND==0xFB)
{
while(!(PIND==0xFB));
if (segcs==1)
{
hour++;
}
else if (segcs==2)
{
minutes++;
}
else if (segcs==3)
{
second++;
}
else
{
}
}
}
//-键功能
if (PIND==0xF7)
{
qudou(hour,minutes,second);
if(PIND==0xF7)
{
while(!(PIND==0xF7));
if (segcs==1)
{
--hour;
}
else if (segcs==2)
{
--minutes;
}
else if (segcs==3)
{
--second;
}
else
{
}
}
}
//选择键
if (PIND==0xEF)
{
qudou(hour,minutes,second);
if(PIND==0xEF)
{
SREG=0x00;
//TIMSK=0x00;
while(!(PIND==0xef));
TIMSK=0x00;
segcs++;
if(segcs>3)alram=1;
if(segcs>6)
{
segcs=0;
SREG=0x80;
TIMSK=0x04;
TCNT1H=0x1A;
TCNT1L=0x81;
TCCR1B=0x03;
}
}
}
//按键结束
}
}
ISR(TIMER1_OVF_vect)
{
TCNT1H=0x1A;
TCNT1L=0x81;
second++;
flag++;
}