Code:
list p=16f876
;**************************************************************
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0 Input switch X_LIMP
;* 1 Input switch X_LIMN
;* 2 Input switch Y_LIMP
;* 3 Input switch Y_LIMN
;* 4 -
;* 5 -
;* 6 -
;* 7 -
;*
;* PORTB: 0 LCD Display E
;* 1 -
;* 2 LCD Display RS
;* 3 LCD Display R/W
;* 4 LCD Display D4
;* 5 LCD Display D5
;* 6 LCD Display D6
;* 7 LCD Display D7
;*
;* PORTC: 0 Enable X
;* 1 Enable Y
;* 2 X_pos
;* 3 X_neg
;* 4 -
;* 5 -
;* 6 Y_pos
;* 7 Y_neg
;*
;**************************************************************
;
; Name Ricardo Brauer
;
; Prozessor 16F876
;
; Prozessor-Takt 10 MHz
;
; Projekt XY_Driver
;**********************************************************
; Includedatei für den 16F876 einbinden
#include <P16f876.INC>
ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES
; Configuration festlegen:
; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF
;********************************************************
; Variablen festlegen
loops equ 0x22 ; timer für wait
loops2 equ 0x23 ; timer für wait
LcdStatus equ 0x24 ;
LcdDaten equ 0x25 ;
Ini_con Equ B'00000000' ; TMR0 -> Interupt disable
Ini_opt Equ B'00000010' ; pull-up
; für LCD-Pins
#define LcdE PORTB,0 ; enable Lcd
#define LcdRw PORTB,3 ; read Lcd
#define LcdRs PORTB,2 ; Daten Lcd (nicht control)
#define LcdPort PORTB ; Datenbus des LCD (obere 4 Bit)
;********************************************************
; Das Programm beginnt mit der Initialisierung
org 0x00
Init
bsf STATUS, RP0 ; Bank 1
MOVLW 0x06 ; PCFG3..0 = '0110'
MOVWF ADCON1
movlw Ini_opt ; pull-up on
movwf OPTION_REG
movlw B'11111111' ; PortA alle inputs
movwf TRISA
movlw B'00000000' ; PortB alle outputs
movwf TRISB
movlw B'00000000' ; PortC alle outputs
movwf TRISC
bcf STATUS, RP0 ; Bank 0
clrf PORTB
movlw Ini_con ; Interupt disable
movwf INTCON
;PWM an RC2 initialisieren
bsf T2CON,T2CKPS1 ; Vorteiler: 16:1
bsf T2CON,TMR2ON ; Timer 2 on
;10kHz Frequens einstellen
bsf STATUS,RP0
movlw D'124'
movwf PR2 ;2,5kHz
bcf STATUS,RP0
;Tastverhältnis 25% einstellen
movlw d'31' ;50% von 124
movwf CCPR1L
;PWM-mode mit CCP1 initialisieren
clrf CCP1CON ;CCP1-mode off
bsf CCP1CON,CCP1M3 ;CCP1-mode PWM-mode
bsf CCP1CON,CCP1M2
;Display initialisieren
call InitLcd
Mainloop
bsf PORTC,3
goto Mainloop
;*****************************************************
;+++LCD-Routinen**************************************
;*****************************************************
;LCD initialisieren, Begrüßung ausgeben
InitLcd
movlw D'255' ; 250 ms Pause nach dem Einschalten
movwf loops
call WAIT
movlw B'00110000' ; 1
movwf LcdPort
bsf LcdE
nop
bcf LcdE
movlw D'50' ; 50 ms Pause
movwf loops
call WAIT
movlw B'00110000' ; 2
call Control8Bit
movlw B'00110000' ; 3
call Control8Bit
movlw B'00100000' ; 4
call Control8Bit
movlw B'00000001' ; löschen und cusor home
call OutLcdControl
movlw B'00101000' ; 5 function set, 4-bit 2-zeilig, 5x7
call OutLcdControl
movlw B'00001000' ; 6 display off
call OutLcdControl
movlw B'00000110' ; 7 entry mode, increment, disable display-shift
call OutLcdControl
movlw B'00000011' ; 8 cursor home, cursor home
call OutLcdControl
movlw B'00001100' ; 9 display on, Kursor aus , Blinken aus
call OutLcdControl
movlw b'00000000'
call OutLcdControl
movlw 'H'
call OutLcdDaten
movlw 'a'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'o'
call OutLcdDaten
call writeLcd
return
;*****************************************************
; ein Steuerbyte 8-bittig übertragen
Control8Bit
movwf LcdPort
bsf LcdE
nop
bcf LcdE
movlw D'10'
movwf loops
call WAIT
return
;*****************************************************
; darauf warten, daß das Display bereit zur Datenannahme ist
LcdBusy
bsf STATUS, RP0 ; make Port B4..7 input
movlw B'11110000'
iorwf TRISB, f
bcf STATUS, RP0
BusyLoop
bcf LcdRs
bsf LcdRw ; Lesen
bsf LcdE
nop
movf LcdPort, w
movwf LcdStatus
bcf LcdE
nop
bsf LcdE ; Enable
nop
bcf LcdE
btfsc LcdStatus, 7 ; teste bit 7
goto BusyLoop
bcf LcdRw
bsf STATUS, RP0 ; make Port B4..7 output
movlw B'00001111'
andwf TRISB, f
bcf STATUS, RP0
return
;*****************************************************
; aus W ein Byte mit Steuerdaten zum Display übertragen
OutLcdControl
movwf LcdDaten
call LcdBusy
movf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Hi-teil Daten schreiben
bsf LcdE
nop
bcf LcdE ; Disable LcdBus
swapf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Lo-teil Daten schreiben
bsf LcdE
nop
bcf LcdE ; Disable LcdBus
return
;*****************************************************
; aus W ein Datenbyte zum Display übertragen
OutLcdDaten
movwf LcdDaten
call LcdBusy
movf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Hi-teil Daten schreiben
bsf LcdRs ; Daten
bsf LcdE ; Enable LcdBus
nop
bcf LcdE ; Disable LcdBus
swapf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Lo-teil Daten schreiben
bsf LcdRs ; Daten
bsf LcdE
nop
bcf LcdE ; Disable LcdBus
bcf LcdRs ;
return
;*****************************************************
; Das Display löschen
ClearLcd
movlw B'00000001' ; löschen und cusor home
call OutLcdControl
return
;*****************************************************
;Zeitverzögerung um loops * 1 ms
; 20 MHz externer Takt bedeutet 5 MHz interner Takt
; also dauert 1 ms genau 5000 Befehle
; 250 Schleifen a 20 Befehle sind 5000 Befehle = 1 ms
WAIT
movwf loops
top
movlw .250 ; timing adjustment variable (1ms)
movwf loops2
top2
nop ; sit and wait
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
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
;***************************************************
;* Lcd mit einem Teststring für jede Zeile beschreiben
writeLcd
call ClearLcd ;LCD leeren
movlw '1'
call OutLcdDaten
movlw '.'
call OutLcdDaten
movlw ' '
call OutLcdDaten
movlw 'Z'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw 'i'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw b'11000000' ;2. Zeile
call OutLcdControl
movlw '2'
call OutLcdDaten
movlw '.'
call OutLcdDaten
movlw ' '
call OutLcdDaten
movlw 'Z'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw 'i'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw b'10010100' ;3. Zeile
call OutLcdControl
movlw '3'
call OutLcdDaten
movlw '.'
call OutLcdDaten
movlw ' '
call OutLcdDaten
movlw 'Z'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw 'i'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw b'11010100' ;4. Zeile
call OutLcdControl
movlw '4'
call OutLcdDaten
movlw '.'
call OutLcdDaten
movlw ' '
call OutLcdDaten
movlw 'Z'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw 'i'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
return
end
Gruß Rico
Lesezeichen