list p=18f242 ;************************************************************** ;* Pinbelegung ;* ---------------------------------- ;* ;* PORTB: 0 - 7 LC- Display D0 .. D7 ;* PORTC: 4 RS ;* 5 R/W ;* 6 Enable ;* ;************************************************************** ; ; Obi (Erstellt am 30.06.2008) ; ; LCD-Display "Hello World" ; ; Taktquelle: 10 MHz ; ;************************************************************** ; Includedatei für den 18F242 einbinden #include ; Configuration festlegen ; bis 4 MHz: Power on Timer, kein Watchdog, HS-Oscillator CONFIG OSC = HS ; HS 10 MHz CONFIG PWRT = ON ; power up timer on CONFIG BOR = OFF ; brown out detect off CONFIG WDT = OFF ; watchdog off CONFIG LVP = OFF ; lvp off ;************************************************************** ; Variablen festlegen LcdDaten Equ 0x22 LcdStatus Equ 0x23 loops Equ 0x24 loops2 Equ 0x25 ; Konstanten festlegen LcdE equ 6 ; enable Lcd LcdRw equ 5 ; read Lcd LcdRs equ 4 ; Daten Lcd (nicht control) ;******************************************************** ; Das Programm beginnt mit der Initialisierung Init movlw B'10001111' ; RC0 .. RC3 inputs, RC4 - RC6 output, RC7 input movwf TRISC clrf TRISB clrf PORTC clrf PORTB call InitLCD ; Display initialisieren ; am LCD "Hallo" ausgeben movlw 'H' movwf LcdDaten call OLD movlw 'a' movwf LcdDaten call OLD movlw 'l' movwf LcdDaten call OLD movlw 'l' movwf LcdDaten call OLD movlw 'o' movwf LcdDaten call OLD Main goto Main ;***************************************************************** ;Zeitverzögerung um loops * 1 ms ; 4MHz externer Takt bedeutet 1MHz interner Takt ; also dauert 1 ms genau 1000 Befehle ; 110 Schleifen a 9 Befehle sind 990 Befehle = 0.99 ms ; die restlichen 10 Befehle für Einsprung und Rücksprung WAIT top movlw .275 ; timing adjustment variable (1ms) für 10mhz movwf loops2 top2 nop ; sit and wait nop nop nop nop nop decfsz loops2, F ; inner loops complete? goto top2 ; no, go again ; decfsz loops, F ; outer loops complete? goto top ; no, go again retlw 0 ; yes, return from subWAIT ;********************************************************** ; Initialisierung des LCD-Displays InitLCD movlw D'255' ; 250 ms Pause nach dem Einschalten movwf loops call WAIT movlw B'00110000' ; D4,5 setzen, 0011(8Bit-Modus)0(einzeigig)0(5x7Dot) call C8b movlw D'40' ; 40 ms Pause movwf loops call WAIT movlw B'00001111' ; D0-3 setzen, 000011(Display ein)1(Cursor ein)1(Cursor blinken) call C8b movlw B'00000001' ; D0 setzen, 00000001(Display löschen, Cursor auf 1.Stelle) call C8b movlw B'00000110' ; D1,2 setzen, 0000011(Adresse auto inkrement)0(Schieben deaktivieren) call C8b return ; ein Steuerbyte 8-bittig übertragen C8b movwf PORTB bsf PORTC, LcdE nop bcf PORTC, LcdE movlw D'10' movwf loops call WAIT return ; darauf warten, daß das Display bereit zur Datenannahme ist LB ;LcdBusy bsf STATUS, RP0 ; make Port B4..7 input movlw B'11111111' ; PortB alle inputs movwf TRISB bcf STATUS, RP0 BL ;BusyLoop bcf PORTC, LcdRs bsf PORTC, LcdRw ; Lesen bsf PORTC, LcdE nop movf PORTB, w movwf LcdStatus bcf PORTC, LcdE nop ; bsf PORTC, LcdE ; Enable ; nop ; bcf PORTC, LcdE btfsc LcdStatus, 7 ; teste bit 7 goto BL bcf PORTC, LcdRw clrf TRISB return ; ein Datenbyte von LCDDaten zum Display übertragen OLD ;OutLcdDaten call LB movf LcdDaten, w movwf PORTB ; Daten schreiben bsf PORTC, LcdRs ; Daten bsf PORTC, LcdE ; Enable LcdBus nop bcf PORTC, LcdE ; Disable LcdBus bcf PORTC, LcdRs ; return end