BASIC4MCU | 질문게시판 | ATmega128 FND, LCD 동시구동 코딩 질문입니다
페이지 정보
작성자 따라잡따 작성일2020-10-26 23:41 조회5,115회 댓글1건본문
학생들의 질문을 들어주시는 노고에 감사합니다.
저희가 FND 카운팅 숫자와 LCD에 표시되는 온도를 이용해 온도제어를 하려는 프로젝트를 진행중입니다.
아래의 코딩을 보시면 LCD에는 온도센서에서 감지하는 온도를 보여주고 FND에는저희가 원하는 온도를 나타내고 싶어서 코딩을 작성해봤습니다.
스위치가 2개가 있고 인터럽트를 사용해서 하나는 FND 숫자업카운팅, 다른하나는 FND 숫자다운카운팅을 하고싶습니다.
또한 스위치를 눌러 카운팅을 할때도 LCD에 나오는 현재 온도를 계속 보고싶습니다.
혹시 저희가 작성한 코드가 문제가 있을까요?? 답변주시면 감사하겠습니다.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#define F_CPU 16000000UL
#include <util/delay.h>
//
#define LCD_DATA PORTD
#define LCD_INST PORTD
#define LCD_CTRL PORTC
#define LCD_RS 0x01 //PC0
#define LCD_RW 0x02 //PC1
#define LCD_EN 0x04 //PC2
//
unsigned int adc_value, temp=0;
unsigned char fnd[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x27, 0x7F, 0x6F};
unsigned char fnd_position[4]={0x01,0x02,0x04,0x08};
volatile int count=0;
void LCD_data(char ch){ LCD_DATA=ch; LCD_CTRL=5; _delay_us(1); LCD_CTRL=1; _delay_us(50); }
void LCD_comm(char ch){ LCD_DATA=ch; LCD_CTRL=4; _delay_us(1); LCD_CTRL=0; _delay_ms(5); }
void LCD_CHAR(char c){ LCD_data(c); }
void LCD_STR(char *str){ while(*str)LCD_CHAR(*str++); }
void LCD_pos(char col, char row){ LCD_comm(0x80|(col+row*0x40)); }
void LCD_clear(void){ LCD_comm(1); }
void LCD_init(void){
_delay_ms(100);
LCD_comm(0x38); LCD_comm(0x38); LCD_comm(0x38);
LCD_comm(0x0E); LCD_comm(0x06); LCD_clear();
}
ISR(INT5_vect)
{
count++;
_delay_ms(10);
EIFR=0x01;
}
ISR(INT6_vect)
{
count--;
_delay_ms(10);
EIFR=0x01;
}
int main(void)
{
DDRE&=~0x60; //스위치를 모두 입력으로 설정
PORTE|=0x60; //내부 풀업저항 활성화
DDRA|=0xFF;
PORTA&=0xFF; //세그먼트LED 모두 출력으로 설정
DDRB|=0x0F; //4개의 FND 출력으로 설정
PORTB&=~0x0F; //FND 4개 모두 0으로 초기화
char str[20]="PID Tempsensor";
DDRD=0xFF; DDRC=0x07;
LCD_init();
LCD_pos(0,1); LCD_STR(str);
ADMUX=0x40; ADCSRA=0xE7;
EIMSK = 0x60;// int 5 6 1인에이블
EICRB = 0x40; //int 6 상승에지 설정
EICRB = 0x20; //int 5 상승에지 설정
sei();
while(1){
if(PINE & 0x60)
int i=0;
for(i=0;i<4;i++){
PORTB=fnd_position[i];
switch(i){
case 0 : PORTA=fnd[count%10]; break;
case 1 : PORTA=fnd[(count/10)%10]; break;
case 2 : PORTA=fnd[(count/100)%10]; break;
case 3 : PORTA=fnd[(count/1000)%10]; break;
if(count<0) count=0;
}
}
else
LCD_clear();
adc_value=ADCW;
temp=(int)( (float)adc_value * 5000.0 / 1023.0 ); // LM358 없는 경우 5000.0으로 수정
LCD_pos(0,0); sprintf(str,"Hongik EE"); LCD_STR(str);
LCD_pos(0,1); sprintf(str,"Temp=%3d.%d",temp/10,temp%10); LCD_STR(str);
_delay_ms(250);
}
}
댓글 1
조회수 5,115master님의 댓글
master 작성일
동작시켜보고 문제가 발생하면
해당 증상을 상세히 기술하세요