下
GOTO SET_1
BTFSS PORTA,4 ;扫描键S3是否有按下
GOTO SET_2
GOTO LOOP ;循环扫描
LOOP1
MOVLW 8
MOVWF COUNTER ;循环左移计数器置8
CLRF BUFFER ;清除缓冲器
MOVF DIGIT,W
MOVWF BUFFER1
LOOP2
RLF BUFFER1,1 ;二进制数转换成BCD码(以便显示)
RLF BUFFER,1
DECFSZ COUNTER,1 ;左移8次
GOTO ADJUST
SWAPF BUFFER,W ;显示值高低位交换,先处理高位
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_H ;存入寄存器
MOVFW BUFFER ;显示值低位处理
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_L ;存入寄存器
GOTO LOOP
ADJUST
MOVLW 3 ;二进制转BCD的调整
ADDWF BUFFER,W ;每次移位后都检查低四位LSD+3是否大于7
MOVWF SUM
BTFSC SUM,3
MOVWF BUFFER
MOVLW 30H
ADDWF BUFFER,W ;如果是则再加3,否则不加。
MOVWF SUM
BTFSC SUM,7
MOVWF BUFFER ;接着再将高四位MSD作相同处理
GOTO LOOP2
;- --------------------------------------------
SET_1
BTFSC PORTA,3 ;去除键抖动
GOTO LOOP
CALL DELAY
BTFSC PORTA,3
GOTO LOOP
MOVLW 99 ;计数值为99后不再加1
XORWF DIGIT,0
BZ LOOP
INCF DIGIT,1 ;不为9计数值加1
GOTO LOOP1
;----------------------------------------------------
SET_2
BTFSC PORTA,4 ;去除键抖动
GOTO LOOP
CALL DELAY
BTFSC PORTA,4
GOTO LOOP
MOVF DIGIT,1 ;计算值为0后不再减1
BZ LOOP
DECF DIGIT,1 ;不为0计数值减1
GOTO LOOP1
;-------------------------------------------------
DELAY ;廷时常数
MOVLW 150
MOVWF COUNT1
L2
MOVLW 255
MOVWF COUNT2
L3
DECFSZ COUNT2,1 ;递减循环
GOTO L3
DECFSZ COUNT1,1
GOTO L2
RETLW 0
;-------------------- ----------------------------------
CONVERT
MOVWF PC ;将W寄存器内的7段显示码地址放入PC
TABLE ;PC执行新地址指令, 跳到相对的地址执行?
RETLW 081H ;0 ;RETLW指令,将七段显示码存入W后返回
RETLW 0E7H ;1
RETLW 092H ;2
RETLW 0A2H ;3
RETLW 0E4H ;4
RETLW 0A8H ;5
RETLW 088H ;6
RETLW 0E3H ;7
RETLW 080H ;8
RETLW 0A0H ;9
;----- -----------------------------------------------
END