BASIC4MCU | 질문게시판 | atmega128 질문입니다
페이지 정보
작성자 dwe1312 작성일2020-11-04 17:15 조회12,241회 댓글1건본문
제대로 동작이 안되는데 혹시 조언 해주실수 있으신가요?
#include <iccioavr.h>
#include <avrdef.h>
#define F_CPU 16000000
#include <stdio.h>
void delay_ms(unsigned int m);
void delay_us(unsigned int u);
void init_lcd(void);
void LCD_pos(unsigned char col, unsigned char row);
void LCD_STR(char*str);
void write_instruction(char i);
void write_data(char d);
void io_init(void)
{
MCUCR|=(1<<SRE) | (1<<SRW10);
XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
XMCRB |= 0x00;
}
unsigned int count =0, sec=0, min=0,hour=0;
unsigned int mode =0, ampm =0;
unsigned int flag=0;
unsigned int saveSec=0, saveMin=0,saveHour=0;
#pragma interrupt_handler timer0_comp_isr: iv_TIMER0_COMP
void timer0_comp_isr(void)
{
TCNT0 =6;
count++;
if (count >1000)
{
sec++;
count=0;
if(sec>=60)
{
min++; sec=0;
}
if (min>=60)
{
hour++; min=0;
}
if(hour>12)
{
hour=0;
if(ampm == 0) ampm =1;
else if(ampm ==1) ampm=0;
count =0;
}
}
}
void main(void)
{
io_init();
init_lcd();
DDRC = 0xFF;
DDRB = 0xe0;
DDRE = 0x8f; // 스위치
PORTE = 0xff;
// 타이머 인터럽트 레지스터
TIMSK = 0x01; // R/W 선택 TIMER 0 사용
TCCR0 =0x04; // 분주비 64
TCNT0 =6; // 6에서 시작 255가되어 256이 되면 OVF가 되어 인터럽트 구문을 실행한다.
mode =0;
SEI();
char temp[16];
int sel =0;
while (1)
{
if (((PINE & 0x10)== 0x00) && flag ==0 ){
sel=0;
mode++;
if(mode >=2)mode =0;
flag=1;
}
else if (((PINE & 0x20)== 0x00)&& flag==0 && mode==1 ){
if (sel==0){hour++;
if (hour >=60) hour =0;
}
else if (sel ==1){ min++;
if(min>=60) min=0;
}
else if(sel ==2){ sec++;
if(sec>=60) sec=0;
}
else if(sel==3){
if (ampm ==0) ampm =1;
else if (ampm ==1) ampm=0;
}
flag=1;
}
// 숫자 선택 셀 증가
else if (((PINE & 0x40)== 0x00)&& flag==0 && mode==1 ){
sel++;
if (sel >=4) sel=0;
flag=1;
}
else if (PINE == 0xff){ flag=0;
}
switch(mode){
case 0:
sprintf(temp," %2d :%2d :%2d %2s",hour,min,sec,(ampm==0)?"AM":"PM");
write_instruction(0x80);
char str[] = "Normal Mode";
LCD_STR(str);
write_instruction(0xc0);
LCD_STR(temp);
break;
case 1:
sprintf(temp," %2d :%2d :%2d %2s",hour,min,sec,(ampm==0)?"AM":"PM");
if (sec%2 ==0){
if(sel==0)temp[1] = temp[2] =' ';
else if(sel==1)temp[5] = temp[6] =' ';
else if(sel==2)temp[9] = temp[10] =' ';
else if (sel==3)temp[12] = temp[13] =' ';
else sel =0;
}
write_instruction(0x80);
char str1[] = "Modify Mode";
LCD_STR(str1);
write_instruction(0xc0);
LCD_STR(temp);
break;
}
}
}
void delay_ms(unsigned int m) //딜레이_ms 함수
{
unsigned int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<2117;j++);
}
}
void delay_us(unsigned int u) //딜레이_us 함수
{
unsigned int i,j;
for(i=0;i<u;i++)
{
for(j=0;j<2;j++);
}
}
void init_lcd(void) //초기화 함수
{
delay_ms(10);
write_instruction(0x30); //데이터 길이=8비트, lcd 1열로 사용
delay_ms(25);
write_instruction(0x30); //데이터 길이=8비트, lcd 1열로 사용
delay_ms(5);
write_instruction(0x30); //데이터 길이=8비트, lcd 1열로 사용
delay_ms(5);
write_instruction(0x3c); //데이터 길이=8비트, 5x7도트, lcd 2열로 사용
delay_ms(5);
write_instruction(0x08); //화면 off 커서 off, 점멸하지 않음
delay_ms(5);
write_instruction(0x01); //화면 지움 명령
delay_ms(5);
write_instruction(0x06); //주소를 +1시키고, 커서 또는 블링크 위치가 우측으로 이동 명령
delay_ms(5);
write_instruction(0x0c); //화면 on 명령
delay_ms(15);
}
void LCD_STR(char*str) // 문자열출력 함수
{
while(*str!= 0)
{
write_data(*str);
str++;
}
}
void write_instruction(char i) //instruction 함수
{
PORTB=0x80; //enable =H, 컨트롤러->CLCD, instruction 설정
delay_us(10);
PORTC=i; //원하는 명령
delay_us(10);
PORTB=0x00; //enable= L, 컨트롤러->CLCD, instruction 설정
delay_us(100);
}
void write_data(char d) //data 함수
{
PORTB=0xa0; //enable=H, 컨트롤러->CLCD, Data 설정
delay_us(10);
PORTC=d; //원하는 데이터
delay_us(10);
PORTB=0x20; //enable= L, 컨트롤러->CLCD, Data 설정
delay_us(100);
}
댓글 1
조회수 12,241master님의 댓글
master 작성일뭐가 되고 뭐가 안되는지 상세히 기술하세요