帮忙解释一下

2020-02-10 08:39发布

;*********************寄存器定义*********************
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" 在此处的意义/

麻烦各位了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。