Hallo Leute,
Da ich für die meisten meiner Schaltungen das Layout nicht an
die Software anpassen kann/will brauch ich eine Librairie etc. zur
Ansteuerung normaler HD44780-Displays mit beliebiger Pinbelegung...
Leider konnte ich nichts derartiges finden, wseshalb ich nun eine eigendes
kleines Programm geschrieben hab, welches allerdings nicht funktioniert:
Theoretisch sollte ein großes B mit blinkendem Cursor zu sehen sein,
statt dessen tut sich garnichts, auser das der schwarze Balken nach
dem Init verschwindet...
Auf optimierungsvorschläge bzgl. Speicherverbrauch etc. kann ich bis sich
was tut erstmal verzichten...
Wäre schön wenn mal jemand draufschauen könnte, mir fällt nichts mehr ein...
Das Display funktioniert jedenfalls mit einem Bascom testprog und
ist richtig angeschlossen, Kontrast richtig eingestellt..
PS: Die Tutorials von mikrocontrollerf.net, rn-net und das Datenblatt etc. kenn ich berreits
Schon mal Danke im Vorraus!
Gruß:
AVRuser
Da ich für die meisten meiner Schaltungen das Layout nicht an
die Software anpassen kann/will brauch ich eine Librairie etc. zur
Ansteuerung normaler HD44780-Displays mit beliebiger Pinbelegung...
Leider konnte ich nichts derartiges finden, wseshalb ich nun eine eigendes
kleines Programm geschrieben hab, welches allerdings nicht funktioniert:
Theoretisch sollte ein großes B mit blinkendem Cursor zu sehen sein,
statt dessen tut sich garnichts, auser das der schwarze Balken nach
dem Init verschwindet...
Code:
#include <avr/io.h>
#include <stdbool.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define RS PB5
#define EN PB4
#define D1 PB3 //DB4 an Display
#define D2 PB2 //DB5 an Display
#define D3 PB0 //DB6 an Display
#define D4 PD7 //DB7 an Display
void lcd_enable(void){ //Send enable pulse
PORTB |= (1<<EN);
_delay_us(20);
PORTB &= ~(1<<EN);
}
void lcd_write(char command[9], bool bod){
PORTB = 0x00;
PORTD = 0x00;
if (bod == 1) PORTB |= (1<<RS); //Select data or command
if (command[0] == '1') PORTD |= (1<<D4);
if (command[1] == '1') PORTB |= (1<<D3);
if (command[2] == '1') PORTB |= (1<<D2);
if (command[3] == '1') PORTB |= (1<<D1);
lcd_enable();
PORTB = 0x00;
PORTD = 0x00;
if (bod == 1) PORTB |= (1<<RS);
if (command[4] == '1') PORTD |= (1<<D4);
if (command[5] == '1') PORTB |= (1<<D3);
if (command[6] == '1') PORTB |= (1<<D2);
if (command[7] == '1') PORTB |= (1<<D1);
lcd_enable();
PORTB = 0x00;
PORTD = 0x00;
}
void lcd_init(void){
DDRB = 0b00111101; //Define the used PORTs as output
DDRD = 0b10000000;
_delay_ms(500);
PORTB = 0b00001100; //Command for soft-reset
lcd_enable(); //1. soft-reset
_delay_ms(5);
lcd_enable(); //2. soft-reset
_delay_ms(1);
lcd_enable(); //3. soft-reset
_delay_ms(1);
PORTB = 0b00000100; //Set into 4-bit mode
lcd_enable();
_delay_ms(5);
lcd_write('00100000', 0); //LCD set function
lcd_write('00000000', 0); //4-bit mode
lcd_write('00001000', 0); //Select two lines
lcd_write('00000000', 0); //5x7 Pixels
lcd_write('00001000', 0); //LCD set display
lcd_write('00000100', 0); //Display on
lcd_write('00000010', 0); //Cursor on
lcd_write('00000001', 0); //Cursor blink
lcd_write('00000100', 0); //LCD entry mode
lcd_write('00000010', 0); //Entry increase
lcd_write('00000000', 0); //Entry no shift
lcd_write('00000001', 0); //LCD clear display
_delay_ms(2);
}
int main(void){
lcd_init();
lcd_write('00100100', 1); //Should write a B to the Display
while(1){
}
}
Auf optimierungsvorschläge bzgl. Speicherverbrauch etc. kann ich bis sich
was tut erstmal verzichten...
Wäre schön wenn mal jemand draufschauen könnte, mir fällt nichts mehr ein...
Das Display funktioniert jedenfalls mit einem Bascom testprog und
ist richtig angeschlossen, Kontrast richtig eingestellt..
PS: Die Tutorials von mikrocontrollerf.net, rn-net und das Datenblatt etc. kenn ich berreits
Schon mal Danke im Vorraus!
Gruß:
AVRuser