질문게시판 > LCD 화면 문자출력이 안되요..

TODAY1,752 TOTAL2,426,139
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | LCD 화면 문자출력이 안되요..

페이지 정보

작성자 chelsea 작성일2022-06-09 10:09 조회2,426회 댓글3건

본문

	

16 X2 LCD의 LED는 켜지는데 문자 출력이 전혀 되지 않고 있습니다.

잘못된 코드가 있는지 확인 부탁드립니다.

첨부된 파일은 LCD와 보드 연결이미지입니다.

 

 

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

 

#define F_CPU 8000000UL

#define LCD_RS PORTC4 //0값이면 instruction, 1값이면 data 전송

#define LCD_EN PORTC5 //하강엣지에서 데이터 전달

#define LCD_DIR DDRC

#define LCD_PORT PORTC

#define LCD_Clear 0x01

#define LCD_Cursor 0x03 //function set:4bit data, 2line display, 5*8 dots

#define LCD_Function_Set 0x28

#define LCD_On 0x0E //0000 11(set display)1(cursor)0(blink)

#define LCD_Entry 0x06 //Cursor increased, no shift

 

 

 

volatile float calibrationfactor = 4.5;

volatile float flowrate=0;

volatile float cal=0;

volatile int pulsecount=0;

volatile int millisec=0;

volatile char sec=0;

 

 

 

void init_port()

{

DDRD = 0xFB;

PORTD = 0x40;

}

 

 

 

void init_timer1()

{

TCCR1A = (0<<WGM10)|(0<<COM1A0);

TCCR1B = (1<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);

OCR1A = 121; //OCA1A값을 십진값 121로 설정

TIMSK = (1<<OCIE1A);

/*TCCR0A = (1 << WGM01);

TIMSK0 |= (1 << OCIE0A);

TCCR0B |= (1 << CS02) | (1 << CS00);

OCR0A = 0x07;*/

}

 

// LCD

 

void Write_Command_LCD(char Command)

{

LCD_PORT = (LCD_PORT & 0xF0) | (Command & 0xF0); //상위 4BIT 출력

//LCD_PORT=Command; <- 8bit를 사용할 경우

LCD_PORT &= ~(1<<LCD_RS); // RS=0, command reg.

LCD_PORT |= (1<<LCD_EN); //LCD_E=1; //하강 Edge에서 데이터를 전달하기 때문에 High 상태 유지 후

_delay_ms(1);

LCD_PORT &= ~(1<<LCD_EN); //LCD_E=0; //low 상태로 전환하여 데이터를 전달.

_delay_ms(1);

LCD_PORT = (LCD_PORT & 0xF0) | (Command >> 4); //하위 4BIT 출력

LCD_PORT |= (1<<LCD_EN); //LCD_E=1; //하강 Edge에서 데이터를 전달하기 때문에 High 상태 유지 후

_delay_ms(1);

LCD_PORT &= ~(1<<LCD_EN); //LCD_E=0; //low 상태로 전환하여 데이터를 전달.

_delay_ms(10);

}

 

 

 

void PutsChar_LCD(int data)

{

LCD_PORT = (LCD_PORT & 0xF0) | (data & 0xF0); //상위 4BIT 출력

LCD_PORT &= ~(1<<LCD_RS); // RS=0, command reg.

LCD_PORT |= (1<<LCD_EN); //LCD_E=1; //하강 Edge에서 데이터를 전달하기 때문에 High 상태 유지 후

_delay_ms(1);

LCD_PORT &= ~(1<<LCD_EN); //LCD_E=0; //low 상태로 전환하여 데이터를 전달.

_delay_ms(1);

LCD_PORT = (LCD_PORT & 0xF0) | (data >> 4); //하위 4BIT 출력

LCD_PORT |= (1<<LCD_EN); //LCD_E=1; //하강 Edge에서 데이터를 전달하기 때문에 High 상태 유지 후

_delay_ms(1);

LCD_PORT &= ~(1<<LCD_EN); //LCD_E=0; //low 상태로 전환하여 데이터를 전달.

_delay_ms(10);

}

 

void String_LCD(char *s)

while(*s)

PutsChar_LCD(*s++); 

}

 

//

 

void LCD_Init(void)

{

LCD_DIR = 0xFF;

_delay_ms(50);

Write_Command_LCD(LCD_Function_Set); _delay_ms(2);

Write_Command_LCD(LCD_On); _delay_ms(2);

Write_Command_LCD(LCD_Clear); _delay_ms(2);

Write_Command_LCD(LCD_Entry); _delay_ms(2);

Write_Command_LCD(0x02); _delay_ms(2); //Return Home

}

 

//

 

ISR (TIMER1_COMPA_vect)

{

if(++millisec>=1000)

millisec=0; // 1sec

if(sec<6)

{

if(++sec>=6)

PORTD=0x28; //6sec  (PD6) Off, (PD5) on, (PD3) On

}

cal=pulsecount/calibrationfactor; //L/min

flowrate=cal*60; //L/hour

if(flowrate==0)

{

PORTD|= 2; //PD1 High Output (Water flow signal)

}

else PORTD&=~2; //PD1 Low Output

pulsecount = 0;

}

}

 

 

ISR (INT0_vect)

{

pulsecount++; 

}

 

 

int main(void){

 

char water[20]={0};

init_port();

init_timer1();

MCUCR |= (0 << ISC00)|(1 << ISC01); //The falling edge of INT0 generates an interrupt request.

GICR |= (1 << INT0); //INT0 Enable

sei();

LCD_Init();

 

while (1)

{

sprintf(water,"WATERFLOW:%3f L/H",flowrate);

Write_Command_LCD(0x08);

String_LCD(water);

_delay_ms(10);

}

}


  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 3

조회수 2,426

master님의 댓글

master 작성일

#define LCD_RS          PORTC4  //0값이면 instruction, 1값이면 data 전송
#define LCD_EN          PORTC5  //하강엣지에서 데이터 전달
#define LCD_DIR          DDRC
#define LCD_PORT        PORTC
회로도하고 핀선언하고 맞지 않습니다.

chelsea님의 댓글

chelsea 댓글의 댓글 작성일

답변 감사합니다. 이미지에 나와있는 핀번호를 잘 못 올렸습니다. PB0->PC4, PB1->PC5, PB4~PB7 ->PC0~PC3입니다.
올려주신 코드에 위 #define핀번호만 바꾸면 될 것 같은데.. 혹시 다른 내용도 변경되어야 하는 부분이 있을까요?

master님의 댓글

master 작성일

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//
#define LCD_RS          0x10  // PC4
#define LCD_EN          0x20  // PC5
#define LCD_DIR          DDRC
#define LCD_PORT        PORTC
//
#define LCD_Clear        0x01
#define LCD_Cursor      0x03    //function set:4bit data, 2line display, 5*8 dots
#define LCD_Function_Set 0x28
#define LCD_On          0x0E    //0000    11(set display)1(cursor)0(blink)
#define LCD_Entry        0x06    //Cursor increased, no shift
//
volatile float calibrationfactor=4.5,flowrate=0,cal=0;
volatile int pulsecount=0,millisec=0;
volatile char sec=0;
//
void Write_Command_LCD(char Command){
    LCD_PORT=(Command >> 4)|LCD_EN; _delay_us(1); LCD_PORT&=~LCD_EN; _delay_us(1);
    LCD_PORT=(Command&0x0F)|LCD_EN; _delay_us(1); LCD_PORT&=~LCD_EN; _delay_ms(2);
}
//
void PutsChar_LCD(int data){
    LCD_PORT=(Command >> 4)|LCD_RS|LCD_EN; _delay_us(1); LCD_PORT&=~LCD_EN; _delay_us(1);
    LCD_PORT=(Command&0x0F)|LCD_RS|LCD_EN; _delay_us(1); LCD_PORT&=~LCD_EN; _delay_us(40);
}
//
void String_LCD(char *s){ while(*s)PutsChar_LCD(*s++); }
//
void LCD_Init(void){
    LCD_DIR=0xFF;
    _delay_ms(50);
    Write_Command_LCD(LCD_Function_Set);
    Write_Command_LCD(LCD_On);
    Write_Command_LCD(LCD_Clear);
    Write_Command_LCD(LCD_Entry);
    Write_Command_LCD(0x02); //Return Home
}
//
void init_timer1(){
    TCCR1A=(0<<WGM10)|(0<<COM1A0);
    TCCR1B=(1<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);
    OCR1A=121; //OCA1A값을 십진값 121로 설정
    TIMSK=(1<<OCIE1A);
    /*TCCR0A=(1<<WGM01); TIMSK0|=(1<<OCIE0A); TCCR0B|=(1<<CS02)|(1<<CS00); OCR0A=0x07;*/
}
//
ISR(TIMER1_COMPA_vect){
    if(++millisec>=1000){
        millisec=0; // 1sec
        if(sec<6){
            if(++sec>=6)PORTD=0x28; //6sec (PD6)Off,(PD5)on,(PD3)On
            }
        cal=pulsecount/calibrationfactor; //L/min
        flowrate=cal*60; //L/hour
        if(flowrate==0){
            PORTD|=2; //PD1 High Output(Water flow signal)
            }
        else PORTD&=~2; //PD1 Low Output
        pulsecount=0;
    }
}
//
ISR(INT0_vect){ pulsecount++; }
//
int main(void){
    char water[20]={0};
    init_timer1();
    MCUCR|=(0<<ISC00)|(1<<ISC01); //The falling edge of INT0 generates an interrupt request.
    GICR|=(1<<INT0); //INT0 Enable
    sei();
    LCD_Init();
    while(1){
        sprintf(water,"WATERFLOW:%3f L/H",flowrate);
        Write_Command_LCD(0x80);
        String_LCD(water);
        _delay_ms(100);
    }
}

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
질문 아두이노 RFID를 이용한 자판기 만들기댓글[2] 첨부파일 wasdv 22-11-06 266
질문 (도와주세요ㅠ) 초음파센서로 lcd와 부저 울리기 첨부파일 승천 22-11-06 274
답변 답변글 답변 : (도와주세요ㅠ) 초음파센서로 lcd와 부저 울리기댓글[4] master 22-11-06 490
질문 서보모터 2개 구동하는법댓글[1] 호하늘 22-11-05 347
질문 블루투스 모듈간에 페어링이 안됩니다 ㅠ댓글[3] starter92 22-11-05 331
질문 블루투스 모듈 HC-05,06은 레오나르도와 사용이 불가능한가요?댓글[2] starter92 22-11-05 182
질문 안녕하십니까? 핀볼관련 코드 질문 드립니다 이미지첨부파일 Honor 22-11-04 392
답변 답변글 답변 : 안녕하십니까? 핀볼관련 코드 질문 드립니다댓글[2] 이미지 master 22-11-05 448
질문 GP2Y0A02YK센서 사용 거리 측정댓글[1] 이미지 cky88 22-11-04 307
질문 wifi server 구현하고 메시지 송신하는 방법좀댓글[1] 라칸 22-11-04 217
질문 Atmega128질문좀 부탁드려요. ㅠㅠ댓글[5] 그냥사는사람 22-11-04 511
질문 초음파 센서를 이용해서 lcd거리측정에 부저 집어넣기...댓글[1] 이미지첨부파일 승천 22-11-04 371
질문 pull down 이용해서댓글[1] 이미지첨부파일 무어유 22-11-03 408
질문 atemega128 가변저항을 이용하여 single conversion mode로 변환하는 과정 질문입니다댓글[1] 호루라기 22-11-03 359
질문 atmega128 인터럽트 스위치, 반복문 안에 반복문댓글[2] 시속90 22-11-03 420
답변 답변글 답변 : atmega128 인터럽트 스위치, 반복문 안에 반복문 master 22-11-03 273
질문 (도와주세요..ㅜ) 아두이노 초음파센서를 이용한 서보모터, 부저 제어 질문댓글[2] 이미지첨부파일 승천 22-11-03 487
질문 아두이노 자동 창문 개폐기 코드 질문드립니다. keajoo12 22-11-03 274
답변 답변글 답변 : 아두이노 자동 창문 개폐기 코드 질문드립니다.댓글[3] master 22-11-03 379
질문 시리얼 모니터를 통한 LCD 문자 출력 시 오류(괴문자)댓글[2] 이미지첨부파일 takeonefor 22-11-02 253
질문 stm32 spi로 센서 모듈 여러개 사용하는 방법좀댓글[4] 이미지첨부파일 라칸 22-11-01 380
질문 stm32 i2c로 센서 2개를 읽고 쓰고 싶은데댓글[4] 라칸 22-11-01 407
질문 블루투스 관련 질문입니다.댓글[5] 이미지 LightP 22-11-01 438
질문 ESP8266을 이용해서 Atmega128에 연결된 모터 제어댓글[1] bbbin 22-11-01 365
질문 릴레이 모듈, 가습기 모듈, 아두이노 연결댓글[1] 이미지첨부파일 보라색 22-10-31 342
질문 스텝모터,twi,LCD관련 질문 있습니다..!댓글[1] 이미지첨부파일 만두 22-10-31 445
질문 ATmega128 디지털 도어락 관련 질문입니다댓글[3] 이미지첨부파일 아트메가왕초보 22-10-30 828
질문 심박수 센서 오류관련 질문입니다댓글[1] starter92 22-10-30 362
질문 압력센서 8개 mux모듈 이미지 ㅋㅈㅇ 22-10-29 331
답변 답변글 답변 : 압력센서 8개 mux모듈 이미지 master 22-10-29 217
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기