BASIC4MCU | 질문게시판 | 마스터님이 올려주신 코드에 LCD코드를 삽입해봤습니다.
페이지 정보
작성자 Busan 작성일2019-12-28 00:39 조회3,612회 댓글0건본문
우선 마스터님이 올려주신 코드에 LCD 함수를 삽입하니 사진과 같은 에러가 뜹니다. flash char 부분을 삭제하여도 상황이 바뀌지 않습니다. 계속 질문해서 죄송합니다... 취합했던 코드는 현재 디버깅 중입니다.
#include <mega128.h>
#include <delay.h>
#include <stdio.h>#define LINE2 0xC0//?2nd?Line?Move
#define HOME 0x02//?Cursor?Home
#define RSHIFT 0x1C//?Display?Right?Shift
#define LSHIFT 0x18//?Display?Left?Shift
#define DISPON 0x0c//?Display?On
#define DISPOFF 0x08//?Display?Offvoid LCD_init(void);
void LCD_String(char flash *str);
void Busy(void);
void Command(unsigned char);
void Data(unsigned char);
char str[30];
int a, Volt10, rot = 375;// LCD 초기화 함수
void LCD_init(void)
{
DDRC = 0xFF; // 포트 C 출력 설정
PORTC &= 0xFB; //E = 0;
// 충분한 지연시간을 통한 안정화 과정
delay_ms(15);
Command(0x20); // D5=1
delay_ms(5);
Command(0x20); // D5=1
delay_us(100);
Command(0x20); // D5=1// 초기화 과정
Command(0x28); // function set
Command(0x06); // entry mode set
Command(0x01); // all clear
Command(0x0c); // display on
}
// 인스트럭션 쓰기 함수
void Command(unsigned char byte)
{
Busy();// 인스트럭션 상위 바이트
PORTC = (byte & 0xF0); // 데이터
PORTC &= 0xFE; // RS = 0;
PORTC &= 0xFD; // RW = 0;
delay_us(1);
PORTC |= 0x04; // E = 1;
delay_us(1);
PORTC &= 0xFB; // E = 0;// 인스트럭션 하위 바이트
PORTC = ((byte<<4) & 0xF0); // 데이터
PORTC &= 0xFE; // RS = 0;
PORTC &= 0xFD; // RW = 0;
delay_us(1);
PORTC |= 0x04; // E = 1;
delay_us(1);
PORTC &= 0xFB; // E = 0;
}// 문자열 출력 함수
void LCD_String(char flash *str)
{
char flash *pStr=0;pStr = str;
while(*pStr) Data(*pStr++);
}// char flash : pointer declaration for program memory
// char eeprom : pointer declaration for EEPROM//데이터 쓰기 함수
void Data(unsigned char byte)
{
Busy();
// 데이터 상위 바이트
PORTC = (byte & 0xF0); // 데이터
PORTC |= 0x01; //RS = 1;
PORTC &= 0xFD; //W = 0;
delay_us(1);
PORTC |= 0x04; //E = 1;
delay_us(1);
PORTC &= 0xFB; //E = 0;// 데이터 하위 바이트
PORTC = ((byte<<4) & 0xF0); // 데이터
PORTC |= 0x01; //RS = 1;
PORTC &= 0xFD; //RW = 0;
delay_us(1);
PORTC |= 0x04; //E = 1;
delay_us(1);
PORTC &= 0xFB; //E = 0;
}// Busy Flag Check -> 일반적인 BF를 체크하는 것이 아니라
// 일정한 시간 지연을 이용한다.
void Busy(void)
{
delay_ms(2);
}
interrupt [TIM3_COMPA] void timer3_compa_isr (void)
{
static char c=0;
a=ADCW;
Volt10 =(int)((float)a*50/1023.0+0.5);
sprintf(str,"Value: %d.%d[V]",Volt10/10,Volt10%10);
Command(LINE2);
LCD_String(str);
Command(HOME);
if(Volt10<=40)
{
TCCR1A = 0x00;
OCR1A = 2777;
PORTA = 0;
LCD_String(" ");
}
else
{
TCCR1A = 0x40;
c^=1;
if(c)
{
PORTA =0x00;
OCR1A = 2082;
LCD_String("fire!!!");
}
else
{
PORTA = 0xff;
OCR1A = 2777;
LCD_String(" ");
}
}
if(Volt10<=15){rot+=1; if(rot>475)rot=475; OCR1A=rot;}
else if(Volt10<=30){rot+=2; if(rot>475)rot=475; OCR1A=rot;}
else if(Volt10<=40){rot+=4; if(rot>475)rot=475; OCR1A=rot;}
}void main(void)
{
DDRB=0xff;
LCD_init();
TCCR1A =0x00;
TCCR1B =0x0a;
ICR1H=0x09;
ICR1L=0xc3;
OCR1A = 375;
TCCR3B=0x0c;
OCR3AH=31249>>8; //0xe7
OCR3AL=31249&0xff; //0x96
ETIMSK=0x10;//?500ms
ADCSRA=0xe7;
SREG=0x80;while(1);
}
댓글 0
조회수 3,612등록된 댓글이 없습니다.