PIC 16F628A und LCD

Gast #2744136
Lesenswert?
• ▲
▼
Hallo

Ich habe gerade ein Problem mit einem Display! Dieses hat den 
Standart-Treiber HD44780. Leider macht das Display keinen Wank!!
Der Code ist ca. nach sprut.de, wobei ich mit dem 8-Bit Interface 
arbeite.
Im mpasm SIM funktioniert es eigentlich wie gewünscht... Nur die 
Hardware wil halt nicht...
Fällt jemandem ein gröberer Fehler auf??
1
;    Notes:       
2
;  Pin Connections
3
;  RB0-RB7 Data Port
4
;  RA0    RS
5
;  RA1    R/W
6
;  RA2    E
7
;                                                   *
8
;                                                                     *
9
;**********************************************************************
10

11
    list      p=16F628A           
12
    #include <p16F628A.inc>      
13

14
    errorlevel  -302              ; suppress message 302 from list file
15

16
    __CONFIG   _CP_OFF & DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _XT_OSC
17

18
;**********************************************************************
19
; VARIABLE DEFINITIONS
20
;**********************************************************************
21

22
VAR             UDATA 0x22
23
loops      RES    1
24
loops1      RES    1
25
Temp            RES     1
26
Lcd_Data    RES    1
27
Lcd_Status    RES    1
28

29
;**********************************************************************
30
; EQU Befehle
31
;**********************************************************************
32
Lcd_RS      equ     RA0
33
Lcd_RW      equ     RA1
34
Lcd_E       equ     RA2
35
Lcd_Line  equ    PORTB
36
Lcd_Cont  equ    PORTA
37

38
;**********************************************************************
39
; MAIN PROGRAM
40
;**********************************************************************
41

42
MAIN_PROG     CODE
43

44
START
45
    bcf    STATUS, C
46
    clrf  PORTA
47
    clrf  PORTB
48
    call   IniReg
49
    call  IniLcd
50
      
51
    
52
    
53
Main        
54
    goto   Main  
55

56

57

58
;**********************************************************************
59
; SUBROUTINES
60
;**********************************************************************
61
;Zeitverzögerung um loops * 1 ms
62
; 4MHz externer Takt bedeutet 1MHz interner Takt
63
; also dauert 1 ms genau 1000 Befehle
64
; 110 Schleifen a 9 Befehle sind 990 Befehle = 0.99 ms
65
; die restlichen 10 Befehle für Einsprung und Rücksprung
66
Wait
67
top      movlw   .110           ; timing adjustment variable (1ms)
68
         movwf   loops1
69
top2     nop                    ; sit and wait
70
         nop
71
         nop
72
         nop
73
         nop
74
         nop
75
         decfsz  loops1, F      ; inner loops complete?
76
         goto    top2           ; no, go again
77
                                ;
78
         decfsz  loops, F      ; outer loops complete?
79
         goto    top            ; no, go again
80
         return               ; yes, return from subWAIT
81
;**********************************************************************
82
;Steuerbyte 8-bittig übertragen
83
Lcd_ContSend
84
    movwf  Lcd_Data
85
    call  LcdBusy
86
    movf  Lcd_Data,w
87
    movwf  Lcd_Line
88
    bcf    Lcd_Cont, Lcd_RW
89
    bcf    Lcd_Cont, Lcd_RS
90
    bsf    Lcd_Cont, Lcd_E
91
    nop
92
    bcf    Lcd_Cont, Lcd_E
93
    movlw  D'50'
94
    movwf  loops
95
    call   Wait
96
    return
97
;**********************************************************************
98
;Datenbyte 8-bittig übertragen
99
Lcd_DataSend
100
    movwf  Lcd_Data
101
    call  LcdBusy
102
    movf  Lcd_Data,w
103
    movwf  Lcd_Line
104
    bcf    Lcd_Cont, Lcd_RW
105
    bsf    Lcd_Cont, Lcd_RS
106
    bsf    Lcd_Cont, Lcd_E
107
    nop
108
    bcf    Lcd_Cont, Lcd_E
109
    movlw  D'50'
110
    movwf  loops
111
    call   Wait
112
    return
113
;**********************************************************************
114
; darauf warten, daß das Display bereit zur Datenannahme ist
115
LcdBusy
116
    banksel TRISB
117
    movlw  B'11111111'
118
    movwf   TRISB 
119
      banksel PORTB
120
BusyLoop    
121
    bcf    Lcd_Cont, Lcd_RS
122
    bsf    Lcd_Cont, Lcd_RW      ; Lesen
123
    bsf    Lcd_Cont, Lcd_E
124
    nop
125
    movf  Lcd_Line, w
126
    movwf  Lcd_Status
127
    bcf    Lcd_Cont, Lcd_E
128
    nop
129
    bsf    Lcd_Cont, Lcd_E  ; Enable
130
    nop
131
    bcf    Lcd_Cont, Lcd_E
132
    btfsc  Lcd_Status, 7  ; teste bit 7
133
    goto  BusyLoop
134
    bcf    Lcd_Cont, Lcd_RW
135
      banksel TRISB
136
    movlw  B'00000000'
137
    movwf   TRISB 
138
      banksel PORTB
139
    return  
140
;**********************************************************************
141
;Iinitialisierung der Resgister
142
IniReg
143
    bcf    STATUS,C
144
    banksel OPTION_REG    ;Bank1
145
    movlw  B'00000010' ;  pull-up enalbled
146
    movwf  OPTION_REG
147
    movlw  B'00000000' ;PortA RA0-RA2 Output
148
    movwf  TRISA
149
    movlw  B'00000000' ;PortB Outputs
150
    movwf  TRISB
151
    movlw  B'00000000' ;
152
    movwf  PIE1
153
    movlw  B'00000011' ;
154
    movwf  PCON
155
    movlw  B'00000010' ;
156
    movwf  TXSTA
157
    movlw  B'00000000' ;
158
    movwf  EECON1
159
    movlw  B'00000000' ;
160
    movwf  VRCON  
161
    banksel TMR0    ;Bank 0
162
    movlw  B'00000000'
163
    movwf  PORTA
164
    movlw  B'00000000'
165
    movwf  PORTB
166
    movlw  B'00000000' ;
167
    movwf  INTCON
168
    movlw  B'00010000' ;
169
    movwf  PIR1
170
    movlw  B'00000000' ;
171
    movwf  T1CON
172
    movlw  B'00000000' ;
173
    movwf  T2CON
174
    movlw  B'00000000' ;
175
    movwf  CCP1CON
176
    movlw  B'00000000' ;
177
    movwf  RCSTA
178
    movlw  B'00000111' ;
179
    movwf  CMCON
180
    return
181
;**********************************************************  
182
; Initialisierung des LCD-Displays
183

184
IniLcd
185
    movlw  D'250'      ; 250 ms Pause nach dem Einschalten
186
    movwf  loops  
187
    call  Wait    
188

189
    movlw  B'00110000'    ; 1
190
    movwf  Lcd_Line
191
    bsf    Lcd_Cont, Lcd_E
192
    nop  
193
    bcf    Lcd_Cont, Lcd_E
194
  
195
    movlw  D'100'      ; 100 ms Pause
196
    movwf  loops
197
    call  Wait
198
  
199
    movlw  B'00110000'    ; 2
200
    call  Lcd_ContSend
201
    movlw  B'00110000'    ; 3
202
    call   Lcd_ContSend  
203
    
204
    movlw  B'00000001'    ; löschen und cusor home
205
    call  Lcd_ContSend
206
    movlw  B'00111000'    ; 5 function set, 8-bit  2-zeilig,  5x7
207
    call  Lcd_ContSend  
208
    movlw  B'00001000'    ; 6 display off
209
    call  Lcd_ContSend
210
    movlw  B'00000110'    ; 7 entry mode, increment, disable display-shift
211
    call  Lcd_ContSend
212
    movlw  B'00000011'    ; 8 cursor home, cursor home
213
    call  Lcd_ContSend
214
    movlw  B'00001111'    ; 9 display on
215
    call  Lcd_ContSend
216
    return
217
    
218
    
219
;**********************************************************************
220
; END OF PROGRAM
221
;**********************************************************************
222

223
        END

Gruss Urs
Gast #2744155
Lesenswert?
• ▲
▼
HI

>Dieses hat den
>Standart-Treiber HD44780. Leider macht das Display keinen Wank!!
>Der Code ist ca. nach sprut.de, wobei ich mit dem 8-Bit Interface
>arbeite.

Und warum nicht exakt nach dem Datenblatt vom HD44780?

>Im mpasm SIM funktioniert es eigentlich wie gewünscht...

Dort zeigt das Display etwas an?

MfG Spess
#2744270
Lesenswert?
• ▲
▼
Hallo Urs 66,
bei der Nutzung des 16F628 für das LCD mit 8bit-Parallelport stellt sich 
doch die Frage ob das überhaupt einen Sinn ergibt, wenn Du nur noch für 
andere Zwecke 2 Pins übrig hast. . Am PORTA sind ja schon 2 Pins durch 
den Quarz (XT-Oszillator) und den MCLR belegt.
Ich selbst verwende seit Jahren praktisch unverändert wie von Sprut 
bereitgestellt, den 4bit-seriellen Bus zur Initialisierung von LCDs, mit 
stets 100%igem Erfolg. Damit konnte ich  auchr Grafik-Displays 
erfolgreich betreiben. Kupfere doch einfach nochmal den Sprut-Code 1:1 
ab. Wenn es dann funktioniert, machst Du die Änderungen nach Deinem 
eigenen Kopf. Mir persönlich ist es zu dumm mich durch Deinen Code zu 
quälen.
mfG Ottmar

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.