Site Navigation
|
DTMF Display - Source
code
LIST
P=PIC16F84 ; ; ; RAM Page 0
Registers ; INDF EQU
0x0000 TMR0 EQU
0x0001 PCL EQU
0x0002 STATUS EQU
0x0003 FSR EQU
0x0004 PORTA EQU
0x0005 PORTB EQU
0x0006 EEDATA EQU
0x0008 EEADR EQU
0x0009 PCLATH EQU
0x000A INTCON EQU 0x000B ; ;
RAM Page 1 Registers ; OPTION_REG EQU
0x0081 TRISA EQU
0x0085 TRISB EQU
0x0086 EECON1 EQU
0x0088 EECON2 EQU 0x0089 ; ;
STATUS
bits ; C
EQU 00h DC EQU
01h Z EQU
02h PD EQU
03h TO EQU
04h RP0 EQU
05h RP1 EQU
06h IRP EQU
07h ; ; INTCON
bits ; RBIF EQU
00h INTF EQU
01h T0IF EQU
02h RBIE EQU
03h INTE EQU
04h T0IE EQU
05h EEIE EQU
06h GIE EQU
07h ; ; OPTION_REG
bits ; PS0 EQU
00h PS1 EQU
01h PS2 EQU
02h PSA EQU
03h T0SE EQU
04h T0CS EQU
05h INTEDG EQU
06h RBPU EQU 07h ; ;
EECON1
bits ; RD EQU
00h WR EQU
01h WREN EQU
02h WRERR EQU
03h EEIF EQU
04h ; ; SPCE EQU 0Ch
;Space
insert Timer - cleared when DAV =1
PBAFLAG EQU 0Dh
;Push button
Flags ;D0 PBA
Flag ;D1 PBA debounce
Flag ;D2 ;D3 ;D4 ;D5 ;D6
PBD Flag ;D7 PBD
debounce Flag
PBATIM
EQU 00Eh ;PBA Timer for debounce
and Autorepeat PBBTIM
EQU 00Fh ;PBB Timer --
Not used in this code PBCTIM
EQU 010h ;PBC
Timer -- Not used in this
code PBDTIM
EQU 011h ;PBD Timer for debounce
and Autorepeat TICK
EQU 012h ;Tick counter
used for Timing DSPPNTR EQU
013h ;Display Pointer
points to the current Display Starting
point DATPNTR
EQU 0x14 ;Data Pointer points
to the next available memory Location XREG
EQU 0x15
;General purpose Register
YREG
EQU 0x16 ;General purpose
Register WREGINT
EQU 0x17 ;Working register
storage during
interrupts SREGINT
EQU 0x18 ;Status register
storage during interrupts
FLAGA
EQU 0x19 ;General Flags used by
the program ;D0 Rotate -
indicates the buffer has
rotated ;D1 DAV - DAV
from the 145436 has been processed
;D2 Hold
Flag ;D3 ;D4 ;D5 ;D6
;D7 FLAGTMP EQU 0x1A ;---------------------------Data and
settings------------------- BUFSTRT
EQU 0x1C ;Buffer Start
location BUFLEN
EQU 0x34 ;Buffer
Length BUFEND
EQU 0x4F ;Buffer
end BUFEND1
EQU 0x50 ;Buffer end
+1 LCDLEN EQU 0x000F
;LCD first line length set at {lcdlen} 07h for 1*16
char
;disp 0Fh for 2*16 char disp DSPLEN EQU
0x001F ;LCD length set at {dsplen} 0Fh for 1*16 01Fh for
2*16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG
0000h
;
GOTO
INIT
;Jump past
Interrupt
;
NOP
NOP
NOP
GOTO INTHAN ;Interrupt
Handler
; INIT
;Initialise
CLRF PORTA ;
PORTA
CLRF
PORTB
;
PORTB
BSF
STATUS,RP0 ;Switch
bank
MOVLW
0x02
MOVWF PORTA ;TRISA
MOVLW
0xFF
MOVWF PORTB ;TRISB
MOVLW
0xA0
MOVWF INTCON ;Set up Interrupt control
Register
MOVLW 0x81 ;Set up option register - assign
1:4
prescaler
MOVWF TMR0 ;to timer 0, int from clock b, pullups
disabled
BCF STATUS,RP0 ;go back to page
0
CLRF
DSPPNTR
MOVLW
PBBTIM
ADDWF
TICK,w
MOVWF XREG
;LCD initialise Routine - 8 bit
operation with Auto increment
LCDINIT
MOVF
XREG,w
SUBWF
0x12,w
BTFSS
STATUS,Z ;wait for 12 ticks - give LCD
time to Initialise
GOTO
LCDINIT ;After Power
up
;
MOVLW
0x30
CALL WRLCD ;Write 030h to
LCD
;
CALL
DELAY
;
CALL
DELAY
;
CALL
DELAY
;
MOVLW
0x30
CALL WRLCD ;Write 030h to
LCD
;
CALL
DELAY
;
MOVLW 0x30 ;Wriet 030h to
LCD
CALL
WRLCD
;
CALL
DELAY
;
MOVLW 0x38 ;Write 038h to
LCD
CALL
WRLCD
;
CALL
DELAY
;
MOVLW
0x01
CALL WRLCD ;Write 01h to
LCD
;
CALL
DELAY
;
MOVLW
0x0C
CALL WRLCD ;Write 0ch to
LCD
;
CALL
DELAY
;
MOVLW 0x06 ;Write 06h to
LCD
CALL
WRLCD
;
CALL
DELAY
;
MOVLW 0x1C ;Write 01Ch to
LCD
MOVWF FSR BANNER
;LCD should now be
initialised CLRF
INDF
INCF
FSR,f
MOVF
FSR,w
SUBLW
0x50
BTFSS
STATUS,Z
GOTO
BANNER ;Short Delay
;
MOVLW 0x44
;D
CALL
WRBUFF
;
MOVLW 0x54
;T
CALL
WRBUFF
;
MOVLW 0x4D
;M
CALL
WRBUFF
;
MOVLW 0x46
;F
CALL
WRBUFF
;
MOVLW 0x20
;space
CALL
WRBUFF
;
MOVLW 0x44
;D
CALL
WRBUFF
;
MOVLW 0x65
;E
CALL
WRBUFF
;
MOVLW 0x63
;C
CALL
WRBUFF
;
MOVLW 0x6F
;O
CALL
WRBUFF
;
MOVLW 0x64
;D
CALL
WRBUFF
;
MOVLW 0x65
;E
CALL
WRBUFF
;
MOVLW 0x20
;space
CALL
WRBUFF
;
MOVLW 0x56
;V
CALL
WRBUFF
;
MOVLW 0x2D
;-
CALL
WRBUFF
;
MOVLW 0x31
;1
CALL
WRBUFF
;
MOVLW 0x41
;A
CALL
WRBUFF
;
CALL
DISPLAY ;Display contents of
Buffer
;
CLRF FLAGA ;Clear
Flags
CLRF
DSPPNTR ;Clear
Pointers
CLRF
DATPNTR
MOVLW 0x20 ;Insert
Space
CALL
WRBUFF
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; START
;Start Program
core
CALL INPUTB ;Ensure
data bus
HIz
;
BCF PORTA,4 ;Deselect
LCD
BSF PORTA,0
;select P.B and
145436
BTFSS PORTA,1 ;check
DAV from
145436
GOTO NODAV ;If no
DAV
;
CLRF SPCE ;Clear Space
Counter
BSF FLAGA,3 ;Set Space
Flag
BTFSC FLAGA,1 ;Check if DAV already
serviced
GOTO PBA ;If DAV already
serviced
BSF FLAGA,1 ;set DAV service
flag
SWAPF
PORTB,w
;read data from
145436
CALL ASCII ;Call ASCII translation
routine
CALL WRBUFF ;Write result to
buffer
BTFSC
FLAGA,4 ;check
flag
GOTO
ad0073
;if
set
;
MOVF
DSPPNTR,w ;check if data pointer has reached
SUBWF
DATPNTR,w ;the end of the
buffer
SUBLW
0x11
BTFSS
STATUS,Z
GOTO
ad0075
;If
not
;
BSF FLAGA,4 ;If so set the
flag ad0073
BTFSS
FLAGA,2 ;check
FLAG,2
CALL DISPINC ;increment the display
pointer
; ad0075
CALL
DISPLAY
;Update
display
GOTO PBA NODAV
BCF
FLAGA,1 ;ensure DAV
flag is clear ;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - PBA
;BACK Space button
CALL
INPUTB
;Set data bus to
HIz
;
MOVLW 0x01 ;enable PB buffer and
145436
MOVWF
PORTA
BTFSS
PORTB,0 ;Check if PBA
pressed
GOTO
PBAdbce ;if not
pressed
BTFSC PBAFLAG,1 ;check PBA debounce
flag
GOTO PBB ;If
set
BTFSC PBAFLAG,0 ;check PBA
flag
GOTO
PBAauto ;if
set
BSF
PBAFLAG,0 ;set PBA
flag
MOVLW 0xFF ;load PBA autorepeat
timer
MOVWF
PBATIM ;with
0FFh
CALL DISPDEC ;scroll back 1 Character
CALL DISPLAY
;Then update
Display
GOTO PBB ;Goto PB
B
; PBAauto
MOVF PBATIM,f
;Check if Autorepeat
Timer
BTFSS
STATUS,Z ;has timed
out
GOTO PBB ;If
not
MOVLW 0x5F ;Reload
MOVWF
PBATIM ;Autorepeat
Timer
CALL
DISPDEC ;Go back 1
character
CALL
DISPLAY ;Update
Display
GOTO PBB ;Process next
key
; PBAdbce
;PBA
Debounce
BTFSS
PBAFLAG,0 ;check PBA
flag
GOTO PBB ;If not
set
MOVLW 0x0A ;load debounce
timer
MOVWF
PBATIM
BCF
PBAFLAG,0 ;Clear PBA
flag
BSF
PBAFLAG,1 ;Set debounce
timer PBB
;HOLD button
CALL INPUTB
;Set data bus to
HIz
;
MOVLW 0x01 ;enable PB buffer and
145436
MOVWF
PORTA
BTFSS PORTB,1 ;Check if PBB
pressed
GOTO PBBCLR ;If not
pressed
;
BSF FLAGA,2 ;set hold (PBB)
flag
GOTO PBC ;then goto
; PBBCLR
BCF
FLAGA,2 PBC
;CLEAR button
CALL INPUTB
;data bus to
HIz
;
MOVLW 0x01 ;Read PB buffer and
145436
MOVWF
PORTA
BTFSC PORTB,2 ;Check if PBC
pressed
GOTO CLRBUF ;If
pressed PBD
;FORWARD
button
CALL
INPUTB
;
MOVLW 0x01 ;Read PB buffer and
145436
MOVWF
PORTA
BTFSS
PORTB,3 ;check
PBD
GOTO PBDdbnce ;If not
pressed
BTFSC
PBAFLAG,7 ;Check PBD Debounce
flag
GOTO PBDend ;If
set
;
BTFSC
PBAFLAG,6 ;check PBD
flag
GOTO PBDauto ;If set
;
BSF PBAFLAG,6 ;Set PBD
flag
MOVLW 0xFF ;Load autorepeat
Timer
MOVWF PBDTIM
;
CALL DISPINC ;Move display one step forward
CALL DISPLAY ;Update
Display
GOTO PBDend PBDauto
MOVF PBDTIM,f ;check
Autorepeat
Timer
BTFSS
STATUS,Z
GOTO PBDend ;If not
zero
;
MOVLW
0x5F
MOVWF
PBDTIM
CALL
DISPINC
;
CALL
DISPLAY
;
GOTO
PBDend
; PBDdbnce
BTFSS PBAFLAG,6
;Check PBD
flag
GOTO PBDend ;If not
set
MOVLW 0x0A ;Load PBD debounce
timer
MOVWF
PBDTIM
BCF PBAFLAG,6 ;clear PBD
flag
BSF PBAFLAG,7 ;Set PBD debounce
flag PBDend
GOTO START
;end of core code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Clears
Buffer then clears
Display ;Calls WRBUFF,DISPLAY ;Uses DSPPNTR,DATPNTR,FLAGA
CLRBUF
CLRF FLAGA ;Clear
Flags
CLRF DSPPNTR ;and Display
Pointer
CLRF DATPNTR ;and Data
Pointer
MOVLW
0x20
CALL WRBUFF ;Write blank into Data
location
;
CALL DISPLAY ;And update (clear) the
Display
;
GOTO
START ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Interrupt
Handler ;Calls DISPINC,WRBUFF, ;Uses WREGINT,SREGINT,TICK,PBATIM,PBBTIM,PBCTIM,PBDTIM,PBAFLAG,FLAGA,SPCE
INTHAN
MOVWF WREGINT
;Save W
register
SWAPF
STATUS,w ;stash Ststus in
W
BCF
STATUS,RP0 ;change
Pages
MOVWF
SREGINT ;Stash Status (from W) into
SREGINT
MOVLW
0xE8
MOVWF
TMR0 ;Reload
Timer
BCF
INTCON,T0IF ;Re enable
Interrupt
INCF TICK,f ;Increment the Tick
Register
BTFSS
TICK,0 ;check if bits 0 and 1 of the
Tick
BTFSC TICK,1 ;counter are clear (ie every 4th
Interrupt)
GOTO EXINT ;if
not
DECF PBATIM,f ;Decrement PBA
Timer
BTFSC
STATUS,Z
BCF PBAFLAG,1 ;If PBATIM=0 clear the debounce
bit
DECF PBBTIM,f ;Decrement PBB
Timer
BTFSC
STATUS,Z
BCF PBAFLAG,3 ;Clear PBB Debounce bit if
0
DECF PBCTIM,f ;Decrement PBC
Timer
BTFSC
STATUS,Z
BCF PBAFLAG,5 ;Clear PBC Debounce bit if
zero
DECF PBDTIM,f ;Decrement PBD
timer
BTFSC
STATUS,Z
BCF PBAFLAG,7 ;clear PBD Debounce bit if
zero
BTFSC TICK,2 ;ie Every Eigth
interrupt
GOTO EXINT
;
BTFSS
FLAGA,3
GOTO
EXINT
DECF
SPCE,f
BTFSS
STATUS,Z
GOTO
EXINT
BCF
FLAGA,3
MOVLW
0x20
CALL
WRBUFF
BTFSS
FLAGA,2
CALL DISPINC EXINT
SWAPF
SREGINT,w
MOVWF
STATUS
SWAPF
WREGINT,f
SWAPF
WREGINT,w
RETFIE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Devolopment
Code - Test routine -retained for Checksum - delete after
kit ;development debug
CLRF
PORTA
MOVLW
0x80
MOVWF
PORTB
CALL
OUTPUT
;
BCF
PORTA,3
BCF
PORTA,2
BSF
PORTA,4
NOP
NOP
BCF
PORTA,4
BCF
PORTA,2
CALL
LCDWAIT
;
BSF
PORTA,2
MOVLW
0x48
MOVWF PORTB
BSF
PORTA,4
NOP
NOP
BCF
PORTA,4
CALL
LCDWAIT
;
CALL
OUTPUT
;
MOVLW
0x49
MOVWF
PORTB
BSF
PORTA,4
NOP
NOP
BCF
PORTA,4
CALL
LCDWAIT
;
CALL
OUTPUT
;
RETURN
;Waits 512
ticks Delay512
MOVLW
0xFF
MOVWF XREG ad010F
CALL
DELAY
;
CALL
DELAY
;
DECF
XREG,f
BTFSS
STATUS,Z
GOTO
ad010F
;
RETURN
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Delay
routine - waits for 1-2 'Ticks' - note changes Tick
counter ;Calls nil ;Uses TICK
DELAY
MOVLW
0xFE
MOVWF TICK DEL1
MOVF
TICK,f
BTFSS
STATUS,Z
GOTO
DEL1
;
RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Write
data to Buffer - update display and data
pointers ;Calls DISPINC ;Uses XREG,DATPNTR,BUFSTRT,FLAGA,DSPPNTR
WRBUFF
MOVWF
XREG
MOVF
DATPNTR,w ;Load the Data
pointer
ADDLW BUFSTRT ;and add the memory
offset
MOVWF FSR ;Move the result to the
FSR
MOVF XREG,w ;Move Data to the W
register
MOVWF INDF ;then write it to the INDF
register
INCF DATPNTR,f ;Increment the data
pointer
MOVLW BUFLEN ;load the buffer
length
SUBWF
DATPNTR,w ;subtract from the data
pointer
BTFSS STATUS,Z ;check if 0 (ie end of
buffer
GOTO ad0128 ;if
not
CLRF DATPNTR ;clear the Data pointer (rotate the
buffer)
BSF FLAGA,0 ;Set the Rotate
flag ad0128
MOVF
DSPPNTR,w ;
SUBWF
DATPNTR,w ;check if the Data pointer and the Display
BTFSS
STATUS,Z ;pointer are the
same
GOTO ad012E ;If
not
CALL
DISPINC ;If so Increment the Display
pointer
BSF FLAGA,2 ;and Set the ~~
Flag ad012E
RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Increments
the Display
Pointer ;Calls Nils ;Uses DATPNTR,DSPPNTR,FLAGA
DISPINC
DECF
DATPNTR,w
SUBWF DSPPNTR,w ;Compare DATPNTR-1 with
DSPPNTR
BTFSC
STATUS,Z
RETURN
;If equal (end of
Display)
INCF DSPPNTR,f ;Increment Display
Pointer
MOVLW BUFLEN ;Check if the Display buffer needs to
SUBWF
DSPPNTR,w
;Rotate
BTFSS
STATUS,Z
RETURN
;If not
Return
MOVF
DATPNTR,f
BTFSS STATUS,Z ;Check if Data Pointer is
Zero
GOTO DISPROT ;If
not
DECF DSPPNTR,f ;If so back off the display
pointer
RETURN
;And
return DISPROT
CLRF DSPPNTR
;Rotate the Display
pointer
RETURN
;And
return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;Calls :Nil ;Uses ;DSPPNTR,DATPNTR,FLAGA
DISPDEC
MOVF DSPPNTR,f ;Load the Display
pointer
BTFSS STATUS,Z ;check if
zero
GOTO ad014B ;If
not
BTFSS FLAGA,0 ;Check rotate Flag
RETURN
;If the buffer has not rotated
;
MOVF DATPNTR,w ;Load the Data
pointer
SUBLW BUFLEN ;check if it is at the end of
the
BTFSC STATUS,Z
;buffer
RETURN
;If so (Display pointer cannot =
datapointer)
;
MOVLW BUFLEN ;If not rotate the Display pointer
MOVWF
DSPPNTR
RETURN
;Then
Return ad014B
INCF DATPNTR,w
;Check if Datapointer = Display
pointer-1
SUBWF
DSPPNTR,w
BTFSC STATUS,Z ;If so do not allow the Display pointer to
equal
RETURN
;the data
pointer
;
DECF DSPPNTR,f ;Decrement the Display pointer and
Return
RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;sets
the data bus to high
impedance ;Calls Nil ;Uses Nil
INPUTB
BSF STATUS,RP0 ;change to page
1
MOVLW 0xFF ;set all the bits for
TRISB
MOVWF PORTB
;
BCF STATUS,RP0 ;Return to page
0
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Outputs
Data to the Data
bus ;Calls Nil ;Uses Nil OUTPUT
BSF
STATUS,RP0 ;go to page
1
CLRF PORTB ;clear all the TRISB
bits
BCF STATUS,RP0 ;go back to page
0
RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Hex
to ASCII Translational Routine - Translates lower nibble in W
register ;into an ASCII Value in the W register according to the
results from the ;DTMF
decoder ;Calls Nil ;Uses Nil
ASCII
ANDLW
00Fh
MOVWF
XREG
MOVF
XREG,f
BTFSC
STATUS,Z
RETLW
0x44
; b'01000100'
'D'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x31
; b'00110001'
'1'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x32
; b'00110010'
'2'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x33
; b'00110011'
'3'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x34
; b'00110100'
'4'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x35
; b'00110101'
'5'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x36
; b'00110110'
'6'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x37
; b'00110111'
'7'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x38
; b'00111000'
'8'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x39
; b'00111001'
'9'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x30
; b'00110000'
'0'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x2A
; b'00101010'
'*'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x23
; b'00100011'
'#'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x41
; b'01000001'
'A'
DECF
XREG,f
BTFSC
STATUS,Z
RETLW
0x42
; b'01000010'
'B'
RETLW
0x43
; b'01000011' 'C'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Display
Routine - Displays data in the buffer
;Calls INPUTB,LCDWAIT,OUTPUT ;Uses FLAGA,FLAGTMP,DATPNTR,BUFSTRT,DSPPNTR,YREG
DISPLAY
CLRF
PORTA
CLRF
YREG
MOVF
FLAGA,w
MOVWF FLAGTMP ;Temporarily store the
Flags
BCF
FLAGTMP,7
MOVLW
0x80
MOVWF PORTB ;goto DD Ram Address
00h
CALL
OUTPUT
;
BCF
PORTA,3
BCF
PORTA,2
BSF PORTA,4 ;Write to
LCD
NOP
NOP
BCF
PORTA,4
BCF
PORTA,2
CALL LCDWAIT ;Wait until LCD
ready
MOVF
DATPNTR,w
ADDLW BUFSTRT ; Add data Pointer to Buffer
start
MOVWF XREG ;And stash in
Xreg
MOVF
DSPPNTR,w
ADDLW
BUFSTRT
MOVWF FSR ;Move Dsplay pointer + Buffer start to
FSR ad01A0
MOVF
XREG,w
SUBWF FSR,w ;Check if equal to Data pointer
+ buffer
offset
BTFSC
STATUS,Z
BSF FLAGTMP,7 ; If so set end of Valid data
flag
BTFSC
FLAGTMP,7 ;check if end of Valid data flag
set
GOTO ad01B9 ;If so goto Insert
Space
MOVF INDF,w ;read data from
INDF
MOVWF PORTB ;Move to Data
bus
CLRF PORTA
;
BSF
PORTA,2
CALL OUTPUT ;Output data bus
BSF
PORTA,4
NOP
NOP
CLRF PORTA ;write to
LCD
CALL LCDWAIT ;wait for LCD
CALL INPUTB ;Return bus to High
impedance
INCF FSR,f ;Increment
FSR
MOVLW BUFFEND1 ;Check if
SUBWF FSR,w ;Past the
BTFSS STATUS,Z ;End of the
buffer
GOTO ad01C3 ;If not
MOVLW BUFSTRT ;If so reload the
MOVWF FSR ;FSR with the buffer start
location
GOTO ad01C3 ;and go to ~~
ad01B9
; write spaces to LCD - over write any
exsisting data
MOVLW
0x20
MOVWF PORTB ; Output ASCII Space to the Data
bus
CLRF
PORTA
BSF
PORTA,2
CALL OUTPUT
BSF PORTA,4 ; Write to
LCD
NOP
NOP
CLRF PORTA
CALL LCDWAIT ;Wait for LCD
ad01C3
CLRF PORTA
;
INCF YREG,f ;Increment Yreg (Display character
counter)
MOVLW 0x08 ; Check of Display is up to the
SUBWF YREG,w ;9th
character
BTFSS
STATUS,Z
GOTO ad01D2 ;If not
MOVLW 0xC0 ; If so jump
to
MOVWF PORTB ;DD Ram location
CALL OUTPUT ;0C0h
BSF
PORTA,4
NOP
NOP
BCF
PORTA,4
CALL LCDWAIT ;Wait for the LCD
GOTO ad01A0 ; Then go on to next character
ad01D2
MOVLW 0x10 ;Check if at the end of the display ~~
010h
(17d)
SUBWF
YREG,w
BTFSC
STATUS,Z
RETURN ; If so end
Call
GOTO ad01A0 ; If not get the next
Character
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Writes
data in W register to
LCD ;Calls OUTPUT,INPUTB ;Uses PBCTIM,
WRLCD
MOVWF
PORTB
CALL
OUTPUT
MOVLW
0x10
MOVWF
PORTA
NOP
NOP
CLRF
PORTA
CALL
INPUTB
RETURN LCDWAIT
;Wait for LCD
CALL INPUTB ; Set Data bus to
input
BSF PORTA,3
BCF PORTA,2
BSF
PORTA,4
BTFSS PORTB,7 ;Check Bit 7 of data from
LCD
GOTO ENDWAIT
;
;
BCF
PORTA,4
GOTO LCDWAIT
ENDWAIT
BCF
PORTA,4
BCF
PORTA,3
BSF
PORTA,2
CALL
OUTPUT
RETURN
end
Kit includes:
PCB
|