AVR과 CLCD를 이용한 디지털시계
[code]
#define SYSTEM_CLK (16000000L)
#define ComputeBaud(baud) (unsigned int)(((SYSTEM_CLK / 16) / (baud)) – 1)
#define UBRRxH(baud) (unsigned char)((ComputeBaud(baud)>>8)&0xFF)
#define UBRRxL(baud) (unsigned char)((ComputeBaud(baud))&0xFF)
#define UART0_BAUD 9600 // PC <-> AVR
#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include “clcd.h”
unsigned int time_count = 0;
unsigned char string_time[16];
unsigned char sec, min, hour = 0;
void uart0_init(void)
{
unsigned char dummy;
UBRR0H = UBRRxH(UART0_BAUD);
UBRR0L = UBRRxL(UART0_BAUD);
UCSR0A = 0x00; // 1x
UCSR0B = 0x98; // RxInt=EN
UCSR0C = 0x06; // data 8bit
dummy = UDR0; // UDR0 clear
}
void init_Timer(void)
{
TCNT0 = 0x06; // Counter0 Start: 6
TCCR0 = 0x04; // 64/16 = 4us
TIMSK = 0x01; // TCNT0 EN
}
void init(void)
{
// CLCD Display Setting
init_LCD(); // LCD Initialize
// usart initialize
uart0_init();
// Timer Setting
init_Timer();
}
// Timer0 Interrupt
SIGNAL(SIG_OVERFLOW0)
{
TCNT0 = 6; // 256-6 = 250 count = 1ms
if(++time_count == 1000) // at 1s
{
sec++;
if(sec==60)
{
sec = 0;
min++;
if(min==60)
{
min = 0;
hour++;
if(hour==24)
{
hour = 0;
}
}
}
time_count = 0;
}
}
// UART0 Rx ISR – AVR <- PC
SIGNAL(SIG_UART0_RECV)
{
unsigned char RxChar;
RxChar = UDR0;
switch(RxChar)
{
case ‘h’: // Keyboard ‘h’ hour+1
{
hour++;
if(hour==24)
hour = 0;
break;
}
case ‘m’: // Keyboard ‘m’ min+1
{
min++;break;
if(min==60)
min = 0;
break;
}
}
}
//—————————— Main Function ——————————–
int main(void)
{
cli(); //Interrupt Disable
init(); //Initialize
sei(); //Interrupt Enable
char string1[16] = “Digital Clock”;
char string2[16] = “Set by UART0 h,m”;
string_out(0x80, string1); // 출력문자열
string_out(0xC0, string2);
while(1)
{
sprintf(string2,” TIME: %u%u:%u%u:%u%u “,hour/10,hour%10,min/10,min%10,sec/10,sec%10);
string_out(0xC0,string2);
}
}
[/code]
5113474733.h

CLCD의 연결은 PORT A를 이용해서 4bit mode로 동작합니다.
CLCD의 동작이 제대로 되지 않을 경우 clcd.h의 시간 지연값들을
더 늘려보시기 바랍니다.
(자세한 내용은 “AVR을 이용한 CLCD 출력” 참조)
Timer는 64분주비를 이용하여 4us마다 증가합니다.
따라서 1ms 초를 세기 위해 TCNT0는 Timer Interrupt가 걸릴때
6부터 시작하게 하였습니다. (256-6) * 4us = 1ms
Interrupt 마다 time_count값을 증가키셔 1000이 되면 초 값을 증가시킵니다.
마찬가지 과정을 거쳐 시, 분, 초를 증가시킵니다.