C LCD-Textdisplay mit C ansprechen

AVRuser

Neues Mitglied
20. Apr. 2011
217
0
0
Niedersachsen
Sprachen
  1. BascomAVR
  2. ANSI C
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...

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...:D:rolleyes:

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
 
Hi,

nur mal kurz zwischendurch ....
Du benutzt scheinbar den 4Bit-Modus.
Das ist oft nicht richtig implementiert und wird auch in den Datenblättern nicht wirklich gut erklärt. Die Steuersequenz für 4Bit-Modus muß teilweise 3x übertragen werden damit es sicher klappt. Ich finde grad den genauen Ablauf nicht.

Das die Blöcke bei dir vom Display verschwinden ist schonmal nicht schlecht.

Hier mal ne Sequenz die ich schnell aus dem Forum geholt habe ...
Code:
;	Powertip PC1602-E  16x2 Chr , Controller ST7066U
;	4-Bit-Modus ( D4-7 , D0-3 )
;
;	=== 4-Bit Init ===
;	  RS   RW   D7654	- RS 0=Cmd 1=Data , RW 0=Wr 1=Rd
;	- wait >40ms
;
;	- RS:0 RW:0 0b 0011 (0x3)
;
;	- wait >37us
;
;	- RS:0 RW:0 0b 0010 (0x2) - FunctionSet 4Bit (1)
;	- RS:0 RW:0 0b NF** (0x8) - Lines,Font (N 0=1L 1=2L , F 0=5x8Dot)
;
;	- wait >37us
;
;	- RS:0 RW:0 0b 0010 (0x2) - FunctionSet 4Bit (2)
;	- RS:0 RW:0 0b NF** (0x8) - Lines,Font (N 0=1L 1=2L , F 0=5x8Dot)
;
;	- wait >37us
;
;	- RS:0 RW:0 0b 0000 (0x0) - DisplaySet
;	- RS:0 RW:0 0b 1DCB (0xC) - Display,Cursor,Blink (0=Off / 1=On)
;
;	- wait >37us
;
;	- RS:0 RW:0 0b 0000 (0x0) - Clear Display
;	- RS:0 RW:0 0b 0001 (0x1)
;
;	- wait >1,52ms
;
;	- RS:0 RW:0 0b 0000 (0x0) - EntryMode
;	- RS:0 RW:0 0b 01IS (0x6) - Inc/Dec,Shift (I 1=inc , S 0=NoShift)
;
ist da raus .. Analyzer für I2C/TWI und 1-Wire/microLAN - #22

Der Controller ist HD44780 kompatibel. Manche Displays sind zickig und benötigen das 0x3 am Anfang 3x (also 3x diese 4Bit übertragen)

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)