- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 3 von 3

Thema: Laufschrift auf einem 16x1 Zeilen LCD fertig!

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065

    Laufschrift auf einem 16x1 Zeilen LCD fertig!

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Moin zusammen.
    Ich hab gestern und vorgestern angefangen ein LCDDisplay mit 1x16 Zeichen, wie man es bei Reichelt bekommt mit einem PIC16F84A anzusteuren. Er soll mit 4 Tastern und einem Jumper das LCD programmieren, was dann folgendes tun soll: mit den Tasten Up, Down, Forward und Backward kann man übers Display und durch 104 Zeichen Scrollen, die auf dem Display ausgegeben werden. Sobald man dann alles eingegeben hat (bis zu 80 Zeichen schaff der Chip im Display) setzt man den Jumper und die schrift scrollt mit 4feldern pro sekunde durch die Anzeige.
    Soviel zur Theorie, da ich kein solches LCD da habe und auch grad keine zeit zum löten, würd ich hier jemanden bitten sich mal den Quellcode anzusehen und vielleicht sogar zu testen, damit ich weiß ob das alles klappt.
    würd mich freuen wenn sich das mal jemand angucken könnte. meine quellen waren Sprut.de , und Datenblatt bei Reichelt

    Datenblatt

    danke im voraus

    MFG
    Björn


    Code:
    ; Mit dem PIC16F84A sollt auf einem LCD eine Schrift über ein 1x16 Zeichen LCD laufen, die vorher eingegeben wurde.
    ; Oszillator -> 4MHz Keramikresonator oder Quarz
    ;
    ;	PORTA	0		TasterUp
    ;			1		TasterBackward
    ;			2		TasterForward
    ;			3		TasterDown
    ;			4		Prog Jumper	(wenn offen dann ProgModus wenn geschlossen Laufmodus)
    ;					Tasten sind High wenn gedrückt
    ;
    ;	PORTB	0		LCD Enable
    ;			1
    ;			2		LCD RS (0=Steuerregister 1=Textpuffer)
    ;			3		LCD	R/W (0=Auf Display schreiben 1=Von Display lesen)
    ;			4		LCDD4	\
    ;			5		LCDD5	| LCD 4bit Datenbus
    ;			6		LCDD6	|
    ;			7		LCDD7	/
    ;
    
    	list p=16F84A
    
    #include <P16F84A.INC>
    
    	__config	_CP_OFF && _PWRTE_ON && _WDT_OFF && _XT_OSC	
    
    
    ;Variablen
    Zaehler		equ		0x0C	;Für Delays
    Zeichen		equ		0x0D	;Für die Nummer des Zeichens in der Tabelle
    Tasten		equ		0x0E	;Für Tastendruck
    Daten		equ		0x0F	;Für Abfrage des LCD
    SignCount	equ		0x10	;Für CursorPosition und Anzahl der Zeichen
    ZeichenHex	equ		0x11	;Aus der Tabelle gelesener Code für das Zeichen
    
    ;Constanten bzw Pinzuordnungen
    
    #define	TasterUp			PORTA,0
    #define	TasterBackward		PORTA,1	
    #define	TasterForward		PORTA,2
    #define	TasterDown			PORTA,3
    #define Jumper				PORTA,4
    
    #define Enable	PORTB,0
    #define	RS		PORTB,2
    #define RW		PORTB,3
    
    
    	org		0x00
    ;************************************************************************
    ;Timer und Pins werden Initialisiert
    setup
    	CLRF	Zaehler
    	CLRF	Zeichen
    	CLRF	Tasten
    	CLRF	Daten
    	CLRF	SignCount
    	CLRF	ZeichenHex
    
    	CLRF	PORTA	
    	CLRF	PORTB
    	BSF		STATUS,RP0
    	CLRF	TRISB		;PORTB alles Ausgänge
    	MOVLW	0xFF
    	MOVWF	TRISA		;PORTA alles Eingänge
    	MOVLW	B'10001000'	;Timer0 als Timer, Prescaler 1, PBPullups aus
    	BCF		STATUS,RP0
    ;************************************************************************ 
    ;								|	|
    ;************************************************************************
    ;Das LCD wird initialisiert
    LCDInit
    ;15ms auf Display warten
    	MOVLW	D'15'	
    	MOVWF	Zaehler
    Delay15	
    	CALL	Wait
    	DECF 	Zaehler
    	BTFSS	STATUS,Z
    	GOTO	Delay15
    ;testen ob Busy, dann auf 8Bit Modus stellen
    	CALL	TestBusy	
    	CALL	LCD8Bit
    	MOVLW	D'5'
    	MOVWF	Zaehler
    ;5ms auf Display warten
    Delay5	
    	CALL	Wait
    	DECF	Zaehler
    	BTFSS	STATUS,Z
    	GOTO	Delay5
    ;testen ob Busy, dann auf 8Bit Modus stellen
    	CALL	TestBusy
    	CALL	LCD8Bit
    ;100µs auf Display warten
    	MOVLW	D'20'
    	MOVWF	Zaehler
    	NOP
    	DECF	Zaehler
    	BTFSS	STATUS,Z
    	GOTO	$-3
    ;auf 4Bit Modus stellen	
    	CALL	TestBusy	
    	CALL	LCD8Bit
    	CALL	TestBusy
    	CALL	LCD4Bit
    ;auf 2Zeilen Modus und 5x8 Darstellung schalten
    	CALL	TestBusy
    	CALL	LCD2col
    ;LCD löschen
    	CALL	TestBusy
    	CALL	ClearLCD
    ;Cursor nach rechts, kein Displayshift
    	CALL	TestBusy
    	CALL	SetCursor
    ;************************************************************************
    ;								|	|
    ;************************************************************************
    ;Der Jumper wird getestet und entschieden ob Programmiermodus oder normaler Betrieb läuft
    ProgModus
    	BTFSC	Jumper			;Sind wir im ProgModus?
    	GOTO	Main			;Nein, auf zur Main
    	CALL	Tastatur		;Ja, frag die Tasten ab und stell den Text ein
    	CALL	TasterService
    	GOTO	ProgModus		
    ;************************************************************************
    
    
    
    ;************************************************************************
    ;Hauptprogrammschleife
    Main
    	CALL	TestBusy
    	CALL	Roll			;Rollt das Display eine stelle und stell zuvor den Cursor ab
    Delay250					;Wartet etwa eine viertel Sekunde
    	MOVLW	D'250'
    	MOVWF	Zaehler
    	CALL	Wait
    	GOTO	Main			;kehrt zum Anfang von Mainschleife zurück
    ;************************************************************************
    
    
    ;########################################################################
    ;Unterprogramme
    
    ;************************************************************************
    ;Roll schaltet den Cursor ab und verschiebt das Display um 1 nach Links
    Roll
    	MOVLW	B'00000000'
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	MOVLW	B'11000000'
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable		;hier wurde das Display an, der Cursor aus gestellt
    	CALL	TestBusy
    	MOVLW	B'00010000'	;hier wird das Display 1 nach links verschoben
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	MOVLW	B'10000000'
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	RETURN	
    ;************************************************************************	
    
    
    ;************************************************************************
    ;für 1 Millisekunden wird gewartet
    Wait
    	CLRF	TMR0	
    	BSF		STATUS,RP0
    	MOVLW	B'10000001'	;Timer auf Vorteiler 4
    	MOVWF	OPTION_REG
    	BCF		STATUS,RP0
    sub
    	BTFSS	INTCON,T0IF
    	GOTO	sub
    	BCF		INTCON,T0IF
    	CLRF	TMR0
    	RETURN
    ;************************************************************************
    
    
    ;************************************************************************
    ;LCD auf 8Bit Modus stellen
    LCD8Bit	
    	MOVLW	B'00110000'		;8Bit Modus
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	RETURN
    ;************************************************************************
    
    
    ;************************************************************************
    ;LCD auf 4Bit Modus stellen
    LCD4Bit
    	MOVLW	B'00100000'		;8Bit Modus
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	RETURN
    ;************************************************************************
    
    
    ;************************************************************************
    ;LCD auf 2Zeilen und 5x8 Modus mit 4Bit Interface stellen
    LCD2col
    	MOVLW	B'00100000'
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable	
    	MOVLW	B'10000000'
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	RETURN
    ;************************************************************************
    
    
    ;************************************************************************
    ;Löscht den TextPuffer des LCD
    ClearLCD
    	MOVLW	B'00000000'
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	MOVLW	B'00010000'
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	RETURN
    ;************************************************************************
    
    
    ;************************************************************************
    ;Stellt das Display auf "rechts nach Zeichen", cursor als blinkender unterstrich
    SetCursor
    	MOVLW	B'00000000'
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	MOVLW	B'01100000'
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable		;hier wurde das Display auf rechtsfortlauf gestellt, kein Displayshift
    	CALL	TestBusy
    	MOVLW	B'00000000'	;hier wird das Display und der blinkende Strichcursor eingeschaltet
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	MOVLW	B'11100000'
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	RETURN
    ;************************************************************************
    
    
    ;************************************************************************
    ;Testet das LCD auf sein BusyFlag. Falls gesetzt,bleibt der PIC in TestBusy und testet erneut		
    TestBusy
    	BSF		STATUS,RP0	
    	MOVLW	0xFF
    	MOVWF	TRISB
    	BCF		STATUS,RP0
    	CLRF	PORTB
    	BCF		RS
    	BSF		RW
    	NOP
    	BSF		Enable
    	MOVFW	PORTB
    	MOVWF	Daten
    	BTFSC	Daten,7		;BusyFlag high?
    	GOTO	TestBusy
    	BSF		STATUS,RP0
    	CLRF	TRISB
    	BCF		STATUS,RP0
    	CLRF	PORTB	
    	RETURN
    ;************************************************************************
    
    
    ;************************************************************************	
    ;Abfrage der Tasten, mit 30sek Entprellung. Die gedrückte Taste wird mit 1 angezeigt
    Tastatur
    	CLRF	PORTA
    	NOP
    	MOVFW	PORTA
    	MOVWF	Tasten
    	MOVLW	D'30'
    	MOVWF	Zaehler
    Delay30
    	CALL	Wait
    	DECF	Zaehler
    	BTFSS	STATUS,Z
    	GOTO	Delay30
    	MOVFW	PORTA
    	ANDWF	Tasten
    	RETURN
    ;************************************************************************
    
    
    ;************************************************************************
    ;Bestimmt welche Taste gedrückt wurde und veranlasst Aktion
    TasterService
    	BTFSC	Tasten,0	
    	GOTO	Up
    	BTFSC	Tasten,1
    	GOTO	Backward
    	BTFSC	Tasten,2
    	GOTO	Forward
    	BTFSC	Tasten,3
    	GOTO	Down
    	CLRF	Tasten
    	RETURN
    ;************************************************************************
    
    
    ;************************************************************************
    ;Aktion bei Taste Forward
    Forward
    	CLRF	Tasten
    	CALL	TestBusy
    	MOVLW	B'00010000'
    	MOVWF	PORTB
    	BSF		Enable		
    	NOP
    	BCF		Enable			;erster Teil gesendet, 4bit
    	MOVLW	B'01000000'		;Cursor nach rechts, erstmal ohne Displayshift
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    						
    	INCF	SignCount
    	MOVFW	SignCount		;wenn mehr als 12 Zeichen auf dem Display sind wird carry gesetzt, dann soll das Displays verschoben werden
    	SUBLW	D'12'
    	BTFSS	STATUS,C
    	GOTO	Main
    	
    	CALL	TestBusy
    	MOVLW	B'00010000'
    	MOVWF	PORTB
    	BSF		Enable		
    	NOP
    	BCF		Enable			;erster Teil gesendet, 4bit
    	MOVLW	B'11000000'		;Display nach rechts
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	GOTO	Main
    ;************************************************************************
    
    
    ;************************************************************************
    ;Aktion bei Taste Backward
    Backward
    	CLRF	Tasten
    	CALL	TestBusy
    	MOVLW	B'00010000'
    	MOVWF	PORTB
    	BSF		Enable		
    	NOP
    	BCF		Enable			;erster Teil gesendet, 4bit
    	MOVLW	B'00000000'		;Cursor nach links, erstmal ohne Displayshift
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    						
    	DECF	SignCount
    	MOVFW	SignCount		;wenn mehr als 12 Zeichen auf dem Display sind wird carry gesetzt, dann soll das Displays verschoben werden
    	SUBLW	D'12'
    	BTFSS	STATUS,C
    	GOTO	Main
    	
    	CALL	TestBusy
    	MOVLW	B'00010000'
    	MOVWF	PORTB
    	BSF		Enable		
    	NOP
    	BCF		Enable			;erster Teil gesendet, 4bit
    	MOVLW	B'10000000'		;Display nach links
    	MOVWF	PORTB
    	BSF		Enable
    	NOP
    	BCF		Enable
    	GOTO	Main
    ;************************************************************************
    
    
    ;************************************************************************
    ;Aktion bei Taste Up
    Up
    	INCF	Zeichen			;Zeichen um eins erhöhen
    	MOVLW	D'104'			;Testen damit nicht hinter die Tabelle gesprungen wird
    	SUBWF	Zeichen,W
    	BTFSC	STATUS,Z
    	CLRF	Zeichen
    	CALL	ZeichenTab		;und aus der Tabelle holen
    	MOVWF	ZeichenHex		;Zwischenspeichern
    	MOVWF	PORTB
    	BSF		RS
    	BCF		RW
    	CALL	TestBusy
    	NOP
    	BSF		Enable
    	NOP
    	BCF		Enable			;höchsten 4bit senden
    	RLF		ZeichenHex,F
    	RLF		ZeichenHex,F
    	RLF		ZeichenHex,F
    	RLF		ZeichenHex,F	;4stellen rotieren
    	MOVFW	ZeichenHex
    	MOVWF	PORTB
    	BSF		RS
    	BCF		RW
    	NOP
    	BSF		Enable
    	NOP
    	BCF		Enable			;niedrigsten 4bit senden
    ;jetzt noch verhindern, dass der Cursor weiterspringt	
    	CALL	TestBusy
    	GOTO	Backward
    ;************************************************************************
    
    
    ;************************************************************************
    ;Aktion bei Taste Down
    Down
    	DECF	Zeichen			;Zeichen um eins verringern
    	MOVLW	D'104'			;Testen damit nicht hinter die Tabelle gesprungen wird
    	SUBWF	Zeichen,W
    	BTFSC	STATUS,Z
    	CLRF	Zeichen
    	CALL	ZeichenTab		;und aus der Tabelle holen
    	MOVWF	ZeichenHex		;Zwischenspeichern
    	MOVWF	PORTB
    	BSF		RS
    	BCF		RW
    	CALL	TestBusy
    	NOP
    	BSF		Enable
    	NOP
    	BCF		Enable			;höchsten 4bit senden
    	RLF		ZeichenHex,F
    	RLF		ZeichenHex,F
    	RLF		ZeichenHex,F
    	RLF		ZeichenHex,F	;4stellen rotieren
    	MOVFW	ZeichenHex
    	MOVWF	PORTB
    	BSF		RS
    	BCF		RW
    	NOP
    	BSF		Enable
    	NOP
    	BCF		Enable			;niedrigsten 4bit senden
    ;jetzt noch verhindern, dass der Cursor weiterspringt	
    	CALL	TestBusy
    	GOTO	Backward
    ;************************************************************************
    
    
    
    
    ;########################################################################
    ;DatenTabelle
    
    ZeichenTab
    	MOVFW	Zeichen
    	ADDWF	PCL
    	RETLW	0x20		;Leerzeichen
    	RETLW	0x41		;A
    	RETLW	0xE1		;ä
    	RETLW	0x61		;a
    	RETLW	0x42		;B
    	RETLW	0x62		;b
    	RETLW	0x43		;C
    	RETLW	0x63		;c
    	RETLW	0x44		;D
    	RETLW	0x63		;d
    	RETLW	0x45		;E
    	RETLW	0x65		;e
    	RETLW	0x46		;F
    	RETLW	0x66		;f
    	RETLW	0x47		;G
    	RETLW	0x67		;g
    	RETLW	0x48		;H
    	RETLW	0x68		;h
    	RETLW	0x49		;I
    	RETLW	0x69		;i
    	RETLW	0x4A		;J
    	RETLW	0x6A		;j
    	RETLW	0x4B		;K
    	RETLW	0x6B		;k	
    	RETLW	0x4C		;L
    	RETLW	0x6C		;l
    	RETLW	0x4D		;M
    	RETLW	0x6D		;m
    	RETLW	0x4E		;N
    	RETLW	0x6E		;n
    	RETLW	0x4F		;O
    	RETLW	0x6F		;o
    	RETLW	0xEF		;ö
    	RETLW	0x50		;P
    	RETLW	0x70		;p
    	RETLW	0x51		;Q
    	RETLW	0x71		;q
    	RETLW	0x52		;R
    	RETLW	0x72		;r
    	RETLW	0x53		;S
    	RETLW	0x73		;s
    	RETLW	0x54		;T
    	RETLW	0x74		;t
    	RETLW	0x55		;U
    	RETLW	0x75		;u
    	RETLW	0xF5		;ü
    	RETLW	0x56		;V
    	RETLW	0x76		;v
    	RETLW	0x57		;W
    	RETLW	0x77		;w
    	RETLW	0x58		;X
    	RETLW	0x78		;x
    	RETLW	0x59		;Y
    	RETLW	0x79		;y
    	RETLW	0x5A		;Z
    	RETLW	0x7A		;z
    	RETLW	0xE2		;ß
    	RETLW	0x30		;0
    	RETLW	0x31		;1
    	RETLW	0x32		;2
    	RETLW	0x33		;3
    	RETLW	0x34		;4
    	RETLW	0x35		;5
    	RETLW	0x36		;6
    	RETLW	0x37		;7
    	RETLW	0x38		;8
    	RETLW	0x39		;9
    	RETLW	0xF7		;Pi
    	RETLW	0xF6		;Summenzeichen
    	RETLW	0xFD		;Geteilt durch Zeichen
    	RETLW	0x21		;!
    	RETLW	0x3F		;?
    	RETLW	0x2B		;+
    	RETLW	0x2D		;-
    	RETLW	0x2A		;*
    	RETLW	0x3D		;=
    	RETLW	0x2F		;/
    	RETLW	0x25		;%
    	RETLW	0x2E		;.
    	RETLW	0x2C		;,
    	RETLW	0x3A		;:
    	RETLW	0x3B		;;
    	RETLW	0x23		;#
    	RETLW	0x24		;$
    	RETLW	0x26		;&
    	RETLW	0x28		;(
    	RETLW	0x29		;)
    	RETLW	0x22		;"
    	RETLW	0x27		;'
    	RETLW	0x50		;`
    	RETLW	0x3C		;<
    	RETLW	0x3E		;>
    	RETLW	0x7F		;<-
    	RETLW	0x7E		;->
    	RETLW	0x5E		;^
    	RETLW	0x40		;@
    	RETLW	0xDF		;°
    	RETLW	0x5F		;_
    	RETLW	0x5B		;[
    	RETLW	0x5D		;]
    	RETLW	0x7B		;{
    	RETLW	0x7D		;}
    	RETLW	0x7C		;|
    	RETLW	0xFF		;gefüllter Block
    ;************************************************************************
    
    	END

  2. #2
    Gast
    ich habe endlich die platine fertiggestellt und alle dürfen mal raten..... der code klappt nicht auf anhieb. ich werde den jetzt in aller ruhe stück für stück durcharbeiten und mich dann nochmal melden.
    ps: wenn ich ein lcddisplay benutze, im 2 zeilen modus, wie bekomme ich dann die zeichen auf die richtige position?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.08.2004
    Ort
    484..
    Alter
    34
    Beiträge
    339
    Im Datenblatt des LCDs steht ein Befehl, mit dem man die Ram Adresse einstellen kann, wo das nächste Zeichen stehen soll. Im Datenblatt stehen dann auch meistens die Adressen der Zeilen.
    Standardmäßig sind die Adressen der ersten Zeile 0h bis 0Fh (0...15) und von der zweiten Zeile 40h bis 4Fh (64..79). Nachfolgend einmal eine Datei, in der die Befehle stehen, die man dem Display schicken kann. Interessant ist "Set DD-Ram-Adress" !!! Muss dann aber als "command" und nicht als "data" gesendet werden.
    Angehängte Dateien Angehängte Dateien
    * human knowledge belongs to the world *

    www.domspage.de - Robotik - TobiSAt8

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests