实验目的:熟悉A/D转换
;软件思路:选择RAO做为模拟输入通道;
; 连续转换4次再求平均值做为转换结果
; 最后结构只取低8位
; 结果送数码管的低3位显示
;硬件要求:拨码开关S14第2位置ON,第1位置OFF
; 拨码开关S6全部置ON,S5第4-6位置ON,第1-3位置OFF
; 为不影响结果,其他拨码开关置OFF。
#INCLUDE ;包含芯片头文件
__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
;*********************寄存器定义*********************
TEMP EQU 20H ;临时寄存器
BAI EQU 21H ;转换结果的百位
SHI EQU 22H ;转换结果的十位
GE EQU 23H ;转换结果的个位
;****************************************************
ORG 00H ;复位入口地址
NOP ;ICD需要的空指令
GOTO MAIN ;跳转到主程序入口
ORG 04H ;中断入口地址
RETFIE ;放置一条中断返回指令,防止以外中断发生
;***********************查表程序*********************
;入口参数:W
;出口参数:W
TABLE
ADDWF PCL,1 ;指令寄存器加上偏移地址
RETLW 0C0H ;0的编码(公阳极数码管)
RETLW 0F9H ;1的编码
RETLW 0A4H ;2的编码
RETLW 0B0H ;3的编码
RETLW 99H ;4的编码
RETLW 92H ;5的编码
RETLW 082H ;6
RETLW 0F8H ;7
RETLW 080H ;8
RETLW 090H ;9
;***********************主程序***********************
MAIN
MOVLW 30H
MOVWF FSR ;转换结果存放起始地址
LOOP
BSF STATUS,RP0 ;选择体1
MOVLW 7H ;A口高3位为输出,低3位输入
MOVWF TRISA
CLRF TRISD ;D口设为输出
MOVLW 8EH
MOVWF ADCON1 ;结果右对齐,只选择RA0做ADC口,其余做普通数字口
BCF STATUS,RP0 ;回体0
MOVLW 41H
MOVWF ADCON0 ;选择时钟源为fosc/8,允许ADC工作
CALL DELAY ;调用延时程序,保证足够的采样时间
BSF ADCON0,GO ;启动ADC转换
WAIT
BTFSS PIR1,ADIF ;转换是否完成
GOTO WAIT ;等待转换的完成
BSF STATUS,RP0
MOVFW ADRESL ;读取转换的结果
BCF STATUS,RP0
MOVWF INDF ;保存到临时寄存器里
INCF FSR,1
BTFSS FSR,2 ;连续转换4次,求平均值
GOTO LOOP
CALL CHANGE ;调用结果转换程序
CALL DISPLAY ;调用显示程序
GOTO MAIN ;循环工作
;************************转换程序*********************
;入口参数:30H---33H
;出口参数:BAI,SHI,GE
CHANGE
CLRF 2AH
CLRF BAI
CLRF SHI
CLRF GE ;先清除结果寄存器
MOVFW 31H ;以下8条指令求4次转换结果的平均值
ADDWF 30H,1
BTFSC STATUS,C
INCF 2AH
MOVFW 32H
ADDWF 30H,1
BTFSC STATUS,C
INCF 2AH,1
MOVFW 33H
ADDWF 30H,1
BTFSC STATUS,C
INCF 2AH,1
RRF 2AH,1
RRF 30H,1
RRF 2AH,0
RRF 30H,0
MOVWF TEMP
MOVLW 64H ;减100,结果保留在W中
SUBWF TEMP,0
BTFSS STATUS,C ;判断是否大于100
GOTO SHI_VAL ;否,转求十位结果
MOVWF TEMP ;是,差送回TEMP中
INCF BAI,1 ;百位加1
GOTO $-6 ;返回继续求百位的值
SHI_VAL
MOVLW 0AH ;减10,结果保留在W中
SUBWF TEMP,0
BTFSS STATUS,C ;判断是否大于10
GOTO GE_VAL ;否,转去判断个位结果
MOVWF TEMP ;是,差送回TEMP中
INCF SHI,1 ;十位值加1
GOTO $-6 ;转会继续求十位的值
GE_VAL
MOVFW TEMP
MOVWF GE ;个位的值
RETURN
;**************************显示程序********************
;入口参数:BAI,SHI,GE
;出口参数:无
DISPLAY
MOVFW BAI ;显示百位
CALL TABLE
MOVWF PORTD
BCF PORTA,3
CALL DELAY
CALL DELAY
BSF PORTA,3
MOVFW SHI ;显示十位
CALL TABLE
MOVWF PORTD
BCF PORTA,4
CALL DELAY
CALL DELAY
BSF PORTA,4
MOVFW GE ;显示个位
CALL TABLE
MOVWF PORTD
BCF PORTA,5
CALL DELAY
CALL DELAY
BSF PORTA,5
RETURN
;***************************延时程序***********************
;入口参数:无
;出口参数:无
DELAY
MOVLW 5FH
MOVWF TEMP
DECFSZ TEMP,1
GOTO $-1