void rtc_init ( void )
{
DDRD = 0xff;
PORTD = 0x00;
DDRG = _BV(2)| _BV(1) | _BV(0);
DDRA = 0xff;
rtc_write(0x0A, 0x20);
rtc_write(0x0B, 0x00);
rtc_write(0x04, 0x11);
rtc_write(0x02, 0x59);
rtc_write(0x00, 0x50);
}
int main( void )
{
int temp, fnd_rear, fnd_front;
rtc_init();
DDRA = 0xFF;
DDRC = 0xFF;
DDRB = 0x0f;
while(1)
{
PORTB = 0x04; //도트 포인트 점등 깜빡깜빡
_delay_ms(1000);
PORTB = 0x00;
_delay_ms(1000);
control_dip(1);
temp = rtc_read(0x00); //레지스터에서 초를 읽어옴
fnd_rear = 0x0f & temp;
fnd_front = 0x0f & (temp >> 4);
PORTC = 0x20; //초의 뒷자리
PORTA = num[fnd_rear];
control_dip(2); control_dip(3); control_dip(1);
_delay_us(500);
PORTC = 0x10; //초의 앞자리
PORTA = num[fnd_front];
control_dip(2); control_dip(3); control_dip(1);
_delay_us(500);
temp = rtc_read(0x02); //레지스터에서 분을 읽어옴
fnd_rear = 0x0f & temp;
fnd_front = 0x0f & (temp >> 4);
PORTC = 0x08;
PORTA = num[fnd_rear];
control_dip(2); control_dip(3); control_dip(1);
_delay_us(500);
PORTC = 0x04;
PORTA = num[fnd_front];
control_dip(2); control_dip(3); control_dip(1);
_delay_us(500);
temp = rtc_read(0x04); //시를 읽어옴
fnd_rear = 0x0f & temp;
fnd_front = 0x0f & (temp >> 4);
PORTC = 0x02;
PORTA = num[fnd_rear];
control_dip(2); control_dip(3); control_dip(1);
_delay_us(500);
PORTC = 0x01;
PORTA = num[fnd_front];
control_dip(2); control_dip(3); control_dip(1);
_delay_us(500);
if(rtc_read(0x04) < 0x12) //am, pm의 a,p 표시
{
PORTC = 0x40;
PORTA = 0xef;
control_dip(2); control_dip(3); control_dip(1);
_delay_us(500);
}
else
{
PORTC = 0x80;
PORTA = 0xcf;
control_dip(2); control_dip(3); control_dip(1);
_delay_us(500);
}
}
return 0;
}
문제가 발생하는게 도트는 PORTB에서 점등시키잖아요 그런데 딜레이를 줘서 켰다 끌시
도트는 정확히 켜졌다가 꺼지는데 다른 숫자들이 보이질 않는 문제가 생깁니다.
그리고 12시제로 표현하면 11:59:59 다음엔 00:00:00 이렇게 나와야 하지 않나요
왜 92:00:00 이렇게 나오는 지.
마지막으로 AM, PM을 뜻하는 A, P를 if문 말고 다른 방법으로도 실행 가능한지 궁금합니다.
답변은 회로도와 전체 소스를 봐야 좀더 정확한 답변을 드릴 수 있습니다.
올려 주신 코드만 보고 문제가 생길만한 부분을 추측해 보면,
1. delay_us(500) 를 delay_us(2) 또는 3 정도로 해보세요.
FND 자리수마다 너무 많은 시간을 할당하면 다른 FND 가 꺼져 있는 것처럼 보일수 있습니다.
2.
temp = rtc_read(0x04); //시를 읽어옴 를 temp=12 로 하드 코딩하여,
00:00:00 이 나오는지 확인해 보세요.
만약 여기서 00:00:00 이 나온다면 그 이하줄에는 문제가 없는 것이 되죠.
하지만 92:00:00 으로 표시된다면 rtc_read(0x04) 에서 이상한 값이 나와서 그런 겁니다.
하드웨어적인 문제가 없는지 확인해 봐야 합니다.
FND 를 00:00:00 ~ 11:59:59 까지 출력이 잘되는지 확인해 보세요.
(그렇다고 12시간 동안 계속 지켜 보시지는 말구요^^)
3.
AM, PM 출력에서는 if 문을 사용하는게 가장 좋은 방법 같은데요..