⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 十位ad+数码管.txt

📁 10位ad显示加数码管驱动程序
💻 TXT
字号:
我试用proteus和MPLAB IDE联结模似时,发现一个问题,我发现ADRESL和ADRESH都为1CH,从理论上

讲,这好像是不大可能的事,因为我选用右对齐方式,所有ADRESH最大值应该不能大于03H,请各位同仁看看

我的程度出了什么问题。

问题解决了,国为ADRESH在存储器0中,而ADRESL在存储器1中,读取ADRESH \ADRESL会有所不同,下列程序为完整程序

;[分享]用四位数码管显示10位AD数值
;10位AD值最大时为3FFH=1023,所以用四位数码管就可以了

;************************************
      LIST   P=16F877              ;列表伪指令
      INCLUDE "P16F877.INC"        ;把包含文件含入源程序
      include<SUB16X.INC>
;************************************
DISPBUF_L EQU  34H
DISPBUF_H EQU  35H
DISP1BUF_L EQU  36H
DISP1BUF_H EQU  37H
TABADD  EQU  33H

;************************************
        ORG        0000H
        GOTO    START
        ORG        0008H
;-------------------------------------------------
CONVERT   
        MOVWF      PCL              ;将W寄存器内的7段显示码地址放入PC 
TABLE                              ;PC执行新地址指令, 跳到相对的地址执行?               
;     RETLW      0C0H           ;0  ;RETLW指令,将七段显示码存入W后返回
        RETLW        0X3F;0
        RETLW        0X06;1
        RETLW        0X5B;2
        RETLW        0X4F;3
        RETLW        0X66;4
        RETLW        0X6D;5
        RETLW        0X7D;6
        RETLW        0X07;7
        RETLW        0X7F;8
        RETLW        0X6F;9
;----- -----------------------------------------------
START
        BANKSEL    PORTC            ;选择同PORTC寄存器相同的体
        CLRF       PORTC            ;清PORTC
        MOVLW      B'10000001'     ;选择:时钟时钟源为FOSC/32,允许ADC工作
        MOVWF      ADCON0           ;通道AN0,暂时不启动转换过程 

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

       MOVF   ADRESL,W            ;如果转换完毕,则把A/D结果读到W

        BCF STATUS,RP0
        MOVWF  SOU
        MOVF  ADRESH,W
        MOVWF  SOUH
        CALL    DBTBCD
        SWAPF  SOU,W               ;显示值高低位交换,先处理高位
        ANDLW  0FH              ;屏蔽掉高位
        MOVWF   DISPBUF_H          ;存入寄存器
        MOVF  SOU,W             ;显示值低位处理
        ANDLW  0FH              ;屏蔽掉高位
        MOVWF  DISPBUF_L        ;存入寄存器        
        SWAPF  SOUH,W              ;显示值高低位交换,先处理高位
        ANDLW  0FH              ;屏蔽掉高位
        MOVWF  DISP1BUF_H          ;存入寄存器
        MOVF  SOUH,W              ;显示值低位处理
        ANDLW  0FH              ;屏蔽掉高位
        MOVWF  DISP1BUF_L          ;存入寄存器
        CALL  DISPLAY       
        GOTO  MAIN                ;循环进行A/D转换
;***************************************************
DISPLAY
        MOVLW       00H
        MOVWF       PORTC             ;先熄灭所有数码管以免闪烁
       MOVLW  0FFH
  MOVWF  PORTD   
        MOVLW       TABLE
        MOVWF       TABADD           ;将转换表的首地址存入TABADD  
        MOVFW       DISPBUF_L        ;计数值(W)与转换表的起始地址相加
        ADDWF  TABADD,W
        CALL  CONVERT
        MOVWF  PORTC
        BCF   PORTD,0
        CALL  DELAY
        BSF   PORTD,0
        MOVFW       DISPBUF_H        ;计数值(W)与转换表的起始地址相加
        ADDWF  TABADD,W
        CALL  CONVERT
        MOVWF  PORTC
        BCF   PORTD,1
        CALL  DELAY
        BSF   PORTD,1
        MOVFW       DISP1BUF_L        ;计数值(W)与转换表的起始地址相加
        ADDWF  TABADD,W
        CALL  CONVERT
        MOVWF  PORTC
        BCF   PORTD,2
        CALL  DELAY
        BSF   PORTD,2
        MOVFW       DISP1BUF_H       ;计数值(W)与转换表的起始地址相加
        ADDWF  TABADD,W
        CALL  CONVERT
        MOVWF  PORTC
        BCF   PORTD,3
        CALL  DELAY
        BSF   PORTD,3
        RETURN                
;********************DBTBCD********************
;本程序实现双字节二进制数转化为3字节压缩BCD码。
;入口参数:原二进制数在SOUH:SOU中。
;出口参数:结果在RLT:SOUH:SOU中。
;占用资源:W,STATUS,FSR,023H,024H,025H,026H,028H,029,02AH,两重堆栈。

           IFNDEF       DBTBCD1
            #DEFINE     DBTBCD1
                        
DBTBCD      MOVF        SOU,W
            MOVWF       TEMP2
            MOVF        SOUH,W
            MOVWF       TEMP3
            CLRF        SOU
            CLRF        SOUH
            CLRF        RLT
            BCF         STATUS,C
            MOVLW       .16
            MOVWF       CNT
LOOPC1      RLF         TEMP2,F
            RLF         TEMP3,F
            RLF         SOU,F
            RLF         SOUH,F
            RLF         RLT,F
            DECFSZ      CNT,F
            GOTO        ADJDEC1         
            RETLW       0           ;整个子程序结束
ADJDEC1     MOVLW       SOU
            MOVWF       FSR
            CALL        ADJBCD1     ;调整RLT
            MOVLW       SOUH
            MOVWF       FSR
            CALL        ADJBCD1     ;调整RLTH
            MOVLW       RLT
            MOVWF       FSR
            CALL        ADJBCD1     ;调整TEMP1
            GOTO        LOOPC1
;********************调整BCD********************
ADJBCD1     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                         ;源程序结束 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -