技术热线: 4007-888-234

用三位数码管显示八位AD数值

更新时间: 2019-03-26
阅读量:2458

;************************************
      LIST   P=16F877              ;列表伪指令
      INCLUDE "P16F877.INC"        ;把包含文件含入源程序
;************************************
RTCC  EQU  01H
W_TEMP  EQU  20H
STATUS_TEMP EQU  21H
FLAGS  EQU  22H
TABADD  EQU  23H
DISPBUF_L EQU  24H
DISPBUF_H EQU  25H
DISP1BUF_L EQU  26H
DISP1BUF_H EQU  27H
SOU   EQU  28H
SOUH  EQU  29H
TEMP1  EQU  30H
TEMP2  EQU  31H
CNT   EQU  32H

 

;************************************
        ORG        0000H

 GOTO    START
        ORG        0008H
;-------------------------------------------------
CONVERT   
        MOVWF      PCL              ;W寄存器内的7段显示码地址放入PC
TABLE                              ;PC执行新地址指令, 跳到相对的地址执行?               
     RETLW      0C0H           ;0  ;RETLW指令,将七段显示码存入W后返回
     RETLW      0F9H       ;1                                
     RETLW      0A4H       ;2
     RETLW      0B0H       ;3
     RETLW      099H       ;4
     RETLW      092H       ;5
     RETLW      082H        ;6
        RETLW      0F8H           ;7
     RETLW      080H       ;8
     RETLW      090H       ;9
;----- -----------------------------------------------

START
        BANKSEL    PORTC            ;选择同PORTC寄存器相同的体
       CLRF       PORTC            ;PORTC
      MOVLW      B'10000001'     ;选择:时钟时钟源为FOSC/8,允许ADC工作
      MOVWF      ADCON0           ;通道AN0,暂时不启动转换过程

 

       BANKSEL    OPTION_REG       ;选择寄存器OPTION_REG的体为当前体
      CLRF       TRISC            ;PORTC所有管脚设为输出(LED)
       MOVLW      B'00001110'      ;转换结果左对齐,只选1A/D通道RA0/AN0
       MOVWF      ADCON1           ;选择VDDVSS作参考源
        MOVLW    01H    ;设置RA0为输入,其它为输出
     MOVWF    TRISA
        BANKSEL    PORTC            ;选中同寄存器PORTC的体为当前体
;---------------------------------
MAIN    BSF     ADCON0,GO           ;开启A/D转换过程
  CALL  DELAY
WAIT
        BTFSS   PIR1,ADIF           ;等待A/D转换过程结束,检测ADC中断标志位

GOTO   WAIT                ;如果没有转换结束,则返回循环检测
       MOVF   ADRESH,W            ;如果转换完毕,则把A/D结果读到W
     MOVWF  SOU
     CALL    SBTBCD2
        SWAPF  SOU,W               ;显示值高低位交换,先处理高位
       ANDLW  0FH              ;屏蔽掉高位
        MOVWF   DISPBUF_H          ;存入寄存器
        MOVFW  SOU              ;显示值低位处理
        ANDLW  0FH              ;屏蔽掉高位
        MOVWF  DISPBUF_L        ;存入寄存器        
       SWAPF  SOUH,W              ;显示值高低位交换,先处理高位
       ANDLW  0FH              ;屏蔽掉高位
        MOVWF  DISP1BUF_H          ;存入寄存器
        MOVFW  SOUH              ;显示值低位处理
        ANDLW  0FH              ;屏蔽掉高位
        MOVWF  DISP1BUF_L          ;存入寄存器
     CALL  DISPLAY       
        GOTO  MAIN                ;循环进行A/D转换
;***************************************************
DISPLAY

    MOVLW       0FFH
        MOVWF       PORTC             ;先熄灭所有数码管以免闪烁
       MOVLW  03EH
  MOVWF  PORTA   
        MOVLW       TABLE
        MOVWF       TABADD           ;将转换表的首地址存入TABADD  
        MOVFW       DISPBUF_L        ;计数值(W)与转换表的起始地址相加
  ADDWF  TABADD,W
  CALL  CONVERT
  MOVWF  PORTC
  BCF   PORTA,4
  CALL  DELAY
  BSF   PORTA,4
  MOVFW       DISPBUF_H        ;计数值(W)与转换表的起始地址相加
  ADDWF  TABADD,W
  CALL  CONVERT
  MOVWF  PORTC
  BCF   PORTA,5
  CALL  DELAY
  BSF   PORTA,5
  MOVFW       DISP1BUF_L        ;计数值(W)与转换表的起始地址相加
  ADDWF  TABADD,W
  CALL  CONVERT
  MOVWF  PORTC
  BCF   PORTA,2
  CALL  DELAY
  BSF   PORTA,2
  RETURN                
;********************SBTBCD2********************

;本程序实现单字节二进制数转化为2字节压缩BCD码。
;入口参数:原二进制数在SOU中。
;出口参数:结果在SOUH:SOU中。
;占用资源:W,STATUS,023H,024H,025H,028H,029H,两重堆栈。

 

           IFNDEF       SBTBCD21
            #DEFINE     SBTBCD21
                        
SBTBCD2     MOVF        SOU,W
            MOVWF       TEMP2
            CLRF        SOU
            CLRF        SOUH
            BCF         STATUS,C
            MOVLW       8
            MOVWF       CNT
LOOPC       RLF         TEMP2,F
            RLF         SOU,F

   RLF         SOUH,F
            DECFSZ      CNT,F
            GOTO        ADJDEC         
            RETURN                  ;整个子程序结束
ADJDEC      MOVLW       SOU
            MOVWF       FSR
            CALL        ADJBCD      ;调整SOU
            MOVLW       SOUH
            MOVWF       FSR
            CALL        ADJBCD      ;调整SOUH
            GOTO        LOOPC
;********************调整BCD********************
ADJBCD      MOVLW       03H
            ADDWF       INDF,W      ;低四位加3
            MOVWF       TEMP1       ;暂存
            BTFSC       TEMP1,3     ;结果大于7,
            MOVWF       INDF        ;则存起来
            MOVLW       30H
            ADDWF       INDF,W      ;高四位加3
            MOVWF       TEMP1              
            BTFSC       TEMP1,7     ;结果大于7,
            MOVWF       INDF        ;则存起来
            RETLW       0
           ENDIF
;**********************************************
DELAY    MOVLW  0FFH
   MOVWF  034H
LP0   NOP
   NOP

 NOP
   NOP
   NOP
   DECFSZ  034H
   GOTO  LP0
   RETURN
;---------------------------------
      END                         ;源程序结束