2015-01-05 5 views
0

LM016L LCD 디스플레이를 인터페이스하기 위해 Atmega-16 마이크로 컨트롤러를 프로그래밍했습니다. 내가 깜박 커서를 만드는처럼 LCD에 명령을 보낼 때, 그것은 완벽하게 잘 작동LCD가 명령을 따르지만 문자를 표시하지 않습니다.

#include <avr/io.h> 
#include <util/delay.h> 
#define MrLCDsCrib PORTB 
#define DataDir_MrLCDsCrib DDRB 
#define MrLCDsControl PORTD 
#define DataDir_MrLCDsControl DDRD 
#define LightSwitch 5 
#define ReadWrite 7 
#define BiPolarMood 2 

void Check_IF_MrLCD_isBusy(void); 
void Peek_A_Boo(void); 
void Send_A_Command(unsigned char command); 
void Send_A_Character(unsigned char character); 

int main(void) { 
    DataDir_MrLCDsControl |= 1 << LightSwitch | 1 << ReadWrite | 1 << BiPolarMood; 
    _delay_ms(15); 

    Send_A_Command(0x01); //Clear Screen 
    _delay_ms(20); 
    Send_A_Command(0x38); //8-bit mode 
    _delay_ms(20); 
    Send_A_Command(0b00001110); // cursor on 
    _delay_ms(20); 
    Send_A_Command(0x0F); // cursor blinking 
    _delay_ms(20); 

    Send_A_Character(0x4E); //N 
    _delay_ms(20); 
    Send_A_Character(0x65); //e 
    _delay_ms(20); 
    Send_A_Character(0x77); //w 
    _delay_ms(20); 


    while (1) {} 
} 

void Check_IF_MrLCD_isBusy() { 
    DataDir_MrLCDsCrib = 0; 
    MrLCDsControl |= 1 << ReadWrite; 
    MrLCDsControl &= ~1 << BiPolarMood; 

    while (MrLCDsCrib >= 0x80) { 
     Peek_A_Boo(); 
    } 
    DataDir_MrLCDsCrib = 0xFF; 
} 

//Peek_A_Boo() writes the data to or from the LCD that are waiting to be written 
void Peek_A_Boo() { 
    MrLCDsControl |= 1 << LightSwitch; 
    asm volatile("nop"); 
    asm volatile("nop"); 
    MrLCDsControl &= ~1 << LightSwitch; 
} 

void Send_A_Command(unsigned char command) { 
    Check_IF_MrLCD_isBusy(); 
    MrLCDsCrib = command; 
    MrLCDsControl &= ~ ((1 << ReadWrite) | (1 << BiPolarMood)); 
    Peek_A_Boo(); 
    MrLCDsCrib = 0; 
} 

void Send_A_Character(unsigned char character) { 
    Check_IF_MrLCD_isBusy(); 
    MrLCDsCrib = character; 
    MrLCDsControl &= ~ (1 << ReadWrite); 
    MrLCDsControl |= 1 << BiPolarMood; 
    Peek_A_Boo(); 
    MrLCDsCrib = 0; 
} 

다음과 같이 프로그램입니다. 그러나 Send_A_Character() 함수가 호출되어 화면에 문자를 쓰면 작동하지 않습니다. LCD에 아무것도 표시하지 못합니다. 위의 코드에는 구문 오류가 없습니다. 만약 누군가 LCD가 화면에 아무 것도 표시하지 못하게하는 논리적 오류를 지적 할 수 있다면 좋을 것입니다. 심지어 2 초 각 지점에서 지연을 늘리려고했는데 그 작동하지 않았다.

+0

당신은 PDF 회로도와 uc에와 LCD에 대한 데이터 시트에 대한 몇 가지 링크에 대한 링크를 게시 할 수 있습니까? – Nick

+0

LCD 데이터 시트 링크 : [link] http://pdf1.alldatasheet.com/datasheet-pdf/view/146552/HITACHI/LM016L.html –

+0

마이크로 컨트롤러 데이터 시트 링크 : [link] http://www.atmel.com /images/doc2466.pdf –

답변

0

LCD가 명령을 올바르게 실행하고 문자를 표시하지 못하면 두 가지를 확인해야합니다. RS 핀 연결. 명령의 경우 RS는 낮은 연결 명령을 사용하더라도 명령이 실행된다는 의미가 낮아야합니다. RS가 실제로 높고 올바르게 연결되었는지 확인해야합니다. 나는 똑같은 문제가 있었고 실제로 LCD에 RS와 RW 연결을 교환했다는 것을 깨닫기 위해 하루가 걸렸다. 데이터 핀은 명령을 LCD로 보내는 한 정확합니다. 희망이 도움 :

1

나는이 코드를 몇 시간 동안 보냈지 만 제대로 작동하지 못했습니다.

  1. 당신은뿐만 아니라 코드에 따라 MCU
  2. 수정 다른 연결의 GND로 LCD의 RW를 연결해야합니다 그러나 나는 다음과 같이 내 LCD에 물건을 쓸 수 있었다.
  3. 여기에 나를 위해 일한 코드는 다음과 같습니다 (http://circuitdigest.com/microcontroller-projects/lcd-interfacing-with-atmega32-avr)

    // Code for LCD Interfacing with ATmega32 AVR microcontroller 
    #include <avr/io.h> 
    #define F_CPU 1000000UL 
    #include <util/delay.h> 
    #define RS 6 
    #define E 5 
    void send_a_command (unsigned char command); 
    void send_a_character(unsigned char character); 
    int main(void) 
    { 
        DDRA = 0xFF; 
        DDRD = 0xFF; 
        _delay_ms(50); 
        send_a_command(0x01);// sending all clear command 
        send_a_command(0x38);// 16*2 line LCD 
        send_a_command(0x0E);// screen and cursor ON 
    
        send_a_character (0x44); // ASCII(American Standard Code for Information Interchange) code for 'D' 
        send_a_character (0x49); // ASCII(American Standard Code for Information Interchange) code for 'I' 
        send_a_character (0x4C); // ASCII(American Standard Code for Information Interchange) code for 'L' 
        send_a_character (0x49); // ASCII(American Standard Code for Information Interchange) code for 'I' 
        send_a_character (0x50); // ASCII(American Standard Code for Information Interchange) code for 'P' 
    
    } 
    void send_a_command (unsigned char command) 
    { 
        PORTA=command; 
        PORTD&= ~(1<<RS); 
        PORTD|= (1<<E); 
        _delay_ms(50); 
        PORTD&= ~(1<<E); 
        PORTA =0; 
    } 
    void send_a_character (unsigned char character) 
    { 
        PORTA=character; 
        PORTD|= (1<<RS); 
        PORTD|= (1<<E); 
        _delay_ms(50); 
        PORTD&= ~(1<<E); 
        PORTA =0; 
    } 
    
+0

"편집 한 Dec 9"텍스트를 클릭하면 글을 올바르게 포맷하는 데 필요한 작은 변경 사항을 볼 수 있습니다. 편집 할 때 도움이 가능합니다. 환호, 그리고 SO에 오신 것을 환영합니다! – Mogsdad