CURR_NUM_L EQU 30H ;BCD
CURR_NUM_H EQU 31H ;BCD
DAT_74164 bit P0.6
CLK_74164 bit P0.7
KEY_COMMON bit P3.2
KEY_1 bit p0.5
KEY_2 bit p0.4
DIG_6 bit p0.0 ;H
DIG_5 bit p0.1
DIG_4 BIT P0.2 ;L
DIG_3 BIT P0.3
org 0000H
jmp MAIN
;*******************************************
org 0030H ;Start program from 0030H
MAIN:
mov P0,#0FFH ;Initialize the port
mov P1,#0FFH
mov P2,#0FFH
mov P3,#0FFH
mov CURR_NUM_H,#00H ;Initilize the var
mov CURR_NUM_L,#00H ;Clear the common line
MAIN_LOOP:
jb KEY_2,LAB_KEY_2 ;Wait for key down,ADD
call DELAY
call NUM_ADD
jmp NEXT_LOOP
LAB_KEY_2:
jb KEY_1,NEXT_LOOP ;Wait for key down,SUB
call DELAY
call NUM_SUB
jmp NEXT_LOOP
NEXT_LOOP:
call DISPLAY_NUM
jmp MAIN_LOOP
ret
;****************************************************
DISPLAY_NUM:
;Display the low value
mov a,CURR_NUM_H
anl a,#0FH
mov dptr,#TAB_LED
movc a,@a+dptr
;Display the number
clr DIG_5
setb DIG_6
setb DIG_4
setb DIG_3
call sendTo74164
call DELAY_DISP
;Display the high value
mov a,CURR_NUM_H
swap a
anl a,#0FH
mov dptr,#TAB_LED
movc a,@a+dptr
;Display the number
call sendTo74164
clr DIG_6
setb DIG_5
setb DIG_4
setb DIG_3
call DELAY_DISP
;Display the low value
mov a,CURR_NUM_L
anl a,#0FH
mov dptr,#TAB_LED
movc a,@a+dptr
;Display the number
clr DIG_3
setb DIG_4
setb DIG_5
setb DIG_6
call sendTo74164
call DELAY_DISP
;Display the high value
mov a,CURR_NUM_L
swap a
anl a,#0FH
mov dptr,#TAB_LED
movc a,@a+dptr
;Display the number
call sendTo74164
setb DIG_3
setb DIG_5
setb DIG_6
clr DIG_4
call DELAY_DISP
ret
;*******************************************
;Send data of A to chip 74LS164
sendTo74164:
push 07h
push acc
mov r7,#08 ;send 8 bits
SEND164_LOOP:
clr CLK_74164 ;clear clock-line for reading data
rlc a
mov DAT_74164,c ;move data-bit to data-line
setb CLK_74164 ;send data to 74164
djnz r7,SEND164_LOOP
clr CLK_74164 ;clear clock-line for reading data
pop acc
pop 07h
ret
;****************************************************
NUM_ADD:
mov a,CURR_NUM_L
cjne a,#99H,INC_NUM_L
;If CURR_NUM=099H,then reset CURR_NUM
mov CURR_NUM_L,#00H
MOV a,CURR_NUM_H
cjne a,#99H,INC_NUM_H
mov CURR_NUM_H,#00H
jmp NUM_ADD_EXIT
INC_NUM_H:
anl a,#0FH
cjne a,#09H,NUM_ADD_H
mov a,CURR_NUM_H
add a,#07H
mov CURR_NUM_H,a
jmp NUM_ADD_EXIT
INC_NUM_L:
anl a,#0FH
cjne a,#09H,NUM_ADD_L
mov a,CURR_NUM_L
add a,#07H
mov CURR_NUM_L,a
jmp NUM_ADD_EXIT
NUM_ADD_H:
;Simple add 1
inc CURR_NUM_H
NUM_ADD_L:
;Simple add 1
inc CURR_NUM_L
NUM_ADD_EXIT:
ret
;****************************************************
NUM_SUB:
;Get previos value
mov a,CURR_NUM_L
jz NUM_SUB_99
;If (low 4-bits)=0 ;then (high 4-bits)-1 and (low 4-bits)=9
anl a,#0FH
cjne a,#00H,NUM_SUB_1
;High dec
mov a,CURR_NUM_L
clr c
;subb a,#10H ;High -1
;add a,#09H ;Low set to 9 ;orl
subb a,#7H
mov CURR_NUM_L,a
jmp NUM_SUB_EXIT
NUM_SUB_1:
;Simple sub 1
dec CURR_NUM_L
jmp NUM_SUB_EXIT
NUM_SUB_H:
dec CURR_NUM_H
jmp NUM_SUB_EXIT
NUM_SUB_99:
mov CURR_NUM_L,#99H
MOV a,CURR_NUM_H
JZ NUM_SUB_9900
anl a,#0FH
cjne a,#00H,NUM_SUB_H
mov a,CURR_NUM_H
clr c
subb a,#7H
mov CURR_NUM_H,a
jmp NUM_SUB_EXIT
NUM_SUB_9900:
mov CURR_NUM_H,#99H
NUM_SUB_EXIT:
ret
;****************************************************
DELAY:
mov r7,#200
DELAY_LOOP:
mov r6,#200
djnz r6,$
mov r6,#200
djnz r6,$
djnz r7,DELAY_LOOP
ret
;****************************************************
DELAY_DISP:
mov r7,#10
DELAY_DISP_LOOP:
mov r6,#200
djnz r6,$
mov r6,#200
djnz r6,$
djnz r7,DELAY_DISP_LOOP
ret
;****************************************************
;****************************************************
;LED code
TAB_LED:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;****************************************************
END
CURR_NUM_L EQU 30H ;low 2 bit
CURR_NUM_H EQU 40H ;high 2 bit
DAT_74164 bit P0.6
CLK_74164 bit P0.7
KEY_COMMON bit P3.2
KEY_1 bit p0.5
KEY_2 bit p0.4
DIG_6 bit p0.0
DIG_5 bit p0.1
DIG_4 bit p0.2
DIG_3 bit p0.3
org 0000H
jmp MAIN
;*******************************************
org 0030H ;Start program from 0030H
MAIN:
mov P0,#0FFH ;Initialize the port
mov P1,#0FFH
mov P2,#0FFH
mov P3,#0FFH
mov CURR_NUM_H,#00H ;Initilize the var
mov CURR_NUM_L,#63H
clr KEY_COMMON ;Clear the common line
MAIN_LOOP:
jb KEY_2,LAB_KEY_2 ;Wait for key down,ADD
call DELAY
call NUM_ADD
jmp NEXT_LOOP
LAB_KEY_2:
jb KEY_1,NEXT_LOOP ;Wait for key down,SUB
call DELAY
call NUM_SUB
jmp NEXT_LOOP
NEXT_LOOP:
call DISPLAY_NUM
jmp MAIN_LOOP
ret
;****************************************************
DISPLAY_NUM:
;A<-A/B,
mov a,CURR_NUM_L
mov b,#0Ah ;(b)=10
div ab
mov r0,a
;Display the low value
mov a,b
mov dptr,#TAB_LED
movc a,@a+dptr
;Display the number
clr DIG_3
setb DIG_4
setb DIG_5
setb DIG_6
call sendTo74164
call DELAY_DISP
;
mov a,r0
mov dptr,#TAB_LED
movc a,@a+dptr
;
call sendTo74164
setb DIG_3
setb DIG_5
setb DIG_6
clr DIG_4
call DELAY_DISP
;display the high two digit
mov a,CURR_NUM_H
mov b,#0Ah ;(b)=10
div ab
mov r0,a
;display the high 2 digit
mov a,b ;error on here
mov dptr,#TAB_LED
movc a,@a+dptr
;
clr DIG_5
setb DIG_6
setb DIG_3
setb DIG_4
call sendTo74164
call DELAY_DISP
;Display the high value
mov a,r0
mov dptr,#TAB_LED
movc a,@a+dptr
;
clr DIG_6
setb DIG_5
setb DIG_3
setb DIG_4
call sendTo74164
call DELAY_DISP
ret
;*******************************************
;Send data of A to chip 74LS164
sendTo74164:
push 07h
push acc
mov r7,#08 ;send 8 bits
SEND164_LOOP:
clr CLK_74164 ;clear clock-line for reading data
rlc a
mov DAT_74164,c ;move data-bit to data-line
setb CLK_74164 ;send data to 74164
djnz r7,SEND164_LOOP
clr CLK_74164 ;clear clock-line for reading data
pop acc
pop 07h
ret
;****************************************************
NUM_ADD:
mov a,CURR_NUM_L
cjne a,#99,INC_NUM_L ;Warning:only 99,not 99H
mov a,CURR_NUM_H
inc CURR_NUM_H
mov CURR_NUM_L,#00H
cjne a,#99,INC_NUM_H
mov CURR_NUM_H,#00H
jmp NUM_ADD_EXIT
jmp NUM_ADD_EXIT
INC_NUM_L:
inc CURR_NUM_L
INC_NUM_H:
;inc CURR_NUM_H
NUM_ADD_EXIT:
ret
;****************************************************
NUM_SUB:
;Get previos value
mov a,CURR_NUM_L
jz NUM_SUB_99
NUM_SUB_1:
;Simple sub 1
dec CURR_NUM_L
jmp NUM_SUB_EXIT
NUM_SUB_99:
;If CURR_NUM=0 then CURR_NUM=99 after sub
mov CURR_NUM_L,#99 ;Warning:only 99,not 99H
mov a,CURR_NUM_H
jz NUM_SUB_9900
dec CURR_NUM_H
NUM_SUB_9900:
mov CURR_NUM_H,#99
NUM_SUB_EXIT:
ret
;****************************************************
DELAY:
mov r7,#200
DELAY_LOOP:
mov r6,#200
djnz r6,$
mov r6,#200
djnz r6,$
djnz r7,DELAY_LOOP
ret
;****************************************************
DELAY_DISP:
mov r7,#10
DELAY_DISP_LOOP:
mov r6,#200
djnz r6,$
mov r6,#200
djnz r6,$
djnz r7,DELAY_DISP_LOOP
ret
;****************************************************
;****************************************************
;LED code
TAB_LED:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;for:0,1,2,3...
;****************************************************
END