289 lines
6.9 KiB
NASM
289 lines
6.9 KiB
NASM
|
|
; define ram ports and data ; ************************* ;
|
|
DEFINE PORT
|
|
; ***********
|
|
;DEFINE PORTS
|
|
;************
|
|
gp0 equ 0
|
|
gp1 equ 1
|
|
gp2 equ 2
|
|
gp3 equ 3
|
|
gp4 equ 4
|
|
gp5 equ 5
|
|
|
|
;DISPLAY PORT
|
|
;************
|
|
disp_data equ gp0
|
|
disp_clk equ gp1
|
|
disp_strobe equ gp2
|
|
|
|
;KEYBOARD PORT
|
|
;*************
|
|
;units_key equ gp3
|
|
;tens_key equ gp4
|
|
;RELAY PORT
|
|
;**********
|
|
relay equ gp5
|
|
|
|
;*******************************************************
|
|
;DEFINE RAM
|
|
units equ 08h ;minutes unit display
|
|
tens equ units+1 ;minutes tens display
|
|
counter_4ms equ tens+1 ;incremented every 4 msec
|
|
counter_100ms equ counter_4ms+1 ;incremented every 100 msec
|
|
seconds equ counter_100ms+1
|
|
oldkey equ seconds+1 ;for key debouncing
|
|
newkey equ oldkey+1 ;-------- ,, ------
|
|
key equ newkey+1 ;key pressed data
|
|
digit_inc equ key+1 ;inc units display if bo = 1
|
|
|
|
;inc tens display if b1 = 1
|
|
tmr_comp equ digit_inc+1 ;tmr0 comparator register
|
|
scrtch0 equ tmr_comp+1
|
|
scrtch1 equ scrtch0+1
|
|
scrtch2 equ scrtch1+1
|
|
|
|
;*******************************************************
|
|
;DEFINE FLAGS AND BITS
|
|
b0 equ 0
|
|
b1 equ 1
|
|
b2 equ 2
|
|
b3 equ 3
|
|
b4 equ 4
|
|
b5 equ 5
|
|
b6 equ 6
|
|
b7 equ 7
|
|
|
|
;key
|
|
;***
|
|
; equ b0
|
|
; equ b1
|
|
; equ b2
|
|
units_key equ b3
|
|
tens_key equ b4
|
|
; equ b5
|
|
; equ b6
|
|
; equ b7
|
|
;digit_inc
|
|
;*********
|
|
units_inc equ b0
|
|
tens_inc equ b1
|
|
; equ b2
|
|
; equ b3
|
|
; equ b4
|
|
; equ b5
|
|
; equ b6
|
|
; equ b7
|
|
;******************************************
|
|
#define data_hi bsf GPIO, disp_data
|
|
#define data_lo bcf GPIO, disp_data
|
|
#define clk_hi bsf GPIO, disp_clk
|
|
#define clk_lo bcf GPIO, disp_clk
|
|
#define strobe_hi bsf GPIO, disp_strobe
|
|
#define strobe_lo bcf GPIO, disp_strobe
|
|
#define relay_on bsf GPIO, relay
|
|
#define relay_off bcf GPIO, relay
|
|
;************** EOF DEF_RAM.ASM ***********
|
|
; SUBS.ASM
|
|
; ********
|
|
;read key port in key
|
|
read_keys movf newkey, w ;debouncing taken care by s/w
|
|
movwf oldkey
|
|
movf GPIO, w ;read newkeys
|
|
andlw 00011000b ;gp3, gp4 are key ports
|
|
movwf newkey
|
|
comf newkey, f ;complement since active low
|
|
andwf oldkey, w ;key=oldkey AND compl(newkey)
|
|
movwf key
|
|
;indicate to display routine units or tens key pressed
|
|
btfsc key, units_key
|
|
bsf digit_inc, units_inc
|
|
btfsc key, tens_key
|
|
bsf digit_inc, tens_inc
|
|
return
|
|
;************************************************************
|
|
init_ports movlw 0 ;all lo
|
|
movwf GPIO
|
|
movlw 00011000b ;port g0-g2,g5 o/p & gp3,gp4 i/p
|
|
tris GPIO
|
|
clrf TMR0 ;clr tmr0 & prescaler
|
|
movlw 11000011b ;tmr0 enable with 1:16 prescaler
|
|
option
|
|
return
|
|
;***************** EOF SUBS.ASM ******************************
|
|
; TABLES.ASM
|
|
; **********
|
|
;7 segments decoded data. lo is segment on & hi is segment off
|
|
get_seg addwf PCL, f
|
|
; ABCDEFGP ;P is decimal point
|
|
retlw 00000011b ;0
|
|
retlw 10011111b ;1
|
|
retlw 00100101b ;2
|
|
retlw 00001101b ;3
|
|
retlw 10011001b ;4
|
|
retlw 01001001b ;5
|
|
retlw 01000001b ;6
|
|
retlw 00011111b ;7
|
|
retlw 00000001b ;8
|
|
retlw 00011001b ;9
|
|
dec_pt equ 11111110b ;decimal point bit
|
|
;*************** EOF TABLES.ASM **************************
|
|
; TIMER.ASM
|
|
; *********
|
|
; [ milindhp@tifrvax.tifr.res.in ]
|
|
;Set Processor configuration word as = 0000 0000 1010 b.
|
|
; a] -MCLR tied to VDD (internally).
|
|
; b] Code protection off.
|
|
; c] WDT disabled.
|
|
; d] Internal RC oscillator [4 MHZ].
|
|
list p=12c508, r=dec
|
|
include "d:\ pic\ mpasm\ p12c508.inc"
|
|
;define ram
|
|
include "def_ram.asm"
|
|
;processor start
|
|
org 0
|
|
goto start
|
|
;define legends and table
|
|
include "tables.asm"
|
|
;subroutines
|
|
include "subs.asm"
|
|
;initialize and start
|
|
start clrf key
|
|
clrf oldkey
|
|
clrf newkey
|
|
clrf digit_inc
|
|
clrf units
|
|
clrf tens
|
|
clrf counter_4ms
|
|
clrf counter_100ms
|
|
clrf seconds
|
|
movlw 250 ;4000us tmr0 (1:16 prescaler * 250 )
|
|
movwf tmr_comp
|
|
call init_ports ;init ports & timer
|
|
main movf tmr_comp, w ;is tmr0 = tmr_comp (4 msec over?)
|
|
xorwf TMR0, w
|
|
btfss STATUS, Z ;skip if = 250
|
|
goto main
|
|
movlw 250
|
|
addwf tmr_comp, f ;update 4 msec compare register
|
|
incf counter_4ms, f
|
|
movlw 25
|
|
xorwf counter_4ms, w ;is 4ms * 25 = 100ms over ?
|
|
btfss STATUS, Z ;skip if = 100ms
|
|
goto main
|
|
clrf counter_4ms
|
|
;************** 100 MSEC OVER **********************************
|
|
incf counter_100ms, f
|
|
movlw 10
|
|
xorwf counter_100ms, w ;is 100ms * 10 = 1sec over ?
|
|
btfss STATUS, Z ;skip if 1 sec over
|
|
goto main21 ;jmp if 1 sec not over
|
|
clrf counter_100ms ;1 sec over
|
|
incf seconds, f
|
|
movlw 60
|
|
xorwf seconds, w ;is 1 minute over ?
|
|
btfss STATUS, Z ;skip if 1 min over
|
|
goto main21
|
|
;************** 1 MINUTE OVER *********************************
|
|
clrf seconds
|
|
;process relay and display
|
|
;if tens & units both = 0 then rly off and out
|
|
;else relay on & decrement display & out
|
|
movf tens, w
|
|
iorwf units, w
|
|
btfss STATUS, Z
|
|
goto main1
|
|
relay_off
|
|
goto main21
|
|
main1 relay_on
|
|
movf units, f
|
|
btfss STATUS, Z
|
|
goto main2
|
|
movlw 9
|
|
movwf units
|
|
decf tens, f
|
|
goto main21
|
|
main2 decf units, f
|
|
;************** EXECUTED EVERY 100 MSEC *************
|
|
main21 call read_keys
|
|
;** DISPLAY ROUTINE TO BE EXECUTED EVERY 500 MSEC **
|
|
;process display every 500 msec
|
|
;if unit key pressed increment unit display
|
|
;if tens key pressed increment tens display
|
|
;flash unit display's dec. pt. every second if units & tens
|
|
;not equal to zero i.e. indicate timer is active
|
|
;execute display routine in counter_100ms = 0 or 5
|
|
movf counter_100ms, w
|
|
btfsc STATUS, Z
|
|
goto main3
|
|
xorlw 5
|
|
btfss STATUS, Z
|
|
goto main
|
|
;if units_key pressed then inc units display between 0 thr. 9
|
|
;if tens_key pressed then inc tens display between 0 thr. 9
|
|
main3 btfss digit_inc, units_inc
|
|
goto main4
|
|
bcf digit_inc, units_inc
|
|
;inc units display. if units = 10 then units = 0
|
|
incf units, f
|
|
movlw 10
|
|
xorwf units, w
|
|
btfsc STATUS, Z ;skip if not equal
|
|
clrf units
|
|
main4 btfss digit_inc, tens_inc
|
|
goto main5
|
|
bcf digit_inc, tens_inc
|
|
;inc tens display. if tens = 10 then tens = 0
|
|
incf tens, f
|
|
movlw 10
|
|
xorwf tens, w
|
|
btfsc STATUS, Z ;skip if not equal
|
|
clrf tens
|
|
;convert decimal in units & tens to decoded segment data
|
|
;for led display in scrtch1 & 2 for transmission
|
|
main5 movf tens, w
|
|
call get_seg
|
|
movwf scrtch1
|
|
movf units, w
|
|
call get_seg
|
|
movwf scrtch2
|
|
;flash (toggle) decimal point every 500ms if timer active
|
|
;i.e. if timer not equal to zero i.e. relay on, then flash
|
|
;decimal point else, do not to indicate relay off
|
|
movf tens, w
|
|
iorwf units, w
|
|
btfsc STATUS, Z ;skip to flash dp
|
|
goto main6 ;jmp if 0 to no flash
|
|
movf counter_100ms, f
|
|
btfss STATUS, Z ;toggle-on dec pt if counter_100ms = 0
|
|
goto main6 ;else jmp out to toggle-off
|
|
;flash dp of units display
|
|
movlw dec_pt
|
|
andwf scrtch2, f
|
|
;transmit data from scrtch1 thr scrtch1 to display circuit (msb first).
|
|
main6 movlw 16 ;no of bit to tx
|
|
movwf scrtch0
|
|
main61 rlf scrtch2, f ;check msb
|
|
rlf scrtch1, f
|
|
btfsc STATUS, C ;data hi if cy=1 else lo
|
|
goto main62
|
|
data_lo
|
|
goto main63
|
|
main62 data_hi
|
|
main63 nop ;delay
|
|
nop
|
|
clk_hi ;toggle clk to push data
|
|
nop
|
|
nop
|
|
clk_lo
|
|
nop
|
|
nop
|
|
decfsz scrtch0, f ;next bit
|
|
goto main61
|
|
strobe_hi ;strobe data nop
|
|
nop
|
|
strobe_lo
|
|
data_lo ;leave data lo
|
|
goto main
|
|
end
|
|
; ************* EOF MAIN.ASM ******************************** |