list p=16c84 ;************************************************************** ;* Hex-Register 3stellig dezimal auf LCD ausgeben ;* (zum Test ist Register gleich 0) ;* ;* ;* PORTB: 0 Enable LCD ;* 1 ;* 2 RS ;0=Steuerregister 1=Datenregister ;* 3 R/W ;0=lesen 1=schreiben ;* 4-7 D4-D7 ;* ;************************************************************** ; ; Takt: 4 MHz ; ;************************************************************** #include __CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC ;************************************************************** ; Variablen festlegen loops equ 0x20 loops1 equ 0x21 save equ 0x22 ;Sicherungsregister lcdstatus equ 0x23 ;STATUS LCD busy? lcddaten equ 0x24 ;Ausgabedaten für LCD HexZahl equ 0x25 ;Zählerinhalt für Umrechnung Hundert equ 0x26 ;LCD Stellen Zehner equ 0x27 Einer equ 0x28 ;******************************************************** ; Initialisierung PIC initpic BSF STATUS,RP0 ;Umschalten Bank 1 movlw b'00001111' movwf TRISA ;Port A Eingänge movlw b'00000000' MOVWF TRISB ;Port B Ausgänge BCF STATUS,RP0 ;Bank 0 clrf Timer ;Timer-Register löschen call initlcd ;***************************************************************** ; Hauptprogramm main movlw b'10000110' ;Adr 7 im LCD, mitte erste Zeile schreiben call steuerout movf Timer,w ;Timer (ist für Test 0) nach HexZahl kopieren für Umrechnung movwf HexZahl call ZahlLcd ;Umrechnen und Anzeigen in Dezimalzahlen sleep ;************************************************************************************** ; Zahlenausgabe auf LCD, Wert in HexZahl ; ZahlLcd call HexDec ;in Hunderter, Zehner und Einer umwandeln movf Hundert,w ;Hunderter anzeigen movwf lcddaten call datenout movf Zehner,w ;Zehner anzeigen movwf lcddaten call datenout movf Einer,w ;Einer ausgeben movwf lcddaten call datenout return ;********************************************************************** ; HexZahl in einzelne Stellen umrechnen ; --> ASCII Code für Display wandeln HexDec clrf Hundert ;alle Stellen löschen clrf Zehner clrf Einer bcf STATUS,C addlw d'100' ;Akku mit 100 dez laden subh subwf HexZahl,f ;100 vom Register subtrahieren btfss STATUS,C ;Ergebnis negativ? goto addhundert ;Hunderter hochzählen addwf HexZahl,f ;wenn negativ, wieder 100 addieren um alten Wert zu haben bcf STATUS,C ;C-Flag wieder löschen addlw d'10' subz subwf HexZahl,f ;das gleiche für die Zehnerstellen btfss STATUS,C goto addzehn addwf HexZahl,f bcf STATUS,C movf HexZahl,w ;Restzahl ist die Einerstelle movwf Einer movlw h'030' ;Offset für ASCII-Bildung addwf Einer,f ;addiert (hier zur 0 den Wert Hex 030, ergibt ASCII- Zahlen addwf Zehner,f addwf Hundert,f return ;***************************************************************** ; Hunderterstellen hochzählen addhundert incf Hundert,f goto subh ;***************************************************************** ; Zehnerstellen hochzählen addzehn incf Zehner,f goto subz ;***************************************************************** ; LCD Initialisieren ; initlcd movlw d'20' ;20ms warten movwf loops call wait movlw b'00110000' ;3?h ins Steuerregister call steuer8bit movlw d'5' ;5ms warten movwf loops call wait movlw b'00110000' ;3?h ins Steuerregister call steuer8bit movlw d'1' ;1ms warten movwf loops call wait movlw b'00110000' ;3?h ins Steuerregister call steuer8bit movlw d'5' ;5ms warten -> eigentlich statt dessen Busy abfragen movwf loops call wait movlw b'00100000' ;2?h ins Steuerregister call steuer8bit movlw d'1' ;1ms warten movwf loops call wait movlw b'00101000' ;SystemSet 4bit, 2zeilig, 5x7 call steuerout movlw b'00001000' ;LCD aus call steuerout movlw b'00000001' ;clear lcd call steuerout movlw b'00000010' ;Cursor home call steuerout movlw b'00000110' ;entry mode call steuerout movlw b'00001100' ;LCD an, Cursor - Unterstrich aus call steuerout return ;***************************************************************** ; Steuerbefehle zum Display übertragen steuer8bit movwf PORTB bsf PORTB,0 nop bcf PORTB,0 return ;***************************************************************** ; Zeitverzögerung um loops * 1 ms ; 1 Befehl = 1µs. 1000 Befehle = 1ms wait wait1 movlw d'110' movwf loops1 wait2 nop nop nop nop nop nop nop decfsz loops1,f goto wait2 decfsz loops, F goto wait1 return ;**************************************************************** ; Zeitschleife 1sek sek movlw d'255' ;war 255 movwf loops call wait movlw d'255' movwf loops call wait ; movlw d'255' ;zum Testen Zeit verkürzt ; movwf loops ; call wait ; movlw d'235' ; movwf loops ; call wait return ;**************************************************************** ; Steuerwort 4bittig übertragen steuerout call lcdbusy movwf lcddaten andlw h'f0' movwf PORTB bsf PORTB,0 nop bcf PORTB,0 swapf lcddaten,w andlw h'f0' movwf PORTB bsf PORTB,0 nop BCF PORTB,0 return ;**************************************************************** ; Datenwort 4bittig übertragen datenout call lcdbusy movwf lcddaten andlw h'f0' movwf PORTB bsf PORTB,2 bsf PORTB,0 nop bcf PORTB,0 swapf lcddaten,w andlw h'f0' movwf PORTB bsf PORTB,2 bsf PORTB,0 nop BCF PORTB,0 bcf PORTB,2 return ;**************************************************************** ; LCD Busy lcdbusy movwf save ;Akku sichern bsf STATUS,RP0 ;PortB7-4 Eingänge movlw h'f0' movwf TRISB bcf STATUS,RP0 bsf PORTB,3 ;LCD lesen busy1 bsf PORTB,0 ;LCD enable nop movf PORTB,w movwf lcdstatus bcf PORTB,0 nop ;neu hinzugekommen der bsf PORTB,0 ;2te Lesezyklus nop bcf PORTB,0 btfsc lcdstatus,7 goto busy1 bsf STATUS,RP0 ;PortB Ausgänge movlw h'00' movwf TRISB bcf STATUS,RP0 bcf PORTB,3 ;LCD schreiben movf save,w return end