技术热线: 4007-888-234

实战九:两位数码动态显示实验

更新时间: 2019-01-05
阅读量:626

;本例说明动态显示二位数码管的方法,其实动态显示数码管是利用人眼的暂留效应,即

;轮流让需显示的多个数码管分别各显示一段时间,有的朋友可能会问:这样不是可以看到

;数码管在闪烁?不,只要你的扫描速度够快,人眼是看不到闪烁的,也不是非常快基本上小于

;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