/**********************************************************************
*
* main.c
*
*
*
***********************************************************************/
#include <iom2560.h>
#include <stdio.h>
#include <intrinsics.h>
unsigned char sec1;
unsigned char sec2;
unsigned char sec3;
unsigned char min1;
unsigned char min2;
unsigned char hour1;
unsigned char hour2;
void init_lcd(void)
{
DDRL = 0xff;
DDRC = 0xff;
PORTC = 0x04;
PORTL = 0x38;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x38;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x38;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x0c;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x06;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x02;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x01;
__delay_cycles (8000);
PORTC = 0x03;
}
void write(unsigned int addr, unsigned int str)
{
PORTC = 0x04;
PORTL = addr;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x06;
PORTL = str;
__delay_cycles (8000);
PORTC = 0x03;
}
void init_timer1(void)
{
OCR1AH = 0x2C;
OCR1AL = 0xFF;
TCCR1B = 0x0B;
TIMSK1 = 0x02;
}
#pragma vector = TIMER1_COMPA_vect
__interrupt void timer1_compa()
{
sec1++;
}
void init_clock()
{
sec1 = 0x30;
sec2 = 0x30;
sec3 = 0x30;
min1 = 0x30;
min2 = 0x30;
hour1 = 0x30;
hour2 = 0x30;
}
void main(void)
{
init_clock();
SREG|=0x80;
init_timer1();
init_lcd();
while(1)
{
write(0x89, sec1); SET RAM CONTROL
write(0x88, 0x2e); SET_RAM_ADDRESS_CONTROL
write(0x87, sec2);
write(0x86, sec3); SET_PARTIAL_DISPLAY CONTROL
write(0x85, 0x3a);
write(0x84, min1);
write(0x83, min2);
write(0x82, 0x3a);
write(0x81, hour1);
write(0x80, hour2);
if (sec1>0x39){sec1 = 0x30; sec2++;}
if (sec2>0x39){sec2 = 0x30; sec3++;}
if (sec3>0x35){sec3 = 0x30; min1++;}
if (min1>0x39){min1 = 0x30; min2++;}
if (min2>0x35){min2 = 0x30; hour1++;}
if (hour2 == 0x30 & hour1>0x39){hour1 = 0x30; hour2 = 0x31;}
if (hour2 == 0x31 & hour1>0x39){hour1 = 0x30; hour2 = 0x32;}
if (hour2 == 0x32 & hour1>0x33){hour1 = 0x30; hour2 = 0x30;}
}
}
#include <iom2560.h>
#include <stdio.h>
#include <intrinsics.h>
위부분은 아실거라 생각합니다.명령어에 관한 함수를 호출한거고요.
unsigned char sec1;
unsigned char sec2;
unsigned char sec3;
unsigned char min1;
unsigned char min2;
unsigned char hour1;
unsigned char hour2; 이부분은 메모리 크기 지정 한거구요 할당될수 있는 크기를 지정한겁니다. char정도면 문자 단위까지 지정이가능합니다.숫자만 쓰실거면 더 적은 bit단위의 표현방법도 있고요
void init_lcd(void)
{
DDRL = 0xff;
DDRC = 0xff;
PORTC = 0x04;
PORTL = 0x38;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x38;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x38;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x0c;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x06;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x02;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x04;
PORTL = 0x01;
__delay_cycles (8000);
PORTC = 0x03;
lcd사용할 어드레스 번지를 지정해 준겁니다.
void write(unsigned int addr, unsigned int str)
{
PORTC = 0x04;
PORTL = addr;
__delay_cycles (8000);
PORTC = 0x03;
PORTC = 0x06;
PORTL = str;
__delay_cycles (8000);
PORTC = 0x03;
}
쓰기관련 해서 각 포트별로 메모리에 어느 번지 부터 시작할건지 시작위치를 지정해 준겁니다.
void init_timer1(void)
{
OCR1AH = 0x2C;
OCR1AL = 0xFF;
TCCR1B = 0x0B;
TIMSK1 = 0x02;
타이머 관련해서 어느 번지를 쓰실건지 그분분 정의해 놓은거구요.
#pragma vector = TIMER1_COMPA_vect
__interrupt void timer1_compa()
{
sec1++;
}
void init_clock()
{
sec1 = 0x30;
sec2 = 0x30;
sec3 = 0x30;
min1 = 0x30;
min2 = 0x30;
hour1 = 0x30;
hour2 = 0x30;
}
이분분도
sec1++ 이분분은 1씩 증가하라 이런식으로 타이머 동작과 클럭 번지 지정을 해 준겁니다.
void main(void)
{
init_clock();
SREG|=0x80;
init_timer1();
init_lcd();
while(1)
{
write(0x89, sec1); SET RAM CONTROL
write(0x88, 0x2e); SET_RAM_ADDRESS_CONTROL
write(0x87, sec2);
write(0x86, sec3); SET_PARTIAL_DISPLAY CONTROL
write(0x85, 0x3a);
write(0x84, min1);
write(0x83, min2);
write(0x82, 0x3a);
write(0x81, hour1);
write(0x80, hour2);
if (sec1>0x39){sec1 = 0x30; sec2++;}
if (sec2>0x39){sec2 = 0x30; sec3++;}
if (sec3>0x35){sec3 = 0x30; min1++;}
if (min1>0x39){min1 = 0x30; min2++;}
if (min2>0x35){min2 = 0x30; hour1++;}
if (hour2 == 0x30 & hour1>0x39){hour1 = 0x30; hour2 = 0x31;}
if (hour2 == 0x31 & hour1>0x39){hour1 = 0x30; hour2 = 0x32;}
if (hour2 == 0x32 & hour1>0x33){hour1 = 0x30; hour2 = 0x30;}
}
}
이부분은 동작에 관련된 부분인데 우선 간단하게 이야기해서
if (sec1>0x39){sec1 = 0x30; sec2++;}
만약에 sec1 0x39번지가 0x30이면 sec2는 1증가하라 이런식으로 ... 동작에 관련된 내용입니다.
write(0x89, sec1); 이부분은 쓰기 0x89번지가 sec1 을 저장하라 이런 문구입니다.
정확하게는 1부터 9증가하다 0이되면 sec2를 1증가하고 다시 1씩 증가한다 이런식으로 동작이 되겠금 설계하신거 같습니다.
도움이 많이 못되서 죄송합니다 c 배운지 오래되서 기본 적인 동작 이어떻게 되는지 만 감 잡으시라고 올렸습니다. .