Hallo Zusammen
ich Programmiere mein ersten PIC16F690 mit ein 2x8-LCD(MC0802ASGR-4)
im 4bit-Betrieb Modus. Leider krieg ich das LCD nicht zum Laufen.
ich hab mir das ganze auch schon in der Simulation in MPLAB angeschaut
und Finde im Programm keine Fehler. Vielleicht kann ja jemand mal
schauen wo mein fehler im Code liegt oder mir sagen was ich anders
machen muss.
wäre echt super und schon mal danke im voraus
; LED Programm 4 bit Ansteuerung (LCD TYP: MC0802A-SGR)
; Port C zu LCD Display
; PC1 -> RS
; PC2 -> RW
; PC3 -> E
;
; PC4 -> D4
; PC5 -> D5
; PC6 -> D6
; PC7 -> D7
; alle Anderen von D1 bis D3 GND
;**********************************************************************
; *
; Files required: P16F690.INC *
list p=16F690 ; list directive to define processor
#include <p16F690.inc> ; processor specific variable
definitions
__CONFIG _CP_OFF & _CPD_OFF & _BOR_OFF & _MCLRE_ON & _WDT_OFF &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT & _FCMEN_OFF & _IESO_OFF
; Definiton der Ports
Temp_VAR UDATA 0X20
;***************************************************************
TEMP1 RES 1 ; allgemeines Hilfsregister 1
TEMP2 RES 1 ; allgemeines Hilfsregister 1
;**********************************************************************
RESET_VECTOR CODE 0x000 ; processor reset vector1 goto main
; go to beginning of program
goto main
MAIN_PROG CODE
;*********************************************************************
; Unter_programme:
INIT
banksel TRISC
movlw 0x00 ; PortC 7..0 als Ausgang definieren
movwf TRISC
BANKSEL ANSEL ; setze RC0 ..RC7 Digital Ausgang
movlw 0x00 ;
movwf ANSEL
BANKSEL ANSELH ; setze RC0 ..RC7 Digital Ausgang
movlw 0x00 ;
movwf ANSELH
return
; 1)LC-Display initialisiert
LCDINIT
banksel PORTC ; RA5, RA3, RA4 Alle Control-Lines = Low
movlw 0x00 ; (E, RS, R/W)
movwf PORTC
movlw .150 ; 15 ms warten
call VERZ100US
movlw 0x0F
andwf PORTC,f ; Höherw. Nibble löschen
movlw 0x30 ; Befehl für 8-Bit-Interface (Set to 4-bit operation)
iorwf PORTC,f ; Befehl an LCD
BSF PORTC,3 ; durch toggeln der LCD-Enable-Leitung)
nop
BCF PORTC,3
movlw .41 ; 4.1 ms warten
call VERZ100US
movlw 0x0F
andwf PORTC,f ; Höherw. Nibble löschen
movlw 0x30 ; Befehl für 8-Bit-Interface (Set to 4-bit operation)
iorwf PORTC,f ; Befehl an LCD
BSF PORTC,3 ; durch toggeln der LCD-Enable-Leitung)
nop
BCF PORTC,3
movlw .1 ; 100us warten
call VERZ100US
movlw 0x0F
andwf PORTC,f ; Höherw. Nibble löschen
movlw 0x30 ; Befehl für 8-Bit-Interface (Set to 4-bit operation)
iorwf PORTC,f ; Befehl an LCD
BSF PORTC,3 ; durch toggeln der LCD-Enable-Leitung)
nop
BCF PORTC,3
;call LCDBUSY ;Warten bis LCD bereit
banksel PORTC ; RA5, RA3, RA4 Alle Control-Lines = Low
movlw 0x0F
andwf PORTC,f ;Höherw. Nibble löschen
movlw 0x20 ;Befehl für 4-Bit Interface
iorwf PORTC,f ;Befehl an LCD
BSF PORTC,3 ; durch toggeln der LCD-Enable-Leitung)
nop
BCF PORTC,3
movlw 0x01 ; 4 Bit, 2 Zeilen, 5x7
call LCDBEFEHL ; Befehl an LCD
movlw 0x28 ; Display aus, Cursor aus, Blinken aus
call LCDBEFEHL ; Befehl an LCD
movlw 0x08 ;Shift aus
call LCDBEFEHL ;Befehl an LCD
movlw 0x06 ;Display ein
call LCDBEFEHL ;Befehl an LCD
movlw 0x0C ;Display ein
call LCDBEFEHL ;Befehl an LCD
return
; 2)Dieses Unterprogramm sendet einen Befehl nibbleweise an das
LC-Display.
LCDBEFEHL
movwf TEMP1 ;Auszugebendes Zeichen (befindet sich im
; w-Register) in TEMP1 zwischenspeichern
call LCDBUSY ;Warten bis LCD bereit ist
banksel PORTC
movlw 0x0F
andwf PORTC,f ;Höherwertiges Nibble löschen
movf TEMP1,w
andlw 0xF0 ;Höherwertiges Nibble ausmaskieren
iorwf PORTC,f ;High-Nibble an LCD übergeben
bcf PORTC,2 ; R\W
bcf PORTC,1 ; RS
bsf PORTC,3 ; E
nop
bcf PORTC,3 ; E
movlw 0x0F
andwf PORTC,f ;Höherwertiges Nibble löschen
swapf TEMP1,w
andlw 0xF0 ;Niederwert. Nibble ausmaskieren
iorwf PORTC,f ;Low-Nibble an LCD übergeben
BSF PORTC,3 ; durch toggeln der LCD-Enable-Leitung)
nop
BCF PORTC,3
CLRF PORTC
return
LCDZEICHEN
movwf TEMP1 ; Auszugebendes Zeichen (befindet sich im w-Register)
in
call LCDBUSY ;Warten bis LCD bereit ist
movlw 0x0F
andwf PORTC,f ;Höherwertiges Nibble löschen
movf TEMP1,w
andlw 0xF0 ;Höherwertiges Nibble ausmaskieren
iorwf PORTC,f ;High-Nibble an LCD übergeben
bsf PORTC,1 ; RS
bcf PORTC,2 ; R\W
bsf PORTC,3 ; E
nop
bcf PORTC,3 ; E
movlw 0x0F
andwf PORTC,f ;Höherwertiges Nibble löschen
swapf TEMP1,w
andlw 0xF0 ;Niederwert. Nibble ausmaskieren
iorwf PORTC,f ;Low-Nibble an LCD übergeben
BSF PORTC,3 ; durch toggeln der LCD-Enable-Leitung)
nop
BCF PORTC,3
return
; 3) Dieses Unterprogramm prüft das Busy-Flag des LC-Displays,
LCDBUSY
banksel TRISC
movlw 0xF0 ;Höherwertigeren HalbPort
iorwf TRISC,w ; als Eingang definieren
movwf TRISC
banksel PORTC ; Daten ,zeichen von LCD Lesen
bcf PORTC,1 ; RS
bsf PORTC,2 ; R\W
bsf PORTC,3 ; E
nop
bcf PORTC,3 ; E
movf PORTC,w
andlw 0xF0 ;Niederw.Nibble ausmaskieren
movwf TEMP2
BSF PORTC,3 ; durch toggeln der LCD-Enable-Leitung)
nop
BCF PORTC,3
swapf PORTC,w ;Niederwertigeres Nibble Busy-Flag
andlw 0x0F ;Höherwertiges Nibble ausmaskieren
iorwf TEMP2,w ;Nibbles verbinden
btfsc TEMP2,7 ;Busy-Flag prüfen (High=busy)
goto LCDBUSY ;Dieses UP so oft abarbeiten,bis das Busy-
bcf PORTC,2 ; R\W ; Busy = low: LCD im Schreiben-
banksel TRISC
movlw 0x0F ;Höherwertigeren HalbPort
andwf PORTC,w ; als Ausgang definieren
movwf TRISC
return
; 5) eine Zeitverzögerung für Übergabeparameter
VERZ100US
movwf TEMP1 ;Übergabeparameter in TEMP1 sichern
VERZSCHL1
; movlw .25 ;Bei Verwendung eines 4-MHz-Taktes
; movlw .75 ;Bei Verwendung eines 12-MHz-Taktes
movlw .250 ;Bei Verwendung eines 20-MHz-Taktes
movwf TEMP2
VERZSCHL2
nop
decfsz TEMP2,f
goto VERZSCHL2
decfsz TEMP1,f
goto VERZSCHL1
return
AUSGABE
movlw 0x01 ;Display löschen
call LCDBEFEHL
movlw 'H'
call LCDZEICHEN
movlw 'H'
call LCDZEICHEN
;movlw 'l'
;call LCDZEICHEN
;movlw 'o'
;call LCDZEICHEN
;movlw '.'
;call LCDZEICHEN
movlw 0xC0 ;2.Zeile
call LCDBEFEHL
movlw 'w'
call LCDZEICHEN
movlw 'i'
call LCDZEICHEN
movlw 20 ;Leerzeichen
call LCDZEICHEN
movlw 'g'
call LCDZEICHEN
movlw 'e'
call LCDZEICHEN
movlw 0x27 ;Hochkomma (')
call LCDZEICHEN
return
;********************************************************************
org 0x80
main
; AD-Wandlung
;***********************************************************************
*******
; 3.1) Ausschalten des Comperators
BANKSEL CM1CON0 ; ausschalten des comp1
movlw B'00000000'
MOVWF CM1CON0
BANKSEL CM2CON0 ; ausschalten des comp2
movlw B'00000000'
MOVWF CM2CON0
banksel CM2CON1
movlw B'00000000'
movwf CM2CON1
;--------------------------------------------------------------------
; 3.4) AD_wandlung_abschaltung
;--------------------------------------------------------------------
Banksel ANSEL ; Abschalten des AD-Wandlers
clrf ANSEL
BANKSEL ADCON0 ; Abschalten(VDD,AN2,ADON)
clrf ADCON0
Beginn
call INIT ;Controller initialisieren
call LCDINIT ;Display initialisieren
Schleife
call AUSGABE ;Einen Text am LC-Display ausgeben
movlw .500 ; und anschließend 15ms warten
call VERZ100US
goto Schleife
end