BASIC4MCU | 질문게시판 | Atmega128 LCD 출력이 나오지 않습니다, 코드 확인 부탁드립니다.
페이지 정보
작성자 코드에막혀 작성일2024-06-25 09:48 조회216회 댓글0건본문
Atmel Studio 7.0을 활용해서 LCD 출력 확인하는 코드를 작성하고 있습니다. ( LCD 화면에 'A' 출력 )
초기화 함수, LCD_init(void)는 lcd 데이터 시트 참고하여 작성했습니다. (이미지 첨부)
atmega 전원 on시 lcd 화면 첫번째, 세번째 줄에 사각 박스만 나오고 코드를 입력해도 아무런 값이 나오지 않는 상황입니다.
PORTD 에 데이터핀을 연결하였고, PORTC에 제어 핀을 연결하였습니다. (EN - PC4, R/W - PC3, RS - PC2)
이것저것 바꿔보고 해도 아무런 출력이 나오지 않아 굉장히 답답한 상황입니다. ㅠㅠ 선배님들의 도움이 절실합니다.
아래는 해당 코드입니다.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define FUNCTION_SET_8BIT 0x30 // 0b0011 0000, Function set: 8-bit interface (초기화 시 첫 명령)
#define FUNCTION_SET 0x38 // 0b0011 1000, Function set: 8-bit interface, 2 lines, 5x8 dots
#define DISPLAY_ON_OFF 0x0C // 0b0000 1100, Display ON/OFF control: Display on, cursor off, blink off
#define CLEAR_DISPLAY 0x01 // 0b0000 0001, Clear display
#define ENTRY_MODE_SET 0x06 // 0b0000 0110, Entry mode set: Increment mode
void CLCD_cmd(char cmd); // 명령어 전송 함수
void CLCD_data(char data); // 데이터 write 함수
void LCD_init();
int main(void) {
DDRD = 0xff; // PORTD : command/data 포트
DDRC = 0xff; // PORTC : control 포트
_delay_ms(50); // 전원 인가 후 CLCD 셋업 시간
LCD_init(); // LCD 초기화
_delay_ms(50); // 디스플레이 클리어 실행 시간 동안 대기
CLCD_data('A'); // 'A' 디스플레이
while(1) {
}
}
void CLCD_cmd(char cmd) {
PORTC = 0x00; // 0b0000 0000, E(bit4) = 0 (모드 비활성화), R/W (bit3) = 0 (쓰기 모드), RS (bit2) = 0 (명령 모드)
_delay_us(50); // Setup Time
PORTC = 0x10; // 0b0001 0000, E = 1 (모드 활성화), R/W (bit3) = 0 (쓰기 모드), RS (bit2) = 0 (명령 모드), MCU가 LCD에 명령 전송 시작
PORTD = cmd; // 8bit 전송
_delay_us(50); // Setup Time
PORTC = 0x00; // E = 0 (모드 비활성화), R/W = 0, RS = 0, 전송을 멈추고 LCD가 데이터를 읽고 래치(일시 저장).
_delay_ms(5); // Hold Time & Execution Time
}
void CLCD_data(char data) {
PORTC = 0x04; // 0b0000 0100, E(bit4) = 0 (모드 비활성화), R/W (bit3) = 0 (쓰기 모드), RS (bit2) = 1 (데이터 입력 모드)
_delay_us(50); // Setup Time
PORTC = 0x14; // 0b0001 0100, E(bit4) = 1 (모드 활성화), R/W (bit3) = 0 (쓰기 모드), RS (bit2) = 1 (데이터 입력 모드), MCU가 LCD에 데이터 입력 시작
_delay_us(50); // Setup Time
PORTD = data; // 8bit 전송
PORTC = 0x04; // E(bit4) = 0 (모드 비활성화), R/W (bit3) = 0 (쓰기 모드), RS (bit2) = 1 (데이터 입력 모드), 전송을 멈추고 LCD가 데이터를 읽고 래치(일시 저장).
_delay_ms(5);
}
void LCD_init(void) {
_delay_ms(50); // 초기화 대기 시간: 전원 인가 후 40ms 이상 대기
CLCD_cmd(FUNCTION_SET_8BIT); // Function set (첫 번째): 8-bit 인터페이스 설정
_delay_us(50);
CLCD_cmd(FUNCTION_SET); // Function set (네 번째): 8-bit 인터페이스, 2 라인, 5x8 도트 설정
_delay_us(50);
CLCD_cmd(DISPLAY_ON_OFF); // Display ON/OFF control: Display on, Cursor off, Blink off
_delay_us(50);
CLCD_cmd(CLEAR_DISPLAY); // Display clear: 화면 클리어
_delay_ms(2); // 클리어 명령은 1.52ms 이상 대기 필요
CLCD_cmd(ENTRY_MODE_SET); // Entry mode set: 커서 이동 및 디스플레이 이동 설정
_delay_ms(5);
}
댓글 0
조회수 216등록된 댓글이 없습니다.