.include "riscmcu.inc"
|
.include "riscmcu.inc"
|
|
|
.def key = r16
|
.def key = r16
|
.def temp = r17
|
.def temp = r17
|
.def B = r18
|
.def B = r18
|
.def C = r19
|
.def C = r19
|
.def addsub = r24
|
.def addsub = r24
|
.def counter = r25
|
.def counter = r25
|
.def tcount = r26
|
.def tcount = r26
|
.def led = r27
|
.def led = r27
|
|
|
.cseg
|
.cseg
|
rjmp reset
|
rjmp reset
|
rjmp extint
|
rjmp extint
|
rjmp timer
|
rjmp timer
|
|
|
extint:
|
extint:
|
clr B
|
clr B
|
clr C
|
clr C
|
clr addsub
|
clr addsub
|
out portb,c
|
out portb,c
|
reti
|
reti
|
|
|
timer:
|
timer:
|
in temp,sreg
|
in temp,sreg
|
inc tcount
|
inc tcount
|
cpi tcount,24
|
cpi tcount,24
|
brne tback
|
brne tback
|
clr tcount
|
clr tcount
|
cpi led,0b10000
|
cpi led,0b10000
|
brne t4
|
brne t4
|
ldi led,0b0001
|
ldi led,0b0001
|
t4: com led
|
t4: com led
|
out portc,led
|
out portc,led
|
com led
|
com led
|
lsl led
|
lsl led
|
out sreg,temp
|
out sreg,temp
|
tback: reti
|
tback: reti
|
|
|
|
|
reset:
|
reset:
|
|
|
clr B
|
clr B
|
clr C
|
clr C
|
clr addsub
|
clr addsub
|
ldi counter,3
|
ldi counter,3
|
ldi led,0b0001
|
ldi led,0b0001
|
|
|
ldi temp,0b11110000
|
ldi temp,0b11110000
|
out ddrd,temp
|
out ddrd,temp
|
ser temp
|
ser temp
|
out ddrb,temp ; PORT B as output
|
out ddrb,temp ; PORT B as output
|
out ddrc,temp ; PORT C as output
|
out ddrc,temp ; PORT C as output
|
out portc,temp ; PORT C leds OFF
|
out portc,temp ; PORT C leds OFF
|
out portd,temp ; PORT D output HI
|
out portd,temp ; PORT D output HI
|
out gimsk,temp ; Enable external interrupt
|
out gimsk,temp ; Enable external interrupt
|
out timsk,temp ; Enable Timer interrupt
|
out timsk,temp ; Enable Timer interrupt
|
ldi temp,5
|
ldi temp,5
|
out tccr0,temp ; timer clock source = divide by 1024
|
out tccr0,temp ; timer clock source = divide by 1024
|
|
|
rcall ldtable
|
rcall ldtable
|
sei
|
sei
|
|
|
;*************************************************
|
;*************************************************
|
; Detect Keys
|
; Detect Keys
|
|
|
rescan: rcall sdelay
|
rescan: rcall sdelay
|
|
|
sbi portd,6
|
sbi portd,6
|
cbi portd,4
|
cbi portd,4
|
ldi zp,table
|
ldi zp,table
|
in key,pind
|
in key,pind
|
cbr key,$F0
|
cbr key,$F0
|
cpi key,$0F
|
cpi key,$0F
|
brne press
|
brne press
|
|
|
sbi portd,4
|
sbi portd,4
|
cbi portd,5
|
cbi portd,5
|
ldi zp,table+1
|
ldi zp,table+1
|
in key,pind
|
in key,pind
|
cbr key,$F0
|
cbr key,$F0
|
cpi key,$0F
|
cpi key,$0F
|
brne press
|
brne press
|
|
|
sbi portd,5
|
sbi portd,5
|
cbi portd,6
|
cbi portd,6
|
ldi zp,table+2
|
ldi zp,table+2
|
in key,pind
|
in key,pind
|
cbr key,$F0
|
cbr key,$F0
|
cpi key,$0F
|
cpi key,$0F
|
brne press
|
brne press
|
|
|
rjmp rescan
|
rjmp rescan
|
|
|
press:
|
press:
|
rcall sdelay
|
rcall sdelay
|
in temp,pind
|
in temp,pind
|
cbr temp,$F0
|
cbr temp,$F0
|
cpse key,temp
|
cpse key,temp
|
rjmp rescan
|
rjmp rescan
|
sbrs key,1
|
sbrs key,1
|
subi zp,-3
|
subi zp,-3
|
sbrs key,2
|
sbrs key,2
|
subi zp,-6
|
subi zp,-6
|
sbrs key,3
|
sbrs key,3
|
subi zp,-9
|
subi zp,-9
|
ld key,Z
|
ld key,Z
|
|
|
;*************************************************
|
;*************************************************
|
; Operation
|
; Operation
|
|
|
cpi key,$A
|
cpi key,$A
|
breq addkey
|
breq addkey
|
cpi key,$B
|
cpi key,$B
|
breq subkey
|
breq subkey
|
|
|
swap B
|
swap B
|
cbr B,$0f
|
cbr B,$0f
|
add B,key
|
add B,key
|
out portb,B
|
out portb,B
|
|
|
rjmp holding
|
rjmp holding
|
|
|
addkey:
|
addkey:
|
cbr addsub,$01
|
cbr addsub,$01
|
rjmp arith
|
rjmp arith
|
|
|
subkey:
|
subkey:
|
sbr addsub,$01
|
sbr addsub,$01
|
|
|
arith:
|
arith:
|
swap addsub
|
swap addsub
|
sbrc addsub,0
|
sbrc addsub,0
|
rjmp subf
|
rjmp subf
|
rcall BCDadd
|
rcall BCDadd
|
out portb,C
|
out portb,C
|
rcall overflow
|
rcall overflow
|
clr B
|
clr B
|
rjmp holding
|
rjmp holding
|
|
|
subf:
|
subf:
|
rcall BCDsub
|
rcall BCDsub
|
out portb,C
|
out portb,C
|
rcall overflow
|
rcall overflow
|
clr B
|
clr B
|
rjmp holding
|
rjmp holding
|
|
|
;*************************************************
|
;*************************************************
|
; Key press released ?
|
; Key press released ?
|
|
|
holding:
|
holding:
|
rcall sdelay
|
rcall sdelay
|
in key,pind
|
in key,pind
|
cbr key,$F0
|
cbr key,$F0
|
ldi temp,$0F
|
ldi temp,$0F
|
cpse key,temp
|
cpse key,temp
|
rjmp holding
|
rjmp holding
|
rjmp rescan
|
rjmp rescan
|
|
|
;*************************************************
|
;*************************************************
|
; overflow ?
|
; overflow ?
|
|
|
overflow:
|
overflow:
|
sbrs b,0
|
sbrs b,0
|
ret
|
ret
|
cli
|
cli
|
sbi ddrd,7
|
sbi ddrd,7
|
cbi portd,7
|
cbi portd,7
|
rcall delay
|
rcall delay
|
sbi portd,7
|
sbi portd,7
|
cbi ddrd,7
|
cbi ddrd,7
|
sei
|
sei
|
ret
|
ret
|
|
|
;*************************************************
|
;*************************************************
|
; Short Delay
|
; Short Delay
|
|
|
sdelay:
|
sdelay:
|
clr temp
|
clr temp
|
s10: dec temp
|
s10: dec temp
|
brne s10
|
brne s10
|
ret
|
ret
|
|
|
;*************************************************
|
;*************************************************
|
; Load Table
|
; Load Table
|
|
|
ldtable:
|
ldtable:
|
ldi ZP,table
|
ldi ZP,table
|
ldi temp,1
|
ldi temp,1
|
st Z+,temp
|
st Z+,temp
|
ldi temp,2
|
ldi temp,2
|
st Z+,temp
|
st Z+,temp
|
ldi temp,3
|
ldi temp,3
|
st Z+,temp
|
st Z+,temp
|
ldi temp,4
|
ldi temp,4
|
st Z+,temp
|
st Z+,temp
|
ldi temp,5
|
ldi temp,5
|
st Z+,temp
|
st Z+,temp
|
ldi temp,6
|
ldi temp,6
|
st Z+,temp
|
st Z+,temp
|
ldi temp,7
|
ldi temp,7
|
st Z+,temp
|
st Z+,temp
|
ldi temp,8
|
ldi temp,8
|
st Z+,temp
|
st Z+,temp
|
ldi temp,9
|
ldi temp,9
|
st Z+,temp
|
st Z+,temp
|
ldi temp,$B
|
ldi temp,$B
|
st Z+,temp
|
st Z+,temp
|
ldi temp,0
|
ldi temp,0
|
st Z+,temp
|
st Z+,temp
|
ldi temp,$A
|
ldi temp,$A
|
st Z+,temp
|
st Z+,temp
|
ret
|
ret
|
|
|
;*******************************************
|
;*******************************************
|
delay:
|
delay:
|
del: ldi ZP,count
|
del: ldi ZP,count
|
ld temp,Z
|
ld temp,Z
|
dec temp
|
dec temp
|
st Z,temp
|
st Z,temp
|
brne del
|
brne del
|
ldi ZP,count+1
|
ldi ZP,count+1
|
ld temp,Z
|
ld temp,Z
|
dec temp
|
dec temp
|
st Z,temp
|
st Z,temp
|
brne del
|
brne del
|
dec counter
|
dec counter
|
brne del
|
brne del
|
ldi counter,3
|
ldi counter,3
|
ret
|
ret
|
|
|
;***** Subroutine Register Variables
|
;***** Subroutine Register Variables
|
|
|
.def BCD1 =r19 ;BCD input value #1
|
.def BCD1 =r19 ;BCD input value #1
|
.def BCD2 =r18 ;BCD input value #2
|
.def BCD2 =r18 ;BCD input value #2
|
.def tmpadd =r16 ;temporary register
|
.def tmpadd =r16 ;temporary register
|
|
|
;***** Code
|
;***** Code
|
|
|
BCDadd:
|
BCDadd:
|
ldi tmpadd,6 ;value to be added later
|
ldi tmpadd,6 ;value to be added later
|
add BCD1,BCD2 ;add the numbers binary
|
add BCD1,BCD2 ;add the numbers binary
|
clr BCD2 ;clear BCD carry
|
clr BCD2 ;clear BCD carry
|
brcc add_0 ;if carry not clear
|
brcc add_0 ;if carry not clear
|
ldi BCD2,1 ; set BCD carry
|
ldi BCD2,1 ; set BCD carry
|
add_0: brhs add_1 ;if half carry not set
|
add_0: brhs add_1 ;if half carry not set
|
add BCD1,tmpadd ; add 6 to LSD
|
add BCD1,tmpadd ; add 6 to LSD
|
brhs add_2 ; if half carry not set (LSD <= 9)
|
brhs add_2 ; if half carry not set (LSD <= 9)
|
subi BCD1,6 ; restore value
|
subi BCD1,6 ; restore value
|
rjmp add_2 ;else
|
rjmp add_2 ;else
|
add_1: add BCD1,tmpadd ; add 6 to LSD
|
add_1: add BCD1,tmpadd ; add 6 to LSD
|
add_2: swap tmpadd
|
add_2: swap tmpadd
|
add BCD1,tmpadd ;add 6 to MSD
|
add BCD1,tmpadd ;add 6 to MSD
|
brcs add_4 ;if carry not set (MSD <= 9)
|
brcs add_4 ;if carry not set (MSD <= 9)
|
sbrs BCD2,0 ; if previous carry not set
|
sbrs BCD2,0 ; if previous carry not set
|
subi BCD1,$60 ; restore value
|
subi BCD1,$60 ; restore value
|
add_3: ret ;else
|
add_3: ret ;else
|
add_4: ldi BCD2,1 ; set BCD carry
|
add_4: ldi BCD2,1 ; set BCD carry
|
ret
|
ret
|
|
|
|
|
;***** Subroutine Register Variables
|
;***** Subroutine Register Variables
|
|
|
.def BCDa =r19 ;BCD input value #1
|
.def BCDa =r19 ;BCD input value #1
|
.def BCDb =r18 ;BCD input value #2
|
.def BCDb =r18 ;BCD input value #2
|
|
|
;***** Code
|
;***** Code
|
|
|
BCDsub:
|
BCDsub:
|
sub BCDa,BCDb ;subtract the numbers binary
|
sub BCDa,BCDb ;subtract the numbers binary
|
clr BCDb
|
clr BCDb
|
brcc sub_0 ;if carry not clear
|
brcc sub_0 ;if carry not clear
|
ldi BCDb,1 ; store carry in BCDB1, bit 0
|
ldi BCDb,1 ; store carry in BCDB1, bit 0
|
sub_0: brhc sub_1 ;if half carry not clear
|
sub_0: brhc sub_1 ;if half carry not clear
|
subi BCDa,$06 ; LSD = LSD - 6
|
subi BCDa,$06 ; LSD = LSD - 6
|
sub_1: sbrs BCDb,0 ;if previous carry not set
|
sub_1: sbrs BCDb,0 ;if previous carry not set
|
ret ; return
|
ret ; return
|
subi BCDa,$60 ;subtract 6 from MSD
|
subi BCDa,$60 ;subtract 6 from MSD
|
ldi BCDb,1 ;set underflow carry
|
ldi BCDb,1 ;set underflow carry
|
brcc sub_2 ;if carry not clear
|
brcc sub_2 ;if carry not clear
|
ldi BCDb,1 ; clear underflow carry
|
ldi BCDb,1 ; clear underflow carry
|
sub_2: ret
|
sub_2: ret
|
|
|
|
|
|
|
|
|
.dseg
|
.dseg
|
table: .byte 12
|
table: .byte 12
|
|
|