Micom_Electric/마이컴_원칩 2011. 10. 14. 00:17
초기화에 대해 참조할 링크:
http://web.alfredstate.edu/weimandn/lcd/lcd_initialization/lcd_initialization_index.html

증말 웃기는 경우


이건 HD44780 용인데 초기화가 다른 삼성 S6A0069 와 KC0066 LCD에 먹힌다
정작 삼성이 표기한 초기화 루틴은 안된다는거 ????
 링크 : http://www.microchip.com/forums/m122006.aspx
HY-1602H-501 // LMB1624AFC
// ----------------------------------------------------------------------------------
// Following is HD4480 controller
void LCDinit(void){//Initializes LCD{

LDP=0xFC; // PORTD ->23  LED output
LCP=0x07;   // High C port for ADC input : PORTC->012 output
LDDR=1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4;
LCDR=1<<LCD_E|1<<LCD_RW|1<<LCD_RS;
// ----------------------------------------------------
//LCDsendCommand(0b00101000); 4 bit dual line, font 5x7
  //LCDsendCommand(0b00001100); increment address, cursor shift off
// ------------------ Function set ------------
_delay_ms(50); // Change from 15 to 40ms - 작동안되면 시간 늘일것
LCP=1<<LCD_E|0<<LCD_RW|0<<LCD_RS;
SetHighNibble(0x30); // Try 1
Toggle_E();
_delay_ms(10);
SetHighNibble(0x30); // Try 2
Toggle_E();
_delay_ms(1);
SetHighNibble(0x30); // Try 3
Toggle_E();
_delay_ms(1);
SetHighNibble(0x20); // 4 bit mode
Toggle_E();
_delay_ms(1);

LCDsendCommand(0B00101000); // 4 bit dual line, font 5x7
LCDsendCommand(0B00001100); // Dsplay on/off
LCDsendCommand(0B00000001); // Display clear
_delay_ms(2);
LCDsendCommand(0B00000110); // Etry mode
}
================== 이것도 동작은 되긴한다 ===========================================
void LCDinit(void){//Initializes LCD{

_delay_ms(40); // Change from 15 to 40ms
LDP=0xFC; // PORTD ->23  LED output
LCP=0x07;   // High C port for ADC input : PORTC->012 output
LDDR=1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4;
LCDR=1<<LCD_E|1<<LCD_RW|1<<LCD_RS;
// ----------------------------------------------------
//LCDsendCommand(0b00101000); 4 bit dual line, font 5x7
  //LCDsendCommand(0b00001100); increment address, cursor shift off
// ------------------ Function set ------------
LCP=1<<LCD_E|0<<LCD_RW|0<<LCD_RS; // Try 1
SetHighNibble(0x30);
Toggle_E();
_delay_ms(5);
LCP=1<<LCD_E|0<<LCD_RW|0<<LCD_RS; // Try 2
SetHighNibble(0x30);
Toggle_E();
_delay_ms(1);
LCP=1<<LCD_E|0<<LCD_RW|0<<LCD_RS; // Try 3
SetHighNibble(0x30);
Toggle_E();
_delay_ms(1);
LCP=1<<LCD_E|0<<LCD_RW|0<<LCD_RS; // Set to 4 bit mode
SetHighNibble(0x20);
Toggle_E();
_delay_ms(1);

LCDsendCommand(0B00101000); // 4 bit dual line, font 5x7
LCDsendCommand(0B00001100); // Dsplay on/off
LCDsendCommand(0B00000001); // Display clear
_delay_ms(2);
LCDsendCommand(0B00000110); // Etry mode
}  
===================
// ----------------------------------------------------------------------------------
void Toggle_E(void){
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
}
// ----------------------------------------------------------------------------------
void SetLowNibble(unsigned char ch){
   // output high nibble first
    LDP &= ~_BV(LCD_D7);
    LDP &= ~_BV(LCD_D6);
    LDP &= ~_BV(LCD_D5);
    LDP &= ~_BV(LCD_D4);
if(ch & 0x08) LDP |= _BV(LCD_D7);
if(ch & 0x04) LDP |= _BV(LCD_D6);
if(ch & 0x02) LDP |= _BV(LCD_D5);
if(ch & 0x01) LDP |= _BV(LCD_D4);
}
// ----------------------------------------------------------------------------------
void SetHighNibble(unsigned char ch){
    // output high nibble first
    LDP &= ~_BV(LCD_D7);
    LDP &= ~_BV(LCD_D6);
    LDP &= ~_BV(LCD_D5);
    LDP &= ~_BV(LCD_D4);
if(ch & 0x80) LDP |= _BV(LCD_D7);
if(ch & 0x40) LDP |= _BV(LCD_D6);
if(ch & 0x20) LDP |= _BV(LCD_D5);
if(ch & 0x10) LDP |= _BV(LCD_D4);
}
// ----------------------------------------------------------------------------------
void LCDsendChar(unsigned char ch){ //Sends Char to LCD

    // configure data pins as output
    LDDR |= _BV(LCD_D4);
    LDDR |= _BV(LCD_D5);
    LDDR |= _BV(LCD_D6);
    LDDR |= _BV(LCD_D7);

LCP|=1<<LCD_RS;
LCP&=~(1<<LCD_RW);
//4 bit part
SetHighNibble(ch);
Toggle_E();
// LCP&=~(1<<LCD_RS);
_delay_ms(1);
SetLowNibble(ch);
// LCP|=1<<LCD_RS;
Toggle_E();
// LCP&=~(1<<LCD_RS);
_delay_ms(1);

}
// ----------------------------------------------------------------------------------
void LCDsendCommand(unsigned char cmd){ //Sends Command to LCD

    // configure data pins as output
    LDDR |= _BV(LCD_D4);
    LDDR |= _BV(LCD_D5);
    LDDR |= _BV(LCD_D6);
    LDDR |= _BV(LCD_D7);
//LCP&=~_BV(LCD_RS); // Set RS low for Instruction
LCP&=~(1<<LCD_RS); // Set RS low for Instruction
LCP&=~(1<<LCD_RW);
//4 bit part
SetHighNibble(cmd);
Toggle_E();
LCP&=~(1<<LCD_RS); // Set RS low for Instruction
SetLowNibble(cmd);
Toggle_E();

posted by 털보네i
: