PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : spruts adc zu lcd nachbauen, ASM problem



PsiQ
02.04.2007, 22:15
Fehlermeldung in IDELAB:

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Programme\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F876A "adclcd.asm" /l"adclcd.lst" /e"adclcd.err"
Warning[205] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 1 : Found directive in column 1. (list)
Warning[205] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 3 : Found directive in column 1. (ERRORLEVEL)
Error[118] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 403 : Overwriting previous address contents (2007)
Error[118] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 403 : Overwriting previous address contents (2007)
Halting build on first failure as requested.
BUILD FAILED: Mon Apr 02 22:57:28 2007

weil mein asm nie die *.inc files findet egal wo se sind,
mußte ich wieder das ding davor kopieren.

hab schon paar kleinigkeiten (warning) entfernt bekommen,
aber irgendwie finde ich die 2 fehler oben net, ich weiß auch net was mir das sagen soll..
vermutlich zeile 403, aber da is nix .. ?
bzw, was ist 0x22 in '...FF' geschrieben

Hilfää!
Danke!

teil vom code um zeile 403:

;************************************************* *******
; Variablen festlegen

;16 Bit Rechenregister
xw0 equ 0x22 ; ZEILE403
xw1 equ 0x23 ;
f0 equ 0x24 ;
f1 equ 0x25 ;

ach.. son käse das.. ](*,)

edit:
wenn ich das fertige hexfile benutze und brenne gibts zwar keine fehlermeldung, aber das lcd bleibt "tot"
die kästchen sind zwar sichtbar, aber es wird nix angezeigt ausser kästchen, kontrasteinstellen nütz auch nix, von schwarz bis unsichtbar..

PICVB
04.04.2007, 19:38
hi PSiQ,
also
Warning[205] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 1 : Found directive in column 1. (list)
Warning[205] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 3 : Found directive in column 1. (ERRORLEVEL)

heißt das du die anweisung list und errorlevel zu weit links stehen hast. setze den cursor vor diese beiden zeilen und drücke jeweils einmal tab so das diese beiden anweisungen nicht mehr ganz vorne stehen.
das 403 drei heißt wie du vermutet hast zeile 403.
lass mir doch am besten mal die komplette asm datei zukommen. kann damit eher was anfangen wie mit nem ausschnitt.

gruß carsten

PsiQ
04.04.2007, 20:54
also:
ich hab spruts programm genommen,
davor manuell die *.inc eingefügt, weil das mein assembler nicht hinbekommt, egal wohin ich die datei stopf,

und dann hab ich angefangen die config namen "equ" dinger aus dem reinkopierten *.inv zu löschen, die im programm eh nicht benutzt werden.
hat an den fehlern aber nichts geändert
(ich glaub einer wurde weniger, ne doppelbenennung oderso)

hier die komplette Fehlermeldung:
die 2 kleinen fehler sind jetzt weg, dank leerstellen


Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Programme\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F876A "adclcd.asm" /l"adclcd.lst" /e"adclcd.err"
Error[118] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 403 : Overwriting previous address contents (2007)
Error[118] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 403 : Overwriting previous address contents (2007)
Halting build on first failure as requested.
BUILD FAILED: Wed Apr 04 21:49:01 2007



Hardwaremäßig hab ichs genau so aufgebaut wie auf spruts seite, nochmal auseinander und wieder zusammen.
(lcd 16x2 von reichelt)
Quarz 10Mhz
5V
nur
-lcd
-eingangspin mit 1k , dahinter ein poti von 0-5V

Danke!

PsiQ
04.04.2007, 20:55
Der komplette Code:


list p=16f876a

ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES

IFNDEF __16F876A
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF

;================================================= =========================
;
; Register Definitions
;
;================================================= =========================

W EQU H'0000'
F EQU H'0001'

;----- Register Files------------------------------------------------------

INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
PORTC EQU H'0007'
PCLATH EQU H'000A'
INTCON EQU H'000B'
PIR1 EQU H'000C'
PIR2 EQU H'000D'
TMR1L EQU H'000E'
TMR1H EQU H'000F'
T1CON EQU H'0010'
TMR2 EQU H'0011'
T2CON EQU H'0012'
SSPBUF EQU H'0013'
SSPCON EQU H'0014'
CCPR1L EQU H'0015'
CCPR1H EQU H'0016'
CCP1CON EQU H'0017'
RCSTA EQU H'0018'
TXREG EQU H'0019'
RCREG EQU H'001A'
CCPR2L EQU H'001B'
CCPR2H EQU H'001C'
CCP2CON EQU H'001D'
ADRESH EQU H'001E'
ADCON0 EQU H'001F'

OPTION_REG EQU H'0081'
TRISA EQU H'0085'
TRISB EQU H'0086'
TRISC EQU H'0087'
PIE1 EQU H'008C'
PIE2 EQU H'008D'
PCON EQU H'008E'
SSPCON2 EQU H'0091'
PR2 EQU H'0092'
SSPADD EQU H'0093'
SSPSTAT EQU H'0094'
TXSTA EQU H'0098'
SPBRG EQU H'0099'
CMCON EQU H'009C'
CVRCON EQU H'009D'
ADRESL EQU H'009E'
ADCON1 EQU H'009F'

EEDATA EQU H'010C'
EEADR EQU H'010D'
EEDATH EQU H'010E'
EEADRH EQU H'010F'

EECON1 EQU H'018C'
EECON2 EQU H'018D'

;----- STATUS Bits --------------------------------------------------------

IRP EQU H'0007'
RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'

;----- INTCON Bits --------------------------------------------------------

GIE EQU H'0007'
PEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'

;----- PIR1 Bits ----------------------------------------------------------

ADIF EQU H'0006'
RCIF EQU H'0005'
TXIF EQU H'0004'
SSPIF EQU H'0003'
CCP1IF EQU H'0002'
TMR2IF EQU H'0001'
TMR1IF EQU H'0000'

;----- PIR2 Bits ----------------------------------------------------------

CMIF EQU H'0006'
EEIF EQU H'0004'
BCLIF EQU H'0003'
CCP2IF EQU H'0000'

;----- T1CON Bits ---------------------------------------------------------

T1CKPS1 EQU H'0005'
T1CKPS0 EQU H'0004'
T1OSCEN EQU H'0003'
NOT_T1SYNC EQU H'0002'
T1INSYNC EQU H'0002' ; Backward compatibility only
T1SYNC EQU H'0002'
TMR1CS EQU H'0001'
TMR1ON EQU H'0000'

;----- T2CON Bits ---------------------------------------------------------

TOUTPS3 EQU H'0006'
TOUTPS2 EQU H'0005'
TOUTPS1 EQU H'0004'
TOUTPS0 EQU H'0003'
TMR2ON EQU H'0002'
T2CKPS1 EQU H'0001'
T2CKPS0 EQU H'0000'

;----- SSPCON Bits --------------------------------------------------------

WCOL EQU H'0007'
SSPOV EQU H'0006'
SSPEN EQU H'0005'
CKP EQU H'0004'
SSPM3 EQU H'0003'
SSPM2 EQU H'0002'
SSPM1 EQU H'0001'
SSPM0 EQU H'0000'

;----- CCP1CON Bits -------------------------------------------------------

CCP1X EQU H'0005'
CCP1Y EQU H'0004'
CCP1M3 EQU H'0003'
CCP1M2 EQU H'0002'
CCP1M1 EQU H'0001'
CCP1M0 EQU H'0000'

;----- RCSTA Bits ---------------------------------------------------------

SPEN EQU H'0007'
RX9 EQU H'0006'
RC9 EQU H'0006' ; Backward compatibility only
NOT_RC8 EQU H'0006' ; Backward compatibility only
RC8_9 EQU H'0006' ; Backward compatibility only
SREN EQU H'0005'
CREN EQU H'0004'
ADDEN EQU H'0003'
FERR EQU H'0002'
OERR EQU H'0001'
RX9D EQU H'0000'
RCD8 EQU H'0000' ; Backward compatibility only

;----- CCP2CON Bits -------------------------------------------------------

CCP2X EQU H'0005'
CCP2Y EQU H'0004'
CCP2M3 EQU H'0003'
CCP2M2 EQU H'0002'
CCP2M1 EQU H'0001'
CCP2M0 EQU H'0000'

;----- ADCON0 Bits --------------------------------------------------------

ADCS1 EQU H'0007'
ADCS0 EQU H'0006'
CHS2 EQU H'0005'
CHS1 EQU H'0004'
CHS0 EQU H'0003'
GO EQU H'0002'
NOT_DONE EQU H'0002'
GO_DONE EQU H'0002'
ADON EQU H'0000'

;----- OPTION_REG Bits -----------------------------------------------------

NOT_RBPU EQU H'0007'
INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'

;----- PIE1 Bits ----------------------------------------------------------

ADIE EQU H'0006'
RCIE EQU H'0005'
TXIE EQU H'0004'
SSPIE EQU H'0003'
CCP1IE EQU H'0002'
TMR2IE EQU H'0001'
TMR1IE EQU H'0000'

;----- PIE2 Bits ----------------------------------------------------------

CMIE EQU H'0006'
EEIE EQU H'0004'
BCLIE EQU H'0003'
CCP2IE EQU H'0000'

;----- PCON Bits ----------------------------------------------------------

NOT_POR EQU H'0001'
NOT_BO EQU H'0000'
NOT_BOR EQU H'0000'

;----- SSPCON2 Bits --------------------------------------------------------

GCEN EQU H'0007'
ACKSTAT EQU H'0006'
ACKDT EQU H'0005'
ACKEN EQU H'0004'
RCEN EQU H'0003'
PEN EQU H'0002'
RSEN EQU H'0001'
SEN EQU H'0000'

;----- SSPSTAT Bits -------------------------------------------------------

SMP EQU H'0007'
CKE EQU H'0006'
D EQU H'0005'
I2C_DATA EQU H'0005'
NOT_A EQU H'0005'
NOT_ADDRESS EQU H'0005'
D_A EQU H'0005'
DATA_ADDRESS EQU H'0005'
P EQU H'0004'
I2C_STOP EQU H'0004'
S EQU H'0003'
I2C_START EQU H'0003'
R EQU H'0002'
I2C_READ EQU H'0002'
NOT_W EQU H'0002'
NOT_WRITE EQU H'0002'
R_W EQU H'0002'
READ_WRITE EQU H'0002'
UA EQU H'0001'
BF EQU H'0000'

;----- TXSTA Bits ---------------------------------------------------------

CSRC EQU H'0007'
TX9 EQU H'0006'
NOT_TX8 EQU H'0006' ; Backward compatibility only
TX8_9 EQU H'0006' ; Backward compatibility only
TXEN EQU H'0005'
SYNC EQU H'0004'
BRGH EQU H'0002'
TRMT EQU H'0001'
TX9D EQU H'0000'
TXD8 EQU H'0000' ; Backward compatibility only


;----- CMCON Bits ---------------------------------------------------------
C2OUT EQU H'0007'
C1OUT EQU H'0006'
C2INV EQU H'0005'
C1INV EQU H'0004'
CIS EQU H'0003'
CM2 EQU H'0002'
CM1 EQU H'0001'
CM0 EQU H'0000'

;----- CVRCON Bits --------------------------------------------------------
CVREN EQU H'0007'
CVROE EQU H'0006'
CVRR EQU H'0005'
CVR3 EQU H'0003'
CVR2 EQU H'0002'
CVR1 EQU H'0001'
CVR0 EQU H'0000'

;----- ADCON1 Bits --------------------------------------------------------

ADFM EQU H'0007'
PCFG3 EQU H'0003'
PCFG2 EQU H'0002'
PCFG1 EQU H'0001'
PCFG0 EQU H'0000'

;----- EECON1 Bits --------------------------------------------------------

EEPGD EQU H'0007'
WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'

;================================================= =========================
;
; RAM Definition
;
;================================================= =========================

__MAXRAM H'1FF'
__BADRAM H'8F'-H'90', H'95'-H'97', H'9A'-H'9B'
__BADRAM H'105', H'107'-H'109'
__BADRAM H'185', H'187'-H'189', H'18E'-H'18F'

PsiQ
04.04.2007, 20:56
Ab hier das sprutprogramm


;================================================= =========================
;
; Configuration Bits
;
;================================================= =========================


_CP_OFF EQU H'3FFF'
_DEBUG_OFF EQU H'3FFF'


_LVP_OFF EQU H'3F7F'
_WRT_OFF EQU H'3FFF'


_PWRTE_ON EQU H'3FF7'

_WDT_OFF EQU H'3FFB'
_BODEN_OFF EQU H'3FBF'
_HS_OSC EQU H'3FFE'


LIST


;================================================= =========================
;
; Configuration
;
;================================================= =========================


__CONFIG _CP_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _PWRTE_ON & _WDT_OFF & _BODEN_OFF & _HS_OSC

;************************************************* *************
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0 < Spannung U
;* 1 -
;* 2 -
;* 3 -
;* 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 -
;* 1 -
;* 2 -
;* 3 -
;* 4 -
;* 5 -
;* 6 -
;* 7 -
;*
;************************************************* *************
;
;sprut (zero) Bredendiek 01/2003
;
; Lehrbeispiel: ADC mit LCD
;
; Prozessor 16F876
;
; Prozessor-Takt 10 MHz
;
; LCD am PortB
;************************************************* *********

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

;16 Bit Rechenregister
xw0 equ 0x22 ;
xw1 equ 0x23 ;
f0 equ 0x24 ;
f1 equ 0x25 ;
counter equ 0x26 ;
Fehler equ 0x27 ;
ST equ 0x28 ;
SZ equ 0x29 ;
SH equ 0x2A ;
SE equ 0x2B ;
loops equ 0x2C ; timer für wait
loops2 equ 0x2D ; timer für wait
LcdStatus equ 0x2E ;
LcdDaten equ 0x2F ;


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

Init bsf STATUS, RP0 ; Bank 1
movlw Ini_opt ; pull-up on
movwf OPTION_REG
movlw B'00000000' ; PortB alle outputs
movwf TRISB
bcf STATUS, RP0 ; Bank 0
clrf PORTB
movlw Ini_con ; Interupt disable
movwf INTCON

; ADC initialisieren
; ADC einschalten
BSF ADCON0, 0 ; ADON=1
; ADC-Eingang AN0 auswählen
BCF ADCON0, 5 ; ADCHS2=0
BCF ADCON0, 4 ; ADCHS1=0
BCF ADCON0, 3 ; ADCHS0=0
; ADC speed für 5 ... 20 MHz einstellen
BSF ADCON0, 7 ; ADCS1=1
BCF ADCON0, 6 ; ADCS0=0
; Daten rechtsbündig
BSF STATUS,RP0 ; Bank1
clrf ADCON1
BSF ADCON1, 7 ; ADFM=1
BCF STATUS,RP0 ; Bank0


;Display initialisieren
call InitLcd

Mainloop
call ADC ; Spannung messen nach f1,f0
call mV ; Wandlung in Millivolt nach f1,f0
call B2D ; Wandlung in dezimal nach ST,SH,SH,SE
call Ausgabe ; anzeigen am LCD
goto Mainloop


;************************************************* ****
; Spannung mit ADC messen
; Ergebnis nach F1,f0
ADC
BSF ADCON0, 2 ; ADC starten
ADCloop
BTFSC ADCON0, 2 ; ist der ADC fertig?
GOTO ADCloop ; nein, weiter warten
movfw ADRESH ; obere 2 Bit auslesen
movwf f1 ; obere 2-Bit nach U1H
bsf STATUS,RP0 ; Bank1
movfw ADRESL ; untere 8 Bit auslesen
bcf STATUS,RP0 ; Bank0
movwf f0 ; untere 8-Bit nach U1L
return


;************************************************* ********************
;16 bit Adition, C-Flag bei Überlauf gesetzt
Add16 ; 16-bit add: f := f + xw
movf xw0,W ; xw0 nach W
addwf f0,F ; f0 := f0 + xw0

movf xw1,W ; xw1 nach W
btfsc STATUS,C ; fall ein Überlauf auftrat:
incfsz xw1,W ; xw1+1 nach W
addwf f1,F ; f1 := f1 + xw1

return ; fertig


;************************************************* ****
; 16 Bit Subtraktion, bei Überlauf (neg. Ergebnis) ist C gesetzt
Sub16 ; 16 bit f:=f-xw
clrf Fehler ; extraflags löschen

movf xw0, w ; f0:=f0-xw0
subwf f0, f

btfsc STATUS,C
goto Sub16a
movlw 0x01 ; borgen von f1
subwf f1, f

btfss STATUS,C
bsf Fehler, C ; Unterlauf

Sub16a
movf xw1,w ; f1:=f1-xw1
subwf f1 ,f

btfss STATUS,C
bsf Fehler, C ; Unterlauf

bcf STATUS, C ; C-Flag invertieren
btfsc Fehler, C
bsf STATUS, C
return


;************************************************* ****
; Division durch 2 wird w-mal ausgeführt
; die zu dividierende Zahl steht in xw
Div2
movwf counter ; Anzahl der Divisionen speichern
Div2a ; 16 bit xw:=xw/2
bcf STATUS, C ; carry löschen
rrf xw1, f
rrf xw0, f

decfsz counter, f ; fertig?
goto Div2a ; nein: noch mal
return

;************************************************* ****
; Wandlung des ADC-Wert in Millivolt (binär)
; Der ADC-Wert steht in f1,f0
; Ergebnis steht in f1,f0
mV
; zunächst die Multiplikation mal 5
movfw f0
movwf xw0
movfw f1
movwf xw1
call Add16 ; f := 2xADC
call Add16 ; f := 3xADC
call Add16 ; f := 4xADC
call Add16 ; f := 5xADC

; ADC * 5 nach xw kopieren
movfw f0
movwf xw0
movfw f1
movwf xw1 ; xw := 5xADC

; xw durch 64 dividieren (6 mal durch 2)
; dann ist xw = 5xADC/64
movlw 6
call Div2
call Sub16 ; f := 5xADC - 5xADC/64

; xw auf 5xADC/128 verringern
movlw 1
call Div2
call Sub16 ; f := 5xADC - 5xADC/64 - 5xADC/128
return ; fertig


;************************************************* ****
; Wandlung einer Binärzahl (< 10000) in eine Dezimalzahl
; Die Binärzahl steht in f1,f0
; die Dezimalstellen werden in ST (tausender), SH (hunderter),
; SZ (zehner) und SE (einer) gespeichert im BCD-Code
B2D
; Test auf tausender 1000d = 0x03E8
movlw 0x03
movwf xw1
movlw 0xE8
movwf xw0
call B2Da
movwf ST
; Test auf hunderter 100d = 0x0064
clrf xw1
movlw 0x64
movwf xw0
call B2Da
movwf SH
; Test auf zehner 10d = 0x000A
clrf xw1
movlw 0x0A
movwf xw0
call B2Da
movwf SZ
movfw f0
movwf SE
return

B2Da
clrf counter
B2Sb incf counter, f ; wie oft abgezogen?
call Sub16 ; f:=f-xw
btfss STATUS, C ; zu oft abgezogen?
goto B2Sb ; nein: noch einmal
call Add16 ; f:=f+xw
decf counter, w ; weil immer 1 zuviel gezählt wird
return


;************************************************* ****
;Anzeige der dezimalzahl am LCD mit 'mV'
; input: ST, SH, SZ, SE dezimalstellen im BCD-Code
Ausgabe
movlw B'10000000' ; 1. Zeile
call OutLcdControl
movlw '0' ; 30h = '0011 0000'
iorwf ST, w ; BCD -> ASCII
call OutLcdDaten ; zum LCD
movlw '0'
iorwf SH, w
call OutLcdDaten
movlw '0'
iorwf SZ, w
call OutLcdDaten
movlw '0'
iorwf SE, w
call OutLcdDaten
movlw 'm' ; 'mA' anhängen
call OutLcdDaten
movlw 'V'
call OutLcdDaten
return


;************************************************* ****
;+++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
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


;************************************************* ****
;Zeitverzögerung um loops * 1 ms
; 10 MHz externer Takt bedeutet 2,5 MHz interner Takt
; also dauert 1 ms genau 2500 Befehle
; 250 Schleifen a 10 Befehle sind 2500 Befehle = 1 ms

WAIT
top movlw .250 ; timing adjustment variable (1ms)
movwf loops2
top2 nop ; sit and wait
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


end


Prozessor:
PIC16F876A I/SP