list p=18f242 ;************************************************************** ;* Pinbelegung ;* ---------------------------------- ;* ;* PORTC: 0 - 7 LC- Display D0 .. D7 ;* PORTB: 0 RS ;* 1 R/W ;* 2 Enable ;* ;************************************************************** ; ; Fl0wnage (Erstellt am 25.08.2008) ; ; LCD-Display "Hello World" ; ; Taktquelle: 4 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 ; Low Voltage Programming off ;************************************************************** ; Variablen festlegen LcdDaten Equ 0x22 LcdStatus Equ 0x23 loops Equ 0x24 loops2 Equ 0x25 w_copy Equ 0x26 ; Backup für Akkuregister s_copy Equ 0x27 ; Backup für Statusregister PCLATH_TEMP Equ 0x28 ; Konstanten festlegen #define LcdE PORTB,7 ; enable Lcd #define LcdRw PORTB,6 ; read Lcd #define LcdRs PORTB,5 ; Daten Lcd (nicht control) #define LcdPort PORTC ; Datenbus des LCD (obere 4 Bit) org 0x0 goto Init Intrpt org 0x8 goto ServInt ;******************************************************** ; Das Programm beginnt mit der Initialisierung ORG 0x30 Init clrf INTCON clrf INTCON2 clrf INTCON3 movlw B'10010000' ; Interrupts erlauben, INT0 erlauben movwf INTCON bsf INTCON2, 6 ; INT0 on rising edge clrf INTCON3 ; INT 1+2 verbieten bcf RCON, 7 clrf PORTB sleep ; SCHLAF!!! :-) Sprung clrf INTCON movlw B'00000110' movwf ADCON1 movlw B'01110000' ; RA0 und RA4 - RA7 Input, RA2/3 Output movwf TRISA bcf PORTA, 0 LCDHintergrund bsf PORTA, 3 Piepser bsf PORTA, 1 call WAIT call WAIT call WAIT bcf PORTA, 1 TasterLED bsf PORTA, 2 movlw B'00000110' ; RB0 .. RB4 Input, RB5 - RB7 Outtput movwf TRISB clrf TRISC clrf LATB clrf LATC call InitLCD ; Display initialisieren call Main goto ServInt2 ; am LCD "beliebigen Text" ausgeben Main movlw 'N' ; zeile 1 movwf LcdDaten call OLD movlw 'a' movwf LcdDaten call OLD movlw B'00100000' movwf LcdDaten call OLD movlw ',' movwf LcdDaten call OLD movlw B'00100000' movwf LcdDaten call OLD movlw 'd' movwf LcdDaten call OLD movlw 'u' movwf LcdDaten call OLD movlw B'00100000' movwf LcdDaten call OLD movlw 'S' movwf LcdDaten call OLD movlw 'c' movwf LcdDaten call OLD movlw 'h' movwf LcdDaten call OLD movlw 'w' movwf LcdDaten call OLD movlw 'u' movwf LcdDaten call OLD movlw 'c' movwf LcdDaten call OLD movlw 'k' movwf LcdDaten call OLD movlw 'e' movwf LcdDaten call OLD movlw 'l' movwf LcdDaten call OLD movlw 'e' movwf LcdDaten call OLD movlw '!' movwf LcdDaten call OLD ; call LB ; zeile 2 ; movlw B'11000000' ; movwf LATC ; bsf LcdE ; nop ; bcf LcdE ; movlw 'W' ; movwf LcdDaten ; call OLD ; movlw 'i' ; movwf LcdDaten ; call OLD ; movlw 'e' ; movwf LcdDaten ; call OLD ; movlw B'00100000' ; movwf LcdDaten ; call OLD ; movlw 'g' ; movwf LcdDaten ; call OLD ; movlw 'e' ; movwf LcdDaten ; call OLD ; movlw 'h' ; movwf LcdDaten ; call OLD ; movlw 't' ; movwf LcdDaten ; call OLD ; movlw B'00100111' ; movwf LcdDaten ; call OLD ; movlw 's' ; movwf LcdDaten ; call OLD ; movlw B'00100000' ; movwf LcdDaten ; call OLD ; movlw 'd' ; movwf LcdDaten ; call OLD ; movlw 'i' ; movwf LcdDaten ; call OLD ; movlw 'r' ; movwf LcdDaten ; call OLD ; movlw B'00100000' ; movwf LcdDaten ; call OLD ; movlw '?' ; movwf LcdDaten ; call OLD ; movlw '?' ; movwf LcdDaten ; call OLD ; movlw '?' ; movwf LcdDaten ; call OLD ; movlw '?' ; movwf LcdDaten ; call OLD ; movlw '?' ; movwf LcdDaten ; call OLD ; call LB ; zeile 3 ; movlw B'10010100' ; movwf LATC ; bsf LcdE ; nop ; bcf LcdE ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'11111111' ; movwf LcdDaten ; call OLD ; call LB ; zeile 4 ; movlw B'11010100' ; movwf LATC ; bsf LcdE ; nop ; bcf LcdE ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'10100101' ; movwf LcdDaten ; call OLD ; movlw B'00101110' ; movwf LcdDaten ; call OLD ; movlw B'11111111' ; movwf LcdDaten ; call OLD return ServInt2 movlw B'10000000' ; Interrupts erlauben movwf INTCON movlw B'0001000' movwf INTCON3 ; INT1 enable bit set bsf INTCON2, 5 ; INT1 on rising edge bcf RCON, 7 sleep goto 0x0 ;Programm wiederholen Intrpt2 btfss INTCON3, 0 goto Intrpt2 bcf INTCON3, 0 clrf INTCON movlw B'00000110' movwf ADCON1 clrf PORTA movlw B'00000010' ; home call C8b movlw B'10000000' ; RA0 Output, RA1 - RA7 Input movwf TRISA bsf PORTA, 0 call WAIT call WAIT call WAIT call WAIT bcf PORTA, 0 clrf PORTA clrf PORTB clrf PORTC swapf s_copy, w ; STATUS zurück movwf STATUS swapf w_copy, f ; w zurück mit flags swapf w_copy, w movf PCLATH_TEMP, W movwf PCLATH retfie ; call LB ; clear ; movlw B'00000001' ; movwf LATC ; bsf LcdE ; nop ; bcf LcdE ; 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 return 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' ; 1 call C8b movlw D'40' ; 40 ms Pause movwf loops call WAIT movlw B'00110000' ; 2 call C8b movlw B'00110000' ; 3 call C8b movlw B'00111000' ; 8Bit-Modus, mehrzeilig, 5x7Dot call C8b movlw B'00001110' ; display ein, cursor wird angezeigt, zeichen blinkt nicht call C8b movlw B'00000110' ; automatisch inkrement call C8b movlw B'00000010' ; home call C8b return ; ein Steuerbyte 8-bittig übertragen C8b movwf LATC bsf LcdE nop bcf LcdE movlw D'10' movwf loops call WAIT return ; darauf warten, daß das Display bereit zur Datenannahme ist LB ;LcdBusy movlw B'11111111' ; PortC alle inputs movwf TRISC BL ;BusyLoop bcf LcdRs ; Register Select bsf LcdRw ; Lesen bsf LcdE ; Enable nop movf PORTC, w movwf LcdStatus bcf LcdE nop bsf LcdE ; Enable nop bcf LcdE btfsc LcdStatus, 7 ; teste bit 7 goto BL bcf LcdRw clrf TRISC return ; ein Datenbyte von LCDDaten zum Display übertragen OLD ;OutLcdDaten movlw D'255' movwf loops call LB movf LcdDaten, w movwf LATC ; Daten schreiben bsf LcdRs ; Daten bsf LcdE ; Enable LcdBus nop bcf LcdE ; Disable LcdBus bcf LcdRs ; return ServInt movwf w_copy ; w retten swapf STATUS, w ; STATUS retten clrf STATUS movwf s_copy movf PCLATH, W movwf PCLATH_TEMP clrf PCLATH ; Bank 0 btfss INTCON, 1 goto Intrpt2 bcf INTCON, 1 swapf s_copy, w ; STATUS zurück movwf STATUS swapf w_copy, f ; w zurück mit flags swapf w_copy, w movf PCLATH_TEMP, W movwf PCLATH retfie goto Sprung Ende end