;*********************寄存器定义*********************
TEMP EQU 20H ;临时寄存器
BAI EQU 21H ;转换结果的百位
SHI EQU 22H ;转换结果的十位
GE EQU 23H ;转换结果的个位
;****************************************************
ORG 00H ;复位入口地址
NOP ;ICD需要的空指令
GOTO MAIN ;跳转到主程序入口
ORG 04H ;中断入口地址
RETFIE ;放置一条中断返回指令,防止以外中断发生
;***********************主程序***********************
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
=========================
高手们,我在网上看到这一段程序,其中红 {MOD}字体的部分不是很清楚,高手们能不能帮个忙?
一、第一处
CLRF 2AH
CLRF BAI
CLRF SHI
CLRF GE ;先清除结果寄存器
清0各寄存器,但是其中的2AH在接下来的程序中就算加1,也就是00000001啊!它在此种有什么意义呢?
二、第二处
RRF 2AH,1
RRF 30H,1
RRF 2AH,0
RRF 30H,0
前两句,右移,结果存入寄存器;后两句,右移,结果存入W,但是后一句“RRF 30H,0”肯定会覆盖前一句“RRF 2AH,0
”在W中的内容啊!这又有什么意义呢?
三、第三处
INCF BAI,1 ;百位加1
前面的指令意思是,不借位就跳到“MOVWF TEMP ;是,差送回TEMP中”,但是“INCF BAI,1 ;百位加1
”这个BAI是它的本身内容加1?但是前面第一处红 {MOD}处,有一句“CLRF BAI”,这样它的内容就是00000001了?这句在这里有什么意思吗?
以及后面一句 "INCF SHI,1 ;十位值加1" 在此处的意义/
麻烦各位了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>