📄 十位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 + -