;*******************************
;;8x8 Module.asm
;
; 23-6-2013
;*******************************
list p=12F629
radix dec
include "p12f629.inc"
errorlevel -302 ; Don't complain about
;BANK 1 Registers during assembly
__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
;_MCLRE_OFF - master clear must be off for gp3 to work as input pin
;****************************************************************
; variables - names and files
;****************************************************************
Cblock 20h
temp1 ;used in delays
temp2 ;used in delays
temp3 ;used in EEPROM data fetching
temp4 ;used in EEPROM data fetching
temp5 ;used in EEPROM data fetching
temp6 ;used in EEPROM data fetching
current ;holds current EEPROM location
letters ;letters holds the number of letters in EEPROM
serial
address
_data
jump ;table1 jump value
columns ;for 6 columns
Sw_Flag ;detecting sw-press
eefile ;total number of characters in EEPROM
endc
;****************************************************************
;Equates
;****************************************************************
status equ 0x03
rp1 equ 0x06
rp0 equ 0x05
GPIO equ 0x05
status equ 03h
option_reg equ 81h
; bits on GPIO
pin7 equ 0 ;GP0 LED - flashes to indicate key number
pin6 equ 1 ;GP1 Data to 8x8 Module
pin5 equ 2 ;GP2 Chip Select
pin4 equ 3 ;GP3
pin3 equ 4 ;GP4 Clock
pin2 equ 5 ;GP5 4 switches
;bits
rp0 equ 5 ;bit 5 of the status register
;****************************************************************
;Beginning of program
;****************************************************************
org 0x00
goto SetUp
;****************************************************************
;Table
;****************************************************************
table1 addwf 02h,1 ;add W to program counter
dt 7Eh,09h,09h,09h,7Eh,00h ;A
dt 7Fh,49h,49h,49h,36h,00h ;B
dt 3Eh,41h,41h,41h,22h,00h ;C
dt 7Fh,41h,41h,22h,1Ch,00h ;D
dt 7Fh,49h,49h,41h,00h,00h ;E
dt 7Fh,09h,09h,01h,00h,00h ;F
dt 3Eh,41h,49h,49h,3Ah,00h ;G
dt 7Fh,08h,08h,08h,7Fh,00h ;H
dt 7Fh,00h,00h,00h,00h,00h ;I
dt 20h,40h,40h,3Fh,00h,00h ;J
dt 7Fh,08h,14h,22h,41h,00h ;K
dt 7Fh,40h,40h,40h,00h,00h ;L
dt 7Fh,06h,18h,18h,06h,7Fh ;M
dt 7Fh,02h,0Ch,18h,20h,7Fh ;N
dt 3Eh,41h,41h,41h,3Eh,00h ;O
dt 7Fh,09h,09h,09h,06h,00h ;P
dt 1Eh,21h,31h,21h,5Eh,00h ;Q
dt 7Fh,09h,19h,29h,46h,00h ;R
dt 26h,49h,49h,49h,32h,00h ;S
dt 01h,01h,7Fh,01h,01h,00h ;T
dt 3Fh,40h,40h,40h,3Fh,00h ;U
dt 0Fh,30h,40h,30h,0Fh,00h ;V
dt 3Fh,40h,38h,40h,3Fh,00h ;W
dt 63h,14h,08h,14h,63h,00h ;X
dt 03h,0Ch,70h,0Ch,03h,00h ;Y
dt 61h,51h,49h,45h,43h,00h ;Z
dt 42h,7Fh,40h,00h,00h,00h ;1
dt 72h,49h,49h,49h,46h,00h ;2
dt 22h,41h,49h,49h,36h,00h ;3
dt 18h,14h,12h,7Fh,10h,00h ;4
dt 2Fh,49h,49h,49h,31h,00h ;5
dt 3Eh,49h,49h,49h,32h,00h ;6
dt 01h,71h,09h,05h,03h,00h ;7
dt 36h,49h,49h,49h,36h,00h ;8
dt 26h,49h,49h,49h,3Eh,00h ;9
dt 00h,00h,00h,00h,00h,00h ;space (0D8h)
;****************************************************************
;Set Up
;****************************************************************
SetUp bsf status, rp0 ;Bank 1
movlw b'11001000' ;Set TRIS GP0,1,2,4,5 out GP3 not used
movwf TRISIO
bcf status, rp0 ;bank 0
movlw 07h ;turn off Comparator ports
movwf CMCON ;must be placed in bank 0
clrf GPIO ;Clear GPIO of junk
clrf jump
clrf 40h ;clear files for RUN
clrf 41h
clrf 42h
clrf 43h
clrf 44h
clrf 45h
clrf 46h
clrf 47h
;Delete EEPROM Data - pressing "RUN" before switch-ON
;deletes DATA by zeroing the number of letters in address 07h
call SwPressed
btfss Sw_Flag,4 ;see if "Run" switch pressed
goto Main ;not pressed
movlw 7Fh
bsf status,rp0 ;select bank1
movwf eeadr
bcf status,rp0 ;select bank0
clrw
bsf status,rp0 ;select bank1
movwf eedata
bcf status,rp0 ;select bank0
call write
call SwPressed
btfsc Sw_Flag,4 ;see if "Run" switch not pressed
goto $-2
goto Main
;****************************************************************
;* Delays *
;****************************************************************
_6uS goto $+1
retlw 00
_12uS goto $+1
goto $+1
goto $+1
goto $+1
retlw 00
_1mS nop
decfsz temp1,f
goto $-2
retlw 00
_10mS movlw .10
movwf temp2
call _1mS
decfsz temp2,f
goto $-2
retlw 00
_50mS movlw .50
movwf temp2
_50 nop
decfsz temp1,f
goto _50
decfsz temp2,f
goto _50
retlw 00
_100mS movlw .100
movwf temp2
_100 nop
decfsz temp1,f
goto _100
decfsz temp2,f
goto _100
retlw 00
;****************************************************************
;* Sub Routines *
;****************************************************************
Dec_Jump
decf jump,f
decf jump,f
decf jump,f
decf jump,f
decf jump,f
decf jump,f
retlw 00
;creates blank column 1,data for cols:234567 and blank col8
Display
movlw 0D8h ;Look for end of table
xorwf Jump,w
btfss status,z ;zero bit will be set if the same
goto $+2
clrf jump ;start at top of table
clrf address
incf address,1 ;col1 = address 1
clrf _data
call Load
movlw 6
movwf columns ;load counter for 6 columns
incf address,1
movf Jump,w ;move jump value into w
call table1 ;get jump value for table1
movwf _data ;load data from table1 into _data
call Load
incf jump,1 ;increment jump value for table1
decfsz columns,f
goto $-7
incf address,1 ;col8 = address 8
clrf _data
call Load
retlw 00
;send 16 bits to 8x8 Module
;address 0 - 7 for columns
;and data for each column
Load bcf gpio,2 ;open chip to receive address and data
movlw 8
movwf serial ;load loop counter with 8 to transfer 8 bits
movf address,w
movwf temp3
rlf temp3,f ;move bit through carry
rlf temp3,f ;move bit to bit0 position
btfss temp3,0 ;these 3 instructions are very clever!!!!
bcf gpio,1 ;to send LOW data bit
btfsc temp3,0 ;see if the lowest bit is 0 or 1
bsf gpio,1 ;to send HIGH data bit
rlf temp3,f ;put here to separate two gpio commands
bsf gpio,4 ;clock HIGH
call _12uS ;must have small delay between bsf and bcf
bcf gpio,4 ;clock LOW to lock-in data bit
decfsz serial,f
goto $-9
;send 8 bits DATA
movlw 8
movwf serial ;load loop counter with 8 to transfer 8 bits
rlf _data,f ;move bit 7 to bit 0 position
rlf _data,f
btfss _data,0
bcf gpio,1 ;to send LOW data bit
btfsc _data,0 ;see if the lowest bit is 0 or 1
bsf gpio,1 ;to send HIGH data bit
rlf _data,f ;put here to separate two gpio commands
bsf gpio,4 ;clock HIGH
call _12uS
bcf gpio,4 ;clock LOW to lock-in data bit
decfsz serial,f
goto $-9
bsf gpio,2 ;close chip
retlw 00
;create non-shutdown mode
noshutdown
bcf gpio,2 ;open chip to receive address and data
movlw 8
movwf serial ;load loop counter with 8 to transfer 8 bits
movlw 0Ch ;0Ch accesses shutdown register
movwf address
rlf address,f ;move bit 7 to bit 0 position
rlf address,f
btfss address,0 ;these 3 instructions are very clever!!!!
bcf gpio,1 ;to send LOW data bit
btfsc address,0 ;see if the lowest bit is 0 or 1
bsf gpio,1 ;to send HIGH data bit
rlf address,f ;put here to separate two gpio commands
bsf gpio,4 ;clock HIGH
call _12uS
bcf gpio,4 ;clock LOW to lock-in data bit
decfsz serial,f
goto $-9
movlw 8
movwf serial ;load loop counter with 8 to transfer 8 bits
movlw 7 ;1 needed in data register for normal operation
movwf _data ;
rlf _data,f ;move bit 7 to bit 0 position
rlf _data,f
btfss _data,0
bcf gpio,1 ;to send LOW data bit
btfsc _data,0 ;see if the lowest bit is 0 or 1
bsf gpio,1 ;to send HIGH data bit
rlf _data,f ;put here to separate two gpio commands
bsf gpio,4 ;clock HIGH
call _12uS
bcf gpio,4 ;clock LOW to lock-in data bit
decfsz serial,f
goto $-9
bsf gpio,2 ;close chip
retlw 00
;Run - scrolls message across screen data held in 40h to 4Fh
Run movlw 7Fh ;get number of letters from EEPROM 7Fh
bsf status,rp0 ; select bank 1
movwf eeadr ; look at 7Fh
bsf eecon1,rd ; initiate the read
movf eedata,w ; put the read data into w
bcf status,rp0 ;
movwf letters ;letters holds the number of letters
RunAA clrf current ;holds current EEPROM location
RunA movf current,w ;first location in EEPROM
bsf status,rp0 ; select bank 1
movwf eeadr ; look at 00h
bsf eecon1,rd ; initiate the read
movf eedata,w ; put the read data into w
bcf status,rp0 ;
movwf temp5 ;temp5 holds table jump value
movf current,w ;end of message?
xorwf letters,w
btfsc status,z ;zero bit will be set if the same
goto RunAA ;go to start of message
movlw 6
movwf temp6 ;6 columns for each letter
RunB movf temp5,w ;put jump-value into w
call table1
movwf 48h ;put column-value into ghost column
call Shift ;create "running effect"
movlw 40h
movwf 4 ;fsr for indirect addressing
clrf address ;col1 = address 1
movlw 8
movwf columns ;load counter for 8 columns
incf address,f ;for column 1
movf 0,w ;move data from file 40h into w
movwf _data ;move data to _data file
call Load
incf 4,f ;increment FSR to look at file 41h
decfsz columns,f
goto $-6
call noshutdown ;tell8x8 to illuminate display
call Scancols ;tell 8x8 to scan 8 columns
call _100mS
call _100mS
incf temp5,f ;jump value for each letter
decfsz temp6,f ;loop counter for 6 columns
goto RunB
incf current,f
goto RunA
;scan all columns
Scancols
bcf gpio,2 ;open chip to receive address and data
movlw 8
movwf serial ;load loop counter with 8 to transfer 8 bits
movlw 0Bh ;0Bh accesses scan-limit register
movwf temp4
rlf temp4,f ;move bit 7 to bit 0 position
rlf temp4,f
btfss temp4,0 ;these 3 instructions are very clever!!!!
bcf gpio,1 ;to send LOW data bit
btfsc temp4,0 ;see if the lowest bit is 0 or 1
bsf gpio,1 ;to send HIGH data bit
rlf temp4,f ;put here to separate two gpio commands
bsf gpio,4 ;clock HIGH
call _12uS
bcf gpio,4 ;clock LOW to lock-in data bit
decfsz serial,f
goto $-9
movlw 8
movwf serial ;load loop counter with 8 to transfer 8 bits
movlw 7 ;7 is needed to scan 8 columns
movwf temp4
rlf temp4,1 ;move bit 7 to bit 0 position
rlf temp4,1
btfss temp4,0
bcf gpio,1 ;to send LOW data bit
btfsc temp4,0 ;see if the lowest bit is 0 or 1
bsf gpio,1 ;to send HIGH data bit
rlf temp4,f ;put here to separate two gpio commands
bsf gpio,4 ;clock HIGH
call _12uS
bcf gpio,4 ;clock LOW to lock-in data bit
decfsz serial,f
goto $-9
bsf gpio,2 ;close chip
retlw 00
;shift columns to the LEFT also removes blank columns
Shift movf 41h,w ;shift columns to the left
movwf 40h
movf 42h,w
movwf 41h
movf 43h,w
movwf 42h
movf 44h,w
movwf 43h
movf 45h,w
movwf 44h
movf 46h,w
movwf 45h
movf 47h,w
movwf 46h
movf 48h,w
movwf 47h
retlw 00
;SwPressed sets bit 4, 3, 2, 1 in switch-flag
SwPressed
clrf Sw_Flag ;clear the switch flag
bsf status, rp0 ;Bank 1 (see if switch is pressed)
bcf TRISIO,5 ;clear bit GPIO,5 as output to charge cap.
bcf status, rp0 ;bank 0
bsf gpio,5 ;make pin2 HIGH to charge cap.
call _10mS ;charge cap
bsf status, rp0 ;Bank 1
bsf TRISIO,5 ;set TRIS GP0,5 to detect discharged cap
call _1mS ;create a delay to see if no sw pressed
btfss gpio,5
goto $+3
bsf Sw_Flag,7 ;no switch pressed
retlw 00
bsf status, rp0 ;Bank 1
bcf TRISIO,5 ;clear bit GPIO,5 as output to charge cap.
bcf status, rp0 ;bank 0
bsf gpio,5 ;make pin2 HIGH to charge cap.
call _10mS ;charge cap
bsf status, rp0 ;Bank 1
bsf TRISIO,5 ;set TRIS GP0,5 to detect discharged cap
bcf status, rp0 ;bank 0
call _12uS
call _12uS
call _12uS
call _6uS
btfsc gpio,5
goto $+3
bsf Sw_Flag,4
retlw 00
call _12uS
btfsc gpio,5
goto $+3
bsf Sw_Flag,3
retlw 00
call _12uS
call _6uS
btfsc gpio,5
goto $+3
bsf Sw_Flag,2
retlw 00
call _12uS
btfss gpio,5
bsf Sw_Flag,1
retlw 00
;Sw3 = STORE - stores address of character (table1) into EEPROM
;eefile - total number of characters in EEPROM 217Fh
;eedata will be jump value
;eeadr will be zero at start-up
Store
;look at 7Fh in EEPROM
movlw 7Fh ;get location in EEPROM for storing next value
bsf status,rp0 ; select bank 1
movwf eeadr ; look at 7Fh
bsf eecon1,rd ; initiate the read
movf eedata,w ; put the read data into w
bcf status,rp0 ;
movwf eefile ;and move to eefile
movf eefile,w ;starts at 0 for EEPROM 1st location
bsf status,rp0 ;select bank1
movwf eeadr
bcf status,rp0 ;select bank0
call Dec_Jump
movf jump,w ;dec jump 6 times to get start of letter
bsf status,rp0 ;select bank1
movwf eedata
bcf status,rp0 ;select bank0
call write
incf eefile,f ;increment to store in next EEPROM location
movlw 7Fh ;store in EEPROM last location
bsf status,rp0 ;select bank1
movwf eeadr
bcf status,rp0 ;select bank0
movf eefile,w ;store the number of letters
bsf status,rp0 ;select bank1
movwf eedata
bcf status,rp0 ;select bank0
call write
retlw 00
write bsf status,rp0 ;select bank1
bsf eecon1,wren ;enable write
movlw 55h ;unlock codes
movwf eecon2
movlw 0aah
movwf eecon2
bsf eecon1,wr ;write begins
bcf status,rp0 ;select bank0
writeA btfss pir1,eeif ;wait for write to complete
goto writeA
bcf pir1,eeif
bsf status,rp0 ;select bank1
bcf eecon1,wren ;disable other writes
bcf status,rp0 ;select bank0
retlw 00
;****************************************************************
;* Main *
;****************************************************************
Main
clrf Sw_Flag ;clear the switch flag
call Display ;creates blank col1,
;data for cols:234567 and blank col8
call noshutdown
call Scancols
clrf Sw_Flag ;go to here for looping
call SwPressed
btfss Sw_Flag,7 ;see if no switch pressed
goto $+2 ;sw pressed
goto $-4 ;no sw pressed
btfss Sw_Flag,1 ;see if "Forward" switch pressed
goto $+7 ;see if other switch pressed
Main1 call Display
clrf Sw_Flag
call SwPressed
btfss Sw_Flag,7 ;see if no switch pressed
goto $-3
goto $-.12
btfss Sw_Flag,2 ;see if "Back" switch pressed
goto $+9
call Dec_Jump
call Dec_Jump
movlw 0FAh
xorwf Jump,w
btfss status,z ;zero bit will be set if the same
goto $+3
movlw 0D2h ;address of last letter
movwf jump ;go to bottom of table
btfss Sw_Flag,3 ;see if "Store" switch pressed
goto $+2
call Store
btfss Sw_Flag,4 ;see if "Run" switch pressed
goto Main1
call Run
;****************************************************************
;*EEPROM Values to burn into EEPROM *
;****************************************************************
org 2100h ;org 2100h means the next byte of data will
;>be at location 00 in EEPROM
de 00h ;de means Data EEPROM
org 217Fh
de 00h ;newly burnt chip:
;00 for number of char in EEPROM
END
|