Hallo! Ich weiß es gibt für dieses Thema schon einige Eintragungen, aber ich bin Anfänger und hab noch nie ein LCD angesteuert. Ich würde gerne ein 8*2, HD44780 komatibles LCD über Assembler ansprech. (Das Datenblatt zu meinem LCD ist im Anhang) Wie beginn ich damit? Hätte jemand Tipps für mich? Danke mfg a.R.
Puh, schon lange her aber ich habs noch :-)
1 | ;Display Treiber für Hitachi Module |
2 | |
3 | ;Datenbus ist an Port 1 angeschlossen, Steuersignale: RW=P3.5/RS=P3.6/EN=P3.7 |
4 | |
5 | |
6 | org 0000h ;jmp above interrupts |
7 | ljmp Start ; |
8 | |
9 | org 0100h ; |
10 | start: call delay_1 ;wait 15 mSec. |
11 | |
12 | ;Display_Init |
13 | |
14 | mov R1,#04h ;4x38h |
15 | Instruction_Data: mov a,#38h ;Set Data Bus to 8 Bit |
16 | call Enable ;entry mode inc. + shift |
17 | call wait ;wait 4.1 mSec. |
18 | djnz R1,Instruction_Data ;loop |
19 | mov a,#0Ch ;cursor off/on = 0Ch/0Eh |
20 | call enable ; |
21 | call clear_display ; |
22 | call cursor_home ; |
23 | |
24 | ;main programm |
25 | |
26 | prog_main: mov r3,#0FFh ;dptr Textausgabe Reset |
27 | mov dptr,#Melde_text ;Titelzeile |
28 | call Textausgabe ; |
29 | mov r4,#80h ;wait für Titelzeile |
30 | wait_2: call delay_1 ; |
31 | djnz r4,wait_2 ; |
32 | mov r3,#0FFh ;dptr Textausgabe Reset |
33 | |
34 | mov dptr,#Display_info ; |
35 | call Textausgabe ; |
36 | mov r4,#80h ; |
37 | wait_display: call delay_1 ; |
38 | djnz r4,wait_display ; |
39 | mov r3,#0FFh ; |
40 | ljmp prog_main ; |
41 | |
42 | ;text aus tabelle lesen und auf display schreiben |
43 | |
44 | textausgabe: clr ea ;no interr. while writing |
45 | mov a,#80h ;cursor home position |
46 | call enable ; |
47 | loop_text: inc r3 ; |
48 | mov a,r3 ; |
49 | movc a,@a+dptr ;Tabelle in Akku laden |
50 | cjne a,#24h,Ausgabe_Text ;a<>24h => Ausgabe Text |
51 | ret ;a=24h => Textausgabe Ende |
52 | Ausgabe_Text: call enable_data ;Text auf Display ausgeben |
53 | sjmp loop_text ;loop Textausgabe |
54 | |
55 | ;Enable Routine für Display Steuerbefehle |
56 | |
57 | Enable: clr p3.5 ;rw = 0 |
58 | clr p3.6 ;rs = 0 |
59 | clr p3.7 ;en = 0 |
60 | setb p3.7 ;enable = 1 |
61 | mov p1,a ;write instruction |
62 | clr p3.7 ;enable = 0 |
63 | call delay ;exec. time for displ.42uS |
64 | setb p3.6 ;rs = 1 |
65 | ret ; |
66 | |
67 | ;Enable Routine für Display Daten Senden |
68 | |
69 | Enable_Data: setb p3.7 ;en = 1 |
70 | setb p3.6 ;rs = 1 |
71 | mov p1,a ;write data |
72 | clr p3.7 ;enable = 0 |
73 | call delay ;exec. time for displ.42uS |
74 | ret ; |
75 | |
76 | ;warteschleifen für steuerbefehle |
77 | |
78 | Wait: mov r2,#05h ;Basis Clock 8051 6 MHz |
79 | loop_1: mov r0,#0CDh ;Timing Init 3 cycles |
80 | djnz r0,$ ;Interval 4.1 mS |
81 | djnz r2,loop_1 ; |
82 | ret ; |
83 | |
84 | Delay: mov r0,#0Ch ;delay next.. instruction |
85 | djnz r0,$ ;42uSec. |
86 | ret ; |
87 | |
88 | delay_1: mov r2,#0Fh ;Delay 15 mSec. |
89 | loop_2: mov r0,#0FFh ;after Power on |
90 | djnz r0,$ ; |
91 | djnz r2,loop_2 ; |
92 | ret |
93 | |
94 | ;display steuerbefehle |
95 | |
96 | cursor_home: mov a,#02h ;cursor home |
97 | call Enable ; |
98 | call wait ; |
99 | ret ; |
100 | |
101 | clear_display: mov a,#01h ;clear display |
102 | call Enable ; |
103 | call wait ; |
104 | ret ; |
105 | |
106 | Melde_text: DB 'Soft. & Hardware' |
107 | DB ' ' |
108 | DB '* --------- *' |
109 | DB ' ',24h |
110 | |
111 | Display_info: DB '* --------- *' |
112 | DB ' ' |
113 | DB 'x51 based Micros' |
114 | DB ' ',24h |
115 | |
116 | End |
Hallo Ist es umbediengt notwendig(, oder besser) die busy-flag abzufragen? Den ich hab die RW-Leitung meines LCDs auf Masse gelegt, da ich dachte dass ich eh nur etwas ausschreibe.
Das Lesen des Busy-Flags macht die Ansteuerung schneller und sicherer. Man kann meist ohne arbeiten, wenn man lange genug wartet - diese Displays sind im Vergleich zum Mikrocontroller sehr langsam. Übrigens: Auch der Beispielcode von dieser englischsprachigen Seite funktioniert sehr gut: http://www.8052.com/tutlcd
Busy Flag brauchst du nicht aber dein Timing muß stimmen. Welchen 8x51 Typ hast du in Verwendung ? Ist zwar schon ne Weile her das ich 8x51 in Assembler programmiert habe aber die Routine funktioniert und ist minimalistisch. Sag wenns klemmt.
Für 8051 Assembler gibts von Erik Buchmann einen schönen Codegenerator, der kann auch Code für ein LCD erzeugen: http://www.ipd.uka.de/~buchmann/microcontroller/generator.htm
Hallo Bernd Ich hab keine Ahnung was mit Typ 8x51 gemeint ist. Bei LCDs kenn ich mich noch nicht so gut aus. Zu meinem LCD hab ich nur das Datenblatt dass ich an meinen ersten Eintrag angehängt hab! Hab nicht mehr gefunden.
Läufts denn schon ? >> Ich hab keine Ahnung was mit Typ 8x51 gemeint ist. Na welchen 8051 du verwendest z.B. AT89s8253/Atmel oder Silabs Typen etc. Es gibt hunderte davon.
Ich verwende einen Intel P8052AH-Basic Microcontroller. Nein es läuft noch nicht. Ich hab versuch das gepostete Programm für meine Verhältnisse umzuschreiben, aber da ist mir glaub ich ein Fehler unterlaufen.
Eine Zeichnung deines Systems inklusive Details (z.B. Quarzfrequenz) wäre sehr hilfreich ansonsten ist es nicht möglich dir zu helfen. Wie hast du das Programm abgeändert ?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.