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 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 ORG 0x30 Init movlw B'10001111' ; RC0 .. RC3 inputs, RC4 - RC6 output, RC7 input movwf TRISC clrf TRISB ;PortB als Output clrf LATC clrf LATB 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 .254 ; 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'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'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'00111000' ; D4,5 setzen,0011(8Bit-Modus)1(mehrzeilig)0(5x7Dot) call C8b return ; ein Steuerbyte 8-bittig ?bertragen C8b movwf LATB bsf LATC, LcdE nop bcf LATC, LcdE movlw D'10' movwf loops call WAIT return ; darauf warten, da? das Display bereit zur Datenannahme ist LB ;LcdBusy movlw B'11111111' ; PortB alle inputs movwf TRISB BL ;BusyLoop bcf LATC, LcdRs bsf LATC, LcdRw ; Lesen bsf LATC, LcdE nop movf PORTB, w movwf LcdStatus bcf LATC, LcdE nop bsf LATC, LcdE ; Enable nop bcf LATC, LcdE btfsc LcdStatus, 7 ; teste bit 7 goto BL bcf LATC, LcdRw clrf TRISB return ; ein Datenbyte von LCDDaten zum Display ?bertragen OLD ;OutLcdDaten call LB movf LcdDaten, w movwf TRISB ; Daten schreiben bsf LATC, LcdRs ; Daten bsf LATC, LcdE ; Enable LcdBus nop bcf LATC, LcdE ; Disable LcdBus bcf LATC, LcdRs ; return end