;本例说明动态显示二位数码管的方法,其实动态显示数码管是利用人眼的暂留效应,即
;轮流让需显示的多个数码管分别各显示一段时间,有的朋友可能会问:这样不是可以看到
;数码管在闪烁?不,只要你的扫描速度够快,人眼是看不到闪烁的,也不是非常快基本上小于
;10MS就可以了,
;程序中使用一个寄存器(DIGIT)作计数器,然后将计数结果输出显示。
;因为数码管只能显示0-9的十进制输出,所以计数器DIGIT需转换成十进制再输出,程序中将
;涉及到将十六进制转成十进制BCD码的方法。二进制调整为BCD码的方法是将二进制码左移8次
;每次移位后都检查低四位LSD+3是否大于7,如果是则再加3,否则不加。接着再将高四位MSD作相同处理
;本程序的功能是:程序复位后,数码管从0开始显示数字,直到99,然而又从0到99循环显示
;烧写时应注意:配置位已经在程序中写明,加载HEX文件时会自动加载,烧写时不用再手动设置配置位。
;实验时请注意套件跳线选择
;*
LIST P=16F84A,R=DEC ;定义器件为16F84,默认数制为十进制
;—————————————————————————————-
__CONFIG B’11111111110001’;_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC
;没有代码保护
;看门狗关闭
;上电廷时器开启
;振荡器模式为XT
;——————————-
PC EQU 02H ;变量单元定义
STATUS EQU 03H
PORTA EQU 05H
PORTB EQU 06H
TRISA EQU 5H
TRISB EQU 6H
;———————————-STATUS
RP0 EQU 5
;——————————-
COUNTER EQU 10H
COUNT1 EQU 11H
COUNT2 EQU 12H
TABADD EQU 13H
DISPBUF EQU 14H ;显示值暂存
DISPBUF_H EQU 15H ;显示器高位
DISPBUF_L EQU 16H ;显示器低位
BUFFER EQU 17H
BUFFER1 EQU 18H
SUM EQU 19H
DIGIT EQU 1AH ;0-99计数器
;——————————
ORG 0000H
MAIN
CLRF PORTA
CLRF PORTB ;初始化IO口
BSF STATUS,RP0 ;设置寄存器体1
MOVLW 00000000B ;将所有IO口设置为输出
MOVWF TRISA
MOVWF TRISB
BCF STATUS,RP0 ;恢复寄存器体0
MOVLW 0FFH ;先让数码管全部不显示
MOVWF PORTB
CLRF DIGIT ;显示计数器清0
CLRF DISPBUF ;清显示值
LOOP1
MOVLW 22
MOVWF COUNTER ;计数器0.2秒钟加1 22*9.2MS=0.2s
LOOP1_1
CALL DISP ;调用显示子程序
DECFSZ COUNTER,1 ;显示0.2秒钟
GOTO LOOP1_1
INCF DIGIT,1 ;计数器加1
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 ;
MOVFW BUFFER
MOVWF DISPBUF ;是否有进位(即已达100),如已计数到100则
SKPC ;从0开始再计数显示(显示00~99)
GOTO LOOP1
GOTO MAIN
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
;- ————————————————————-
DELAY ;显示廷时常数,廷时时间为32556+6us+4us=4.6ms
MOVLW 6
MOVWF COUNT1
L2
MOVLW 255
MOVWF COUNT2
L3
DECFSZ COUNT2,1
GOTO L3
DECFSZ COUNT1,1
GOTO L2
RETLW 0
;—————————— —————————————————
DISP
SWAPF DISPBUF,W ;显示值高低位交换,先处理高位
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_H ;存入寄存器
MOVFW DISPBUF ;显示值低位处理
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_L ;存入寄存器
MOVLW 0FFH
MOVWF PORTB ;先熄灭数码管以免闪烁
BSF PORTA,1
BCF PORTA,2 ;先显示低位
MOVLW TABLE
MOVWF TABADD ;将转换表的首地址存入TABADD
MOVFW DISPBUF_L ;计数值(W)与转换表的起始地址相加
ADDWF TABADD,W
CALL CONVERT ;存入W后调用转换表子程序
MOVWF PORTB ;送RB口显示
CALL DELAY ;廷时4。7MS
MOVLW 0FFH ;同样方法显示高位
MOVWF PORTB
BSF PORTA,2
BCF PORTA,1
MOVLW TABLE
MOVWF TABADD
MOVFW DISPBUF_H
ADDWF TABADD,W
CALL CONVERT
MOVWF PORTB
CALL DELAY
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