;************************************
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' ;转换结果左对齐,只选1个A/D通道RA0/AN0
MOVWF ADCON1 ;选择VDD和VSS作参考源
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 ;源程序结束