środa, 29 marca 2017

Prosta biblioteka do obsługi sterownika LCD HD44780 dla mikrokontrolerów PIC



Z braku dobrze działających i prostych w użyciu bibliotek postanowiłem napisać swoją, jak najprostszą w pisaniu i użyciu.

Poniżej umieściłem zestaw funkcji z biblioteki. Działa ona w 4-bitowym interfejsie z odczytem flagi BF. Można podpiąć RW wyświetlacza do masy i wtedy trzeba zastąpić funkcję busy opóźnieniem około 50us.

void BUS_set(unsigned char dataToSet){
    LCD_DATA4_LAT = (dataToSet & ( 1 << 0 )) >> 0;  
    LCD_DATA5_LAT = (dataToSet & ( 1 << 1 )) >> 1;   
    LCD_DATA6_LAT = (dataToSet & ( 1 << 2 )) >> 2;   
    LCD_DATA7_LAT = (dataToSet & ( 1 << 3 )) >> 3;   
}

void BUS_write(unsigned char dataToWrite){
LCD_RW_LAT = LOW;

LCD_E_LAT = HIGH;
BUS_set(dataToWrite >> 4);
LCD_E_LAT = LOW;

LCD_E_LAT = HIGH;
BUS_set(dataToWrite);
LCD_E_LAT = LOW;

while(LCD_busy());

}

void LCD_command(unsigned char commandToWrite){
LCD_RS_LAT = LOW;
BUS_write(commandToWrite);
}

void LCD_data(unsigned char dataToWrite)
{
LCD_RS_LAT = HIGH;
BUS_write(dataToWrite);
}

void LCD_text(char * text)
{
while(*text)
LCD_data(*text++);
}

void LCD_fills(unsigned char j)
{
while(j > 0){
LCD_data(0xFF);
j--;
}
}

void LCD_clear(void)
{
LCD_command(0x01);
delay(2);
}

void LCD_home(void)
{
LCD_command(0x02);
delay(2);

}

void LCD_pos(unsigned char row, unsigned char position)
{
    if(row == 0){
        LCD_command(0x80);
        while(position > 0){
            LCD_command(0x14);
            position--;
        }
    } else {
        LCD_command(0xC0);
        while(position > 0){
            LCD_command(0x14);
            position--;
        }
    }
}

void LCD_int(unsigned long  tmp){
char buffer[16]; 
sprintf(buffer,"%ld", tmp);
LCD_text(buffer);

}

void LCD_float(double  tmp){
char buffer[16]; 
sprintf(buffer,"%.3f", tmp);
LCD_text(buffer);
}


void LCD_initalize(void)
{
LCD_RW_DIR = OUTPUT;
LCD_E_DIR = OUTPUT;
LCD_RS_DIR = OUTPUT;
LCD_BUS_OUTPUT;
delay(15); 
LCD_RW_LAT = LOW;
LCD_RS_LAT = LOW;
LCD_E_LAT = HIGH;

for(unsigned char i = 0; i < 3; i++)
  {
  LCD_E_LAT = HIGH;
  BUS_set(0x03);
  LCD_E_LAT = LOW;
  delay(5);
  }

  LCD_E_LAT = HIGH;
  BUS_set(0x02);
  LCD_E_LAT = LOW;
  delay(1);


   LCD_command(40);
   LCD_command(1);
   delay(2);

   LCD_command(12);
   LCD_command(1);
   delay(5);
}

unsigned char LCD_busy(){
LCD_BUS_INPUT;
LCD_RW_LAT = HIGH;
LCD_RS_LAT = LOW;
unsigned char bf = LCD_DATA7_REA;
LCD_RW_LAT = LOW;
LCD_RS_LAT = LOW;
LCD_BUS_OUTPUT;
return bf;
}

Brak komentarzy:

Prześlij komentarz