BASIC4MCU | 질문게시판 | atmega128 시계만들기 질문입니다..
페이지 정보
작성자 제발 작성일2020-10-29 01:47 조회4,239회 댓글1건본문
#include <iom128v.h>
#include <avrdef.h>
#define LCD_WDATA PORTB
#define LCD_WINST PORTB
#define LCD_CTRL PORTC
#define LCD_EN 0
#define LCD_RW 1
#define LCD_RS 2
void delay_ms(unsigned int m);
void delay_us(unsigned int u);
void write_data(char d);
void write_instruction(char i);
void init_lcd(void);
void LCD_STR(char* str);
char Temp;
char cnt;
char sec, min, hour;
void PortInit(void)
{
DDRC=0xff;
DDRB=0xe0; // PORTC의 하위 4비트를 출력으로
}
void LCD_Comm(char ch)
{
LCD_CTRL &=~(1<<LCD_RS);
LCD_CTRL &=~(1<<LCD_RW);
LCD_CTRL |= (1 << LCD_EN);
delay_us(50);
LCD_WINST = ch;
delay_us(50);
LCD_CTRL &= ~(1 << LCD_EN);
}
void LCD_pos(unsigned char row, unsigned char col) // LCD 포지션 설정
{
LCD_Comm(0x80|(row+col*0x40)); // row = 문자행, col = 문자열
}
void LCD_CHAR(char c) {
write_data(c);
delay_ms(1);
}
void Init_Timer0(void)
{
TCCR0|= (1 << WGM01); OCR0 = 100;
TIMSK = (1<<OCIE0); }
void timer0_out_comp(void) {
cnt++ ;
if(cnt == 20000) // 50us * 20000 = 1s ec
{
cnt = 0;
sec++;
if(sec >= 60) {
min++; sec = 0;
}
if(min >= 60) {
hour++; min = 0;
}
if(hour>=24) hour = 0;
}
}
void LCD_delay(char ms) {
delay_ms(ms);
}
void LCD_Clear(void) {
LCD_Comm(0x01); LCD_delay(2);
}
void LCD_Init(void)
{
LCD_Comm(0x38);
LCD_delay(2);
LCD_Comm(0x38);
LCD_delay(2);
LCD_Comm(0x38);
LCD_delay(2);
LCD_Comm(0x0e);
LCD_delay(2);
LCD_Comm(0x06);
LCD_delay(2);
LCD_Clear();
}
void main(void)
{
char str[] = "Current ime"; char str1[]= "AM 2:00:00"; char AM[] = "AM";
char PM[] = "PM";
Temp = 0;
cnt = 0;
sec = min=0;
hour = 12;
Init_Timer0(); // Timer 초기화
SREG|= 0x80;
TCCR0 |= 1 << CS01;
// LCD 초기화
PortInit();
LCD_Init();
LCD_pos(0,0);
LCD_STR(str); // 문자열 str을 LCD 출력
LCD_pos(1,0); // LCD 포지션 0행 0열 지정
LCD_STR(str1);// 문자열 str을 LCD 출력
while(1){
if(hour > 12) {
LCD_pos(1,0);
LCD_STR(PM);
LCD_CHAR(((hour- 12)/10)+'0');
LCD_CHAR(((hour- 12)%10)+'0');
}
else {
LCD_pos(1,0); LCD_STR(AM); LCD_CHAR((hour/10)+'0');
LCD_CHAR((hour%10)+'0'); }
LCD_pos(1,6);
LCD_CHAR((min/10)+'0'); LCD_CHAR((min%10)+'0'); LCD_pos(1,9);
LCD_CHAR((sec/10)+'0 ');
LCD_CHAR((sec%10)+'0');
}
}
void init_lcd(void)
{
delay_ms(10);
write_instruction(0x30);
delay_ms(25);
write_instruction(0x30);
delay_ms(5);
write_instruction(0x30);
delay_ms(5);
write_instruction(0x3c);
delay_ms(5);
write_instruction(0x08);
delay_ms(5);
write_instruction(0x01);
delay_ms(5);
write_instruction(0x06);
delay_ms(5);
write_instruction(0x0c);
delay_ms(15);
}
void write_instruction(char i)
{
PORTB=0x80;
delay_us(10);
PORTC=i;
delay_us(10);
PORTB=0x00;
delay_us(100);
}
void write_data(char d)
{
PORTB=0xa0;
delay_us(10);
PORTC=d;
delay_us(10);
PORTB=0x20;
delay_us(100);
}
void delay_ms(unsigned int m)
{
unsigned int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<2117;j++);
}
}
void delay_us(unsigned int u)
{
unsigned int i,j;
for(i=0;i<u;i++)
{
for(j=0;j<2;j++);
}
}
void LCD_STR(char*str) // 문자열출력
{
while(*str!= 0)
{
write_data(*str);
str++;
}
}
이렇게 했는데 1 warning이 뜨네요.. 핀번호가 잘못된건지 아니면 interrupt [TIM0_COMP] void timer0_out_comp(void) 이부분에서 interrupt [TIM0_COMP] 이걸지웠는데 지우면 안되는건가요?
댓글 1
조회수 4,239master님의 댓글
master 작성일
https://cafe.naver.com/circuitsmanual/998
ICC 사용중이군요
#pragma interrupt_handler timer0_comp_isr: iv_TIMER0_COMP
void timer0_comp_isr(void){ }
이렇게 변경하세요