单片机0000-9999

	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	



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值