BASIC4MCU | 질문게시판 | atmega 128 lcd와 온도센서 합친코드
페이지 정보
작성자 코딩응애 작성일2018-12-10 18:34 조회7,248회 댓글1건첨부파일
본문
#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include "UART1.h"FILE OUTPUT\
=FDEV_SETUP_STREAM(UART1_transmit,NULL,_FDEV_SETUP_WRITE);
FILE INPUT\
=FDEV_SETUP_STREAM(NULL,UART1_receive,_FDEV_SETUP_READ);
//
#define FUNCSET 0x28 //Function Set
#define ENTMODE 0x06 //Entry Mode Set
#define ALLCLR 0x01 //Clear Display
#define DISPON 0x0c //Display On
#define LINE2 0xC0 //Set DDRAM Address(0x40)
#define LINE3 0x94 //Set DDRAM Address(0x14)
#define LINE4 0xD4 //Set DDRAM Address(0x54)
//
#define PORT_DATA PORTD
#define DDR_DATA DDRD
//
#define Byte unsigned char
//
volatile Byte flag=0,sec=0,min=0,hour=0;
//
void ADC_init(unsigned char channel)
{
ADMUX|=(1<<REFS0); // AVCC를기준전압으로선택
ADCSRA|=0x07; // 분주비설정
ADCSRA|=(1<<ADEN); // ADC 활성화
ADCSRA|=(1<<ADFR); // 프리러닝모드
ADMUX|=((ADMUX&0xE0)|channel); // 채널선택
ADCSRA|=(1<<ADSC); // 변환시작
}
//
int read_ADC(void)
{
while(!(ADCSRA&(1<<ADIF))); // 변환종료대기
return ADC; // 10비트값을반환
}
//
void LCD_CMD(unsigned char byte){
PORT_DATA=(byte&0xF0)|4; _delay_us(1); PORT_DATA&=0xFB;
PORT_DATA=(byte<<0x4)|4; _delay_us(1); PORT_DATA&=0xFB; _delay_ms(3);
}
//
void LCD_CHAR(unsigned char byte){
PORT_DATA=(byte&0xF0)|5; _delay_us(1); PORT_DATA&=0xFB;
PORT_DATA=(byte<<0x4)|5; _delay_us(1); PORT_DATA&=0xFB; _delay_us(50);
}
//
void LCD_STR(Byte*s){ while(*s)LCD_CHAR(*s++); }
//
void LCD_INIT(void){
DDR_DATA=0xFF; _delay_ms(15); LCD_CMD(0x20); LCD_CMD(0x20); LCD_CMD(0x20);
LCD_CMD(FUNCSET); LCD_CMD(DISPON); LCD_CMD(ALLCLR); LCD_CMD(ENTMODE);
}
//
ISR(TIMER1_COMPA_vect){
if(++sec>59){ sec=0;
if(++min>59){ min=0; if(++hour>23)hour=0; }
}
flag=1;
}int main(void){
int read,temperature;
float input_voltage;
Byte str1[]="Current Time"; Byte str2[]=" 00:00:00";
Byte str3[]="Temperature"; Byte str4[]=" 00C";
LCD_INIT();
LCD_STR(str1);
LCD_CMD(LINE2); LCD_STR(str2);
LCD_CMD(LINE3); LCD_STR(str3);
LCD_CMD(LINE4); LCD_STR(str4);
TCCR1B=0x0D; OCR1A=15624; TIMSK=0x10;
stdout=&OUTPUT;
stdin=&INPUT;
UART1_init(); // UART 통신초기화
ADC_init(3); // AD 변환기초기화.채널3 사용
SREG=0x80;
while(1){
if(flag){ flag=0;
LCD_CMD(LINE2);
LCD_CHAR(' '); LCD_CHAR((hour/10)+'0'); LCD_CHAR((hour%10)+'0'); LCD_CHAR(':');
LCD_CHAR((min /10)+'0'); LCD_CHAR((min%10)+'0'); LCD_CHAR(':');
LCD_CHAR((sec /10)+'0'); LCD_CHAR((sec%10)+'0');
}
//
read=read_ADC(); // ADC 값읽기
// 0에서1023 사이의값을0V에서5V 사이값으로변환한다.
input_voltage=read*5.0/1023.0;
// 10mV에1℃이므로100을곱해서현재온도를얻는다.
temperature=(int)(input_voltage*100.0);
LCD_CMD(LINE4);
LCD_CHAR(' '); LCD_CHAR(temperature); LCD_CHAR(' C');printf("%d\r\n", temperature);
_delay_ms(1000); // 1초에한번읽음
}
return 0;
}
lcd에 시간 재주는 기능이랑 온도까지 뜨게하려고 코드를 합쳤는데
시간만 재는 코드는 작동이 되는데
두개를 합치니까 둘다 아무것도 작동이 안됩니다 ㅜ ㅜ 뭐가 문제일까요 ㅠㅠㅠ
댓글 1
조회수 7,248master님의 댓글
master 작성일
답변을 적어드리면 답변소스를 기반으로 수정을 하셔야하는데
자꾸 원래 소스를 가지고 작업을 합니다.
이래서는 답변을 달아드리지 못합니다.