BASIC4MCU | 질문게시판 | USART를 이용한 LCD출력
페이지 정보
작성자 이름두글자 작성일2022-11-29 20:47 조회1,098회 댓글2건본문
계산기 코드르 작성해보고 있는데
USART에서 받은 값들을 즉각적으로 LCD에 출력을 시키려고 합니다.
그런데 형문제 때문인지 Error:\lcd_cal.c(39): function argument #1 of type 'unsigned char' is incompatible with required parameter of type 'flash unsigned char *'
위와 같은 오류가 뜹니다. 아마 ch = UDR0값이 주소값이 아니라 이런 문제가 발생하는거 같은데 어떤식으로 해결해야 할지 궁금합니다. 코드 첨부합니다.
#include <mega128.h>
#include <delay.h>
typedef unsigned char u_char;
#define RS PORTD.0 // 0: Command, 1: Data
#define RW PORTD.1 // 0: Write, 1: Read
#define ENABLE PORTD.2 // Enable(펄스)
#define FUNCSET 0x28 // Function Set
#define ENTMODE 0x06 // Entry Mode Set
#define ALLCLR 0x01 // All Clear
#define DISPON 0x0c // Display On
#define LSHIFT 0x18 // Display Left Shift
#define HOME 0x02 // Cursor Home
unsigned char a, b, c = 0;
unsigned char div = 0;
unsigned char cal = 0;
void LCD_init(void); // LCD 초기화
void LCD_String(char flash *); // 문자열 표시
void Busy(void); // 2ms 딜레이 함수
void Command(u_char); // 커맨드 쓰기 명령어
void Data(u_char);
void main(void)
{
UCSR0A = 0x0;
UCSR0B = 0b10011000;
UCSR0C = 0b00000110;
LCD_init();
while(1);
}
interrupt [USART0_RXC] void usart0_rx (void)
{
char ch = 0;
ch = UDR0;
LCD_String(ch); //오류 발생부분
if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
{
div = 1;
cal = ch;
}
if(ch >= '0' && ch <= '9')
{
if(div==0)
{
a += a*10 + (ch - '0');
}
else if(div == 1)
{
b += a*10 + (ch - '0');
}
}
if(ch == '=')
{
switch (cal)
{
case '+':
c = a+b;
break;
case '-':
c = a-b;
break;
case '*':
c = a * b;
break;
case '/':
c = a/b;
break;
default:
break;
}
Data(0x30+c);
}
}
void LCD_String(char flash *str)
{
char flash *pStr = 0;
pStr = str;
while(*pStr) Data(*pStr++);
}
void LCD_init(void)
{
DDRD = 0xFF; // 포트 D 출력 설정
PORTD = 0x0;
delay_ms(15);
Command(0x20); // 펑션 셋
delay_ms(5);
Command(0x20); // 펑션 셋
delay_us(100);
Command(0x20); // 펑션 셋
Command(FUNCSET); // 펑션 셋(2행, 4비트 구동 방식)
Command(DISPON); // 표시 ON
Command(ALLCLR); // DRAM 클리어
Command(ENTMODE); // 엔트리 모드 설정(쓰기 동작후 메모리 어드레스 자동 +1)
}
// 명령어 쓰기 함수
void Command(u_char byte)
{
Busy();
// 명령어 상위 4비트 출력
PORTD = byte & 0xF0; // 상위 4비트 포트D 상위 4비트에 출력
RS = 0; // 명령어
RW = 0; // 쓰기
delay_us(1);
ENABLE = 1; // E = 1
delay_us(1);
ENABLE = 0; // E = 0
// 명령어 하위 4비트
PORTD = (byte << 4) & 0xF0; // 하위 4비트 포트D 상위4비트에 출력
RS = 0; // 명령어
RW = 0; // 쓰기
delay_us(1);
ENABLE = 1; // E = 1
delay_us(1);
ENABLE = 0; // E = 0
}
// 데이터 쓰기 함수
void Data(u_char byte)
{
Busy();
// 데이터 상위 4비트 출력
PORTD = byte & 0xF0; // 상위 4비트 포트D 상위 4비트에 출력
RS = 1; // 데이터
RW = 0; // 쓰기
delay_us(1);
ENABLE = 1; // E = 1
delay_us(1);
ENABLE = 0; // E = 0
// 데이터 하위 4비트 출력
PORTD = (byte << 4) & 0xF0; // 하위 4비트 포트D 상위 4비트에 출력
RS = 1; // 데이터
RW = 0; // 쓰기
delay_us(1);
ENABLE = 1; // E = 1
delay_us(1);
ENABLE = 0; // E = 0
}
// Busy Flag Check -> 일반적인 BF를 체크하는 것이 아니라
// 일정한 시간 지연을 이용한다.
void Busy(void)
{
delay_ms(2);
}
댓글 2
조회수 1,098master님의 댓글
master 작성일
void LCD_String(char flash *); //문자열 표시 // LCD_String("hello"); 문자열을 인수로 사용하는 경우
void LCD_String(char *); //문자열 표시 // char str1[]="hello"; LCD_String(str1); 배열이나 포인터를 인수로 사용하는 경우
문자열을 넣지 않고 변수를 넣어서 발생한 오류입니다.
master님의 댓글
master 작성일
https://cafe.naver.com/circuitsmanual/5381
이 글의 아래 함수 선언과 사용법을 비교 해보세요
void lcd_puts(char *s){ while(*s)LCD_DAT(*s++); }
void lcd_putsf(flash char *s){ while(*s)LCD_DAT(*s++); }