Forum: Mikrocontroller und Digitale Elektronik 8051, lcd anzeige verschiebt sich


von Helge K. (kind_nr_5)


Lesenswert?

heyho,

Ich hab mich grade erst in dem forum angemeldet, kann sein das ich in 
der falschen abteilung bin. Wenn ja wäre es schön wen man mir das 
mitteilt.

Also ich benutze ein 8051 controller und ein LCD-Display LTN 214 R-10. 
Das display ist an P0 angeschlossen. Das ganze ist auf so einer Art 
Test-board wo alles mögliche noch dran angeschlossen ist. Das hab ich so 
von meinem Lehrer in die Hand gedrückt bekommen.
Zum hex-datei erstellen benutz ich keil und zum draufspielen 8051win.
Falls sont noch wichtige Informationen fehlen bitte fragen.

Ich muss für die Schule eine Art Fahrahdcomputer erstellen. Ich hab bis 
jetzt eine Art Grundgerüst geschrieben und mich dann an der LCD-Anzeige 
versucht. Dazu hab ich eine Datei mit Unterprogrammen bekommen die mein 
Lehrer geschrieben hat:
1
;***** Vor der Verwendung initialisieren mit lcall initLCD   **************
2
;***** veränderte Register: r2 bis r7 der Registerbank 1              *****
3
;***** daher Stack hinter den Bitadressierbaren Bereich: mov sp,#2fh  *****
4
;***** Übergaberegister ist der Akku                         **************
5
6
;include reg_51.pdf  ;Registeradressen einbinden
7
  
8
LCD_ROUTINES  SEGMENT  CODE  ;Name für das folgende relative Codesegment
9
10
  RSEG  LCD_ROUTINES     ;relatives Segment, wird vom Linker hinter anderes Codesegment gehängt  
11
12
LCD_PORT EQU P0 ; *** Hier den verwendeten Port einsetzen !!!!!!!!!!!! ****
13
14
public initLCD,loeschzeile1,loeschzeile2,textzeile1,textzeile2,cursorpos,textaus,zifferaus, hexaus, dezaus, loeschen
15
16
17
;----   Verwendung der Hilfsprogramme: ------------------------------------
18
;  lcall  initLCD    ;Initialiserung des LCD-Displays
19
;  lcall  loeschen  ;gesamtes Diplay löschen
20
;  lcall  loeschzeile1  ;nur Zeile 1 des Displays löschen
21
;  lcall  loeschzeile2  ;nur Zeile 2 des Displays löschen
22
23
;***  Die 16 Zeichen belegen die Display-Adressen 00h-0Fh (Zeile1) und 40h-4Fh (Zeile2)
24
;  mov  a,#03    ;Cursor auf die 4. Anzeigestelle setzen
25
;  lcall  cursorpos
26
27
;***  Textausgaben ************* die Anfangsadresse des Textes muß ***********
28
;***  im DPTR stehen und der Text muß mit einer 0 abgeschlossen werden!  *****
29
;  mov  dptr,#Text1  ;Text ab der
30
;  lcall  textaus    ;aktuellen Cursorposition ausgeben
31
;  mov  dptr,#Text1  ;Text ab der 1.Stelle
32
;  lcall  textzeile1  ;in Zeile 1 ausgeben
33
;  mov  dptr,#Text1  ;Text ab der 1.Stelle
34
;  lcall  textzeile2  ;in Zeile 2 ausgeben
35
;Text1:  db 'Hallo! Test...',0  ;Angabe des auszugebenden Textes am Programmende
36
37
;***  Zahlenausgaben: Übergaberegister ist der Akku *******************************************
38
;  mov  a,p1    ;Ausgabe des Portinhalts von P1
39
;  lcall  zifferaus  ;mit nur einer Ziffer (Lownibbel) an das Display
40
;  mov  a,p1    ;Ausgabe des Portinhalts von P1 als 2-stellige Hexzahl 
41
;  lcall  hexaus    ;Es werden immer 2 Stellen mit führenden Nullen ausgegeben
42
;  mov  a,p1    ;Ausgabe des Portinhalts von P1 als 3-stellige Dezimalzahl     
43
;  lcall  dezaus    ;Es werden immer 3 Stellen ausgegeben, führende Nullen sind dunkel
44
;  mov  a,p1    ;Ausgabe des Portinhalts von P1 als 8-Bit-Dualzahl
45
;  lcall  dualaus    ;Es werden immer 8 Stellen ausgegeben mit führenden Nullen
46
;  mov  a,p1    ;Ausgabe des Portinhalts von P1 als 8-Bit-Dualzahl
47
;  lcall  dualaus1  ;rechtsbündig in Zeile1
48
;  mov  a,p1    ;Ausgabe des Portinhalts von P1 als 8-Bit-Dualzahl
49
;  lcall  dualaus2  ;rechtsbündig in Zeile2
50
51
;***  Anwendungsbeispiele siehe Datei LCDTEST.asm *******************************  
52
53
54
55
;****** Definitionen / Abkürzungen ************************************************
56
  reg2  EQU  0Ah  ;Register der Bank1
57
  reg3  EQU  0Bh
58
  reg4  EQU  0Ch
59
  reg5  EQU  0Dh
60
  reg6  EQU  0Eh
61
  reg7  EQU  0Fh
62
63
; **************** Display initialisieren ****************
64
;
65
; Display arbeitet im 2*4-Bit Modus
66
; 
67
; Die 16 Zeichen belegen die Display-Adressen 00-0F und 40-4F (HEX!)
68
;
69
; Bit:    7       6       5       4       3       2      1      0
70
;      Register  Read/    0      Takt   D7/D3   D6/D2  D5/D1  D4/D0
71
;      Select    Write
72
73
initLCD:  mov   LCD_PORT,#00010011b     ;aufwecken! Takt=1
74
    mov   LCD_PORT,#00000011b  ;           Takt=0
75
76
    mov   reg5,#10            ; ca. 5 msec warten     
77
w0:         djnz   reg4,w0
78
    djnz   reg5,w0
79
80
    mov   LCD_PORT,#00010011b    ;aufwecken! Takt=1
81
    mov   LCD_PORT,#00000011b  ;           Takt=0
82
w2:    djnz   reg5,w2             ; wartet 100 usec
83
84
    mov   LCD_PORT,#00010011b     ;aufwecken! Takt=1
85
    mov   LCD_PORT,#00000011b  ;           Takt=0
86
w3:    djnz   reg5,w3      ; wartet 100 usec
87
88
    mov   LCD_PORT,#00010010b     ;8->4  BITS UMSCHALTEN, Takt=1
89
    mov   LCD_PORT,#00000010b  ;                       Takt=0
90
w4:    djnz   reg5,w4
91
    
92
    mov   A,#00101000b      ;Function set 4 bits  
93
    lcall   LCDbefehl    ;Ausgabe im 4Bit-Modus
94
    
95
    mov   A,#00001100b      ; Display AN, Cursor AUS
96
    lcall   LCDbefehl    ;des Zeichens an der Cursorposition
97
98
    mov   A,#00000110b      ; Not Shifted Display, Increment
99
    lcall   LCDbefehl
100
    ret
101
102
;*********** Loeschen Display *****************************************
103
loeschen:  mov   A,#00000001b      ;Display clear
104
    lcall   LCDbefehl
105
    ret  
106
;*********** Cursor AN ************************************************
107
cursorAN:  mov   A,#00001110b    ;Cursor und Display AN
108
    lcall   LCDbefehl
109
    ret
110
;*********** Cursor AUS ***********************************************
111
cursorAUS:  mov   A,#00001100b    ;Cursor AUS, Display AN
112
    lcall   LCDbefehl
113
    ret
114
115
;*********** Cursorposition *******************************************
116
cursorpos:    orl   a,#10000000b    ;Kennung für DD RAM address set
117
    lcall   LCDbefehl
118
    ret
119
;*********** Cursorhome ***********************************************
120
cursorhome:  mov   A,#00000010b    ;Cursor home
121
    lcall   LCDbefehl
122
    ret
123
      
124
;*********** Zeile 1 löschen ******************************************
125
loeschzeile1:  mov   A,#00000010b    ;Cursor home
126
    lcall   LCDbefehl
127
    mov   dptr,#textloesch
128
    lcall   textzeile1
129
    mov   A,#00000010b    ;Cursor home
130
    lcall   LCDbefehl
131
    ret
132
textloesch:  DB '                ',0        
133
134
;*********** Zeile 2 löschen ******************************************
135
loeschzeile2:  mov   a,#40h
136
    lcall   cursorpos    ;Cursor auf Position 1.Stelle/2.Zeile
137
    mov   dptr,#textloesch
138
    lcall   textzeile2
139
    mov   a,#40h
140
    lcall   cursorpos    ;Cursor auf Position 1.Stelle/2.Zeile
141
    ret
142
    
143
;*********** Text an Zeile 1 ausgeben *********************************
144
textzeile1:  mov   A,#00000010b    ;Cursor home
145
      lcall   LCDbefehl
146
textaus:  mov   reg4,#0      ;0 ins r4 => Buchstabe 0
147
textloop:    mov   A,reg4      ;Nr des Buchstabens in den Akku
148
      inc   reg4
149
      cjne   a,#10h,holbuchst  ;schon Maximalzahl an Buchstaben?
150
      sjmp   textende    ;für eine Zeile => ja => Ende
151
holbuchst:  movc   A,@A+DPTR    ;Text Buchstabenweise holen
152
      jz     textende    ;falls 0 => Ende, sonst ausgeben
153
ausgeben:  lcall   LCDtext
154
      sjmp   textloop
155
textende:    ret
156
157
;*********** Text an Zeile 2 ausgeben *********************************
158
textzeile2:  mov   a,#40h
159
    lcall   cursorpos    ;Cursor auf 1.Stelle/2.Zeile
160
    sjmp   textaus
161
162
;********* Textaus (Text ab momentaner Cursorposition ausgeben **********
163
;textaus:  mov   a,#0
164
;    movc   a,@a+dptr    ;Text zeichenweise holen
165
;    jz   textend      ;Ende wenn Ordnungszahl des zeichens=0
166
;    lcall   LCDtext
167
;    inc   dptr      ;nächstes zeichen
168
;    sjmp   textaus
169
;textend:  ret
170
171
;********* Befehl fr LCD-Display im Akku ausgeben an LCD_PORT **************
172
;*************** RS  R/W  D7  D6  D5  D4  D3  D2  D1  D0
173
;*************** 0    0   x   x   x   x   x   x   x   x
174
LCDbefehl:  push   ACC
175
    swap   a      ;High- und Low-Nibbel tauschen
176
    anl   A,#00001111b    ;4 Bits maskieren
177
    orl   A,#00010000b    ;Übergabetakt = 1, High-Nibbel senden
178
    mov   LCD_PORT,A
179
    anl   A,#00001111b    ;Takt = 0
180
    mov   LCD_PORT,A
181
    pop   ACC
182
    anl   A,#00001111b    ;Low-Nibble
183
    orl   A,#00010000b    ;Takt = 1
184
    mov   LCD_PORT,A
185
    anl   A,#00001111b    ;Takt = 0
186
    mov   LCD_PORT,A
187
    sjmp   wbusy      ;warten bis Bearbeitung beendet
188
189
;********* Text fr LCD-Display im Akku ausgeben an LCD_PORT **************
190
;*************** RS  R/W  D7  D6  D5  D4  D3  D2  D1  D0
191
;*************** 1    0   x   x   x   x   x   x   x   x
192
LCDtext:push   ACC
193
    swap   a      ;Nibbel vertauschen
194
    anl   A,#00001111b    ;4 Bits maskieren
195
    orl   A,#10010000b    ;Übergabetakt = 1, RS = 1 (Befehl!)
196
    mov   LCD_PORT,A
197
    anl   A,#10001111b    ;Takt = 0
198
    mov   LCD_PORT,A
199
    pop   ACC
200
    anl   A,#00001111b    ;Low-Nibble
201
    orl   A,#10010000b    ;Takt = 1, RS = 1
202
    mov   LCD_PORT,A
203
    anl   A,#10001111b    ;Takt = 0
204
    mov  LCD_PORT,A
205
  ;************** warten bis Bearbeitung im Display beendet **********
206
wbusy:    mov   LCD_PORT,#01011111b    ; Busy lesen, Takt=1, RS = 0
207
    mov   A,LCD_PORT              ; und holen
208
    mov   LCD_PORT,#01001111b     ;             Takt=0
209
    nop
210
    mov   LCD_PORT,#01011111b     ; Low-Byte holen (ohne Bedeutung)
211
    mov   LCD_PORT,#01001111b
212
213
    mov   reg2,50                  ;Zeitverzögerung 1ms
214
warteR2:  mov   reg3,#10                 ;statt auf busy warten
215
warteR3:  djnz   reg3,warteR3            ;wenn LCD an p0
216
    djnz   reg2,warteR2    
217
  
218
;    jb   ACC.3,wbusy       ; Busy? warten , geht nicht mit LCD an p0
219
    ret 
220
221
;*********************** dezaus *********************************************
222
;+++++++++ Die Zahl im Akku wird als Dezimalzahl ausgegeben +++++++++++++++++
223
;--------- Es werden immer 3 Stellen ausgegeben, führende Nullen sind dunkel 
224
dezaus:    
225
  push  acc
226
  mov   b,#100          ;der in A stehende Wert wird durch 100
227
  div   ab          ;geteilt und die Hunderter-Ziffer in
228
  mov   reg7,a          ;r7 gegeben
229
  mov   a,b          ;die verbleibende Zehnerzahl
230
  mov   b,#10          ;wird durch 10
231
  div   ab          ;geteilt
232
  swap   a          ;Die Zehnerziffer wird das High-Nibbel,
233
  add   a,b          ;die Einerziffer das Low-Nibbel
234
  mov   reg5,a          ;diese BCD-Zahl wird in r5 gespeichert        
235
  mov   a,reg7            ;die vorderste BCD-Ziffer
236
  mov   reg4,a    ;wird in r4 gesichert und
237
  jnz   ausg1    ;wird normal ausgegeben, falls sie nicht 0 ist
238
  mov   a,#31    ;leere Anzeige
239
  lcall   lcdtext    ;falls null
240
  sjmp   Ziff2
241
ausg1:  lcall sendascii    ;1.Ziffer ausgeben
242
Ziff2:  mov a,reg5     ;2. u. 3. Ziffer zurückholen
243
hex0:   mov reg7,a     ;zwischenspeichern in r7
244
  anl a,#0f0h    ;High-Nibbel maskieren
245
  swap a      ;und zur Ziffer im Low-Nibbel machen
246
  jnz ausg2    ;wird normal ausgegeben, falls sie nicht 0 ist
247
  cjne a,reg4,ausg2  ;nur 0 unterdrücken falls 1.Ziffer auch 0 war
248
  mov a,#31    ;leere Anzeige
249
  lcall lcdtext    ;falls null
250
  sjmp Ziff3
251
ausg2:  lcall sendascii    ;2.Ziffer ausgeben
252
Ziff3:  mov a,reg7    ;Zwischengespeicherte Zahl zurck
253
  anl a,#0fh    ;Low-Nibbel ausblenden
254
  lcall sendascii    ;und ausgeben
255
dezend:  pop acc
256
  ret
257
258
;*********************** hexaus *****************************************
259
;+++++++++ Die Zahl im Akku wird hexadezimal ausgegeben +++++++++++++++++
260
;--------- Es werden immer 2 Stellen mit führenden Nullen ausgegeben ---- 
261
hexaus:  push acc
262
  mov   reg7,a    ;zwischenspeichern in r7
263
  anl   a,#0f0h    ;High-Nibbel maskieren
264
  swap   a    ;und zur Ziffer im Low-Nibbel machen
265
;  cjne   a,#0,ausg2Z  ;zur Unterdrückung der führenden Null   
266
;  mov   a,#20    ;leere Anzeige
267
;  lcall   lcdtext    ;       
268
;  sjmp   weit2    ;
269
ausg2Z:  lcall   sendascii        ;
270
weit2:  mov   a,reg7    ;Zwischengespeicherte Zahl zurck
271
  anl   a,#0fh    ;Low-Nibbel ausblenden
272
  lcall   sendascii  ;und ausgeben
273
  pop   acc
274
  ret
275
276
;****************** dualaus (Zahl im Akku als 8-Bit-Dualzahl ausgeben) ********
277
dualaus:
278
  push  acc
279
  mov  reg5,#8    ;Zähler
280
dloop:  mov  reg7,a    ;Zahl zwischenspeichern
281
  jb  acc.7,d1  ;Sprung zur "1"-Ausgabe wenn Bit=1
282
  mov  a,#0    ;Null ausgeben
283
  lcall  sendascii  ;
284
  sjmp  d2    ;
285
d1:  mov  a,#1    ;Eins ausgeben
286
  lcall  sendascii  ;
287
d2:  mov  a,reg7    ;zwischengespeicherte Zahl zurück
288
  rl  a    ;nächstes Bit
289
  djnz  reg5,dloop  ;von vorne falls noch nicht alle 8 Bit
290
  pop  acc
291
  ret
292
293
;***************** Duale Ausgabe rechtsbündig in Zeile 1 *********************
294
dualaus1:
295
  push  acc
296
  mov  a,#08
297
  lcall  cursorpos
298
  pop  acc
299
  lcall  dualaus
300
  ret
301
;***************** Duale Ausgabe rechtsbündig in Zeile 2 *********************
302
dualaus2:
303
  push  acc
304
  mov  a,#48
305
  lcall  cursorpos
306
  pop  acc
307
  lcall  dualaus
308
  ret
309
310
;************** sendascii (1 Hexziffer als Ascii-Zeichen senden) *********
311
sendascii: 
312
  mov   reg6,a
313
  subb   a,#0Ah
314
  mov   a,reg6
315
  jc   zahl
316
Buchst:  add   a,#37h
317
  sjmp   weit1
318
zahl:  clr   c             ;Carry zurcksetzen, sonst Fehler bei add
319
  add   a,#30h
320
weit1:  lcall   LCDtext
321
  ret
322
323
;*************** zifferaus (eine Ziffer 0 bis 9 ausgeben *****************
324
zifferaus: 
325
  push   acc
326
  anl   a,#0Fh
327
  lcall   sendascii                      
328
  pop   acc
329
  ret
330
331
;****** PIN-Belegung für LCD-Display LTN 214 R-10 am LCD_PORT **************
332
; * Uebertragung eines Bytes als 2 * 4 Bits.
333
; * Ansicht von oben auf Display
334
; * 1 GND--------------------------------------------------> GND
335
; * 2 +5Volt-----------------------------------------------> +5V
336
; * 3 V0: Steuerspannung Kontrast 0..5 Volt erlaubt,-------> V0 
337
; *       Arbeitspunkt ca. 0.6 V (am besten Spindeltrimmer zum Einst.)
338
; * 4 RS: Registersatz (Display oder Befehl)---------------> LCD_PORT.7
339
; * 5 R/W: Schreiben oder lesen----------------------------> LCD_PORT.6
340
; * 6 E: Uebergabetakt-------------------------------------> LCD_PORT.4
341
; * 7-10: frei (eigentlich D0 - D3, wird aber nicht verwendet)
342
; * 11: D4/D0----------------------------------------------> LCD_PORT.0
343
; * 12: D5/D1----------------------------------------------> LCD_PORT.1
344
; * 13: D6/D2----------------------------------------------> LCD_PORT.2
345
; * 14: D7/D3----------------------------------------------> LCD_PORT.3
346
; *******************************************************
347
348
END

Dieses hab ich geschrieben:
1
;-------------------------------------------------------------------------------------------------------------
2
;----------------------------- Projekt Fahradcomputer von Helge und Yannik -----------------------------------
3
;-------------------------------------------------------------------------------------------------------------
4
5
6
7
8
9
EXTRN Code (initLCD,loeschzeile1,loeschzeile2,textzeile1,textzeile2,cursorpos,textaus,zifferaus,hexaus,dezaus,loeschen,charaus)
10
11
12
13
14
;-------------------------------------------------------------------------------------------------------------
15
;--------- Definitionen --------------------------------------------------------------------------------------
16
  re0          EQU    r0
17
  re1          EQU    r1   
18
  modus        EQU    r2    ;Anzeigemodus (0 = Geschwindigkeit, 1 =  Durchschnittsgeschwindigkeit,
19
                    ;        2 = Tageskilometer, 3 = Tagesfahrzeit)
20
  timerzaehler0    EQU    r3    ;Timer-Zähler (in 10 ms)  für radumdrehung
21
  timerspeicher    EQU    r4    ;Timer-Speicher (in 10 ms)
22
  geschwindigkeit    EQU    r5    ;momentane Geschwindigkeit (in KM/h)
23
  durchschnitt    EQU    r6    ;durchschnittliche Geschwindigkeit (in KM/h)
24
  fahrzeit0      EQU    r7    ;Tagesfahrzeit (in s)
25
  fahrzeit1      EQU    10h    
26
  streckenk      EQU    11h    ;Tagesstrecke (in m)
27
  strecke0      EQU    12h
28
  strecke1      EQU    13h
29
  strecke2      EQU    14h
30
  timerzaehler1    EQU    15h    ;Timer-Zähler (in 10 ms) für Tagesfahrzeit
31
  re14        EQU    16h
32
  re15        EQU    17h  
33
;-------------------------------------------------------------------------------------------------------------
34
35
36
37
    cseg at 0
38
    jmp   init
39
40
41
42
43
44
45
46
47
48
49
;-------------------------------------------------------------------------------------------------------------
50
;--------- Interrupt Aufrufe ---------------------------------------------------------------------------------
51
    org    0x0003
52
    call  intrad
53
    reti  
54
55
    org    0x000b
56
    call  inttimer
57
    reti
58
59
    org    0x0013
60
    call  intknopf
61
    reti
62
;-------------------------------------------------------------------------------------------------------------
63
64
65
66
;-------------------------------------------------------------------------------------------------------------
67
;--------- Interrut Rad --------------------------------------------------------------------------------------
68
intrad:    ;mov    a,04h
69
      ;lcall  cursorpos
70
      ;mov    a,modus
71
      ;lcall  dezaus  
72
      
73
      ret
74
;-------------------------------------------------------------------------------------------------------------
75
76
77
;-------------------------------------------------------------------------------------------------------------
78
;--------- Interrupt Knopf -----------------------------------------------------------------------------------
79
intknopf:  inc    modus
80
      cjne  modus,#4d,endeknopf  
81
      mov    modus,#0d
82
endeknopf:  ret
83
;-------------------------------------------------------------------------------------------------------------
84
85
  
86
;-------------------------------------------------------------------------------------------------------------
87
;--------- Interrupt Timer -----------------------------------------------------------------------------------
88
inttimer:  mov   TL0,#0xF0    
89
      mov   TH0,#0xD8
90
91
      inc    timerzaehler0
92
      inc    timerzaehler1
93
      push  acc
94
      mov    a,timerzaehler1        ;nach 1 sec fahrzeit erhöhen
95
      cjne  a,#100,endtimer  
96
      mov    timerzaehler1,00h
97
      clr    cy
98
      inc    fahrzeit0
99
      jnc    endtimer
100
      inc    fahrzeit1           ;falls fahrzeit0 voll dann fahrzeit1 erhöhen
101
endtimer:   pop    acc
102
      ret
103
;-------------------------------------------------------------------------------------------------------------
104
105
106
107
108
109
110
111
112
113
114
;-------------------------------------------------------------------------------------------------------------
115
;--------- Intitialisierung ----------------------------------------------------------------------------------
116
init:    mov    sp,18h      ;Stack aus benutzten Registern raus
117
    
118
      lcall  initlcd      ;Display initialisieren
119
      lcall   loeschzeile1
120
      lcall   loeschzeile2
121
  
122
      setb   et0        ;timer initialisieren
123
      mov   TMOD,#00000001b  
124
      mov   TL0,#0xF0    
125
      mov   TH0,#0xD8
126
      mov   TCON,#00010000b  
127
      
128
      setb   IT0        ;externer Interrupt 0 (Rad) initialisieren
129
      clr    IE0
130
      setb   EX0    
131
132
      setb   IT1        ;externer Interrupt 1 (Knopf) initialisieren
133
      clr    IE1
134
      setb   EX1
135
           
136
      mov    re0,#00h    ;alle Register initialiesieren  
137
      mov    re1,#00h          
138
      mov    modus,#00h
139
      mov    timerzaehler0,#00h
140
      mov    timerspeicher,#00h
141
      mov    geschwindigkeit,#00h
142
      mov    durchschnitt,#00h
143
      mov    fahrzeit0,#00h
144
      mov    fahrzeit1,#00h
145
      mov    streckenk,#00h
146
      mov    strecke0,#00h
147
      mov    strecke1,#00h
148
      mov    strecke2,#00h
149
      mov    timerzaehler1,#00h
150
      mov    re14,#00h
151
      mov    re15,#00h
152
      
153
      setb  ea        ;alle Interrupts freigeben        
154
;-------------------------------------------------------------------------------------------------------------
155
156
157
158
159
160
161
162
163
164
165
;-------------------------------------------------------------------------------------------------------------
166
;--------- Hauptschleife -------------------------------------------------------------------------------------
167
main:  lcall   loeschzeile1
168
    lcall   loeschzeile2
169
170
    mov     dptr,#textm0
171
    lcall   textzeile1
172
    mov    re1,00h
173
    lcall   wait
174
    jmp    main
175
176
;-------------------------------------------------------------------------------------------------------------
177
178
179
180
181
182
183
184
185
186
;-------------------------------------------------------------------------------------------------------------
187
;--------- Texte ---------------------------------------------------------------------------------------------
188
textm0:  db  'Geschwindigkeit:',0  
189
textm1:  db  'Durchschnitt:   ',0
190
textm2:  db  'Tageskilometer: ',0
191
textm3:  db  'Tagesfahrzeit:  ',0
192
193
;-------------------------------------------------------------------------------------------------------------
194
195
196
197
198
199
200
201
202
;-------------------------------------------------------------------------------------------------------------
203
;--------- wait ----------------------------------------------------------------------------------------------
204
wait:    mov    re15, #30              
205
wait2:    mov    re14, #10
206
wait1:    mov    re1,  #10
207
wait0:    djnz  re1, wait0      
208
      djnz  re14, wait1
209
      djnz  re15, wait2
210
      djnz  re0, wait  
211
      ret 
212
;-------------------------------------------------------------------------------------------------------------
213
end

Das wollte ich erreichen:
In der ersten Zeile des LCD wird "Geschwindigkeit:" ausgegeben

Das passiert:
es wir mal "Geschwindigkeit" mal "eschwindigkeit" mal "schwindigkeit" 
mal "windigkeit" und so weiter ausgegeben.


wäre echt cool wenn sich irgendjemand die mühe machen würde mir zu 
helfen, ich sitz schon seit über 1,5 tagen davor und komm kein 
millimeter weiter =(

LG Helge

: Verschoben durch Admin
von holger (Gast)


Lesenswert?

Füge hinter dieser Stelle

    mov   A,#00000110b      ; Not Shifted Display, Increment
    lcall   LCDbefehl

mal ein

    mov   A,#00010100b
    lcall   LCDbefehl

an.

von Helge K. (kind_nr_5)


Lesenswert?

danke für die antwort, es ändert sich leider nichts =(

von holger (Gast)


Lesenswert?

>danke für die antwort, es ändert sich leider nichts =(

Dann stimmt evtl. was mit dem LCD Timing nicht.

von Helge K. (kind_nr_5)


Lesenswert?

okay, wie finde ich raus, wie das timing sein muss?

edit: kann eigentlich fast nicht sein, da wenn ich statt meinem 
hauptprogramm das testprogramm von meinem lehrer einbinde tuts und das 
arbeitet ja mit den gleichen operationen.

testprogramm:
1
;lcdtest.a51****************************************************************************
2
;******** Testprogramm: Aufwärtszähler sichtbar an 8LEDs und als Hexziffer im LC-Display
3
;***************************************************************************************
4
; lcd8252.a51 verwenden
5
6
EXTRN Code (initLCD,loeschzeile1,loeschzeile2,textzeile1,textzeile2,cursorpos,textaus,zifferaus,hexaus,dezaus)
7
8
;******************** Deklarationen *******************************************
9
  LCDPosHex  EQU 0Eh    ;Position der Hex-Zahl im Display
10
  LCDPosDez  EQU 4Dh    ;Position der Dez-Zahl im Display
11
  LEDs    EQU p2    ;LEDs an P2
12
  
13
;******************** Programm ************************************************
14
          cseg at 0
15
    ljmp   go      ;Das eigentliche Programm beginnt hinter
16
            ;den Interrupt-Einsprung-Adressen
17
18
;*********** Interrupt-Service-Routine ********************************************
19
    org 000Bh      ;Interrupt-Einsprung
20
ISRtimer0:   
21
    mov  R0, DPL
22
    mov  R4, DPH
23
    inc  R2              ;Inhalt Port2 um 1 erhöhen
24
    cjne  R2, #3, next
25
    mov  R2, #0    
26
27
    mov  A, R3
28
    rl  A
29
    mov  LEDs, A
30
    mov  R3, A
31
    
32
next:    reti
33
34
;******* Initialisierung **********************************************************
35
go:    mov   TMOD,#00000001b  ;Timer in Modus 1, Timer-Betrieb, 16Bit-Zähler
36
    mov   TL0,#0x00    ;Anfangswert Zählregister=> 65536-10000 = 55536 = D8F0h
37
    mov   TH0,#0x00    ;D8F0 ist Nachladewert für 10000µs Zählzeit
38
    mov   TCON,#00010000b  ;Timer-Run-Bit Timer0 setzen => Timer0 starten
39
    mov   IP,#0      ;alle Interrupts haben gleiche Priorität
40
    setb   EA      ;Interrupts freigeben (IEN0.7)
41
    setb   ET0      ;Enable Timer0 Interrupt (IEN0.1)
42
    
43
    mov     sp,#2fh    ;Stackpointer oberhalb Bitadressierbarer Bereich
44
    lcall  initlcd    ;Display initialisieren
45
  
46
    mov  R2,#0    ;Interruptzähler auf null setzen
47
    mov  R3,#1
48
    mov  LEDs, #0x00
49
    mov  DPTR, #seg7code
50
51
;******** Hauptprogramm  ***********************************************************
52
53
  
54
  
55
start:  lcall   loeschzeile1
56
  lcall   loeschzeile2
57
58
  mov   dptr,#Text1
59
  lcall   textzeile1
60
  mov  R1, 0
61
  lcall   Zeit
62
  
63
  mov   dptr,#Text2
64
  lcall   textzeile2
65
  mov  R1, 0
66
  lcall   Zeit
67
68
  lcall   loeschzeile1
69
  lcall   loeschzeile2
70
71
  mov   dptr,#Text3
72
  lcall   textzeile1
73
  mov  R1, 0
74
  lcall   Zeit
75
76
  mov   dptr,#Text4
77
  lcall   textzeile2
78
  mov  R1, 0
79
  lcall   Zeit
80
81
  jmp   start
82
83
84
;********** Zeitverzögerung **************************************************************************
85
; R1 als Übergabe-Schleifenzähler
86
  
87
Zeit:    mov  R7, #30              ;ca. 0.5s
88
Zeit2:    mov  R6, #10
89
Zeit1:    mov  R5, #10
90
Zeit0:    djnz  R5, Zeit0      
91
      djnz  R6, Zeit1
92
      djnz  R7, Zeit2
93
      djnz  R1, Zeit  
94
      ret 
95
96
97
;************************ Texte *******************************************************
98
Text1:  db '   Herzlich ',0
99
Text2:  db '  Willkommen!',0
100
Text3:  db ' Technisches',0
101
Text4:  db '  Gymnasium',0
102
103
104
seg7code:  
105
  db 0x04
106
  db 0x08
107
  db 0x40
108
  db 0x20
109
  db 0x10
110
  db 0x02
111
112
END

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
Noch kein Account? Hier anmelden.