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