⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ka.asm

📁 湖北XX县电能卡表写卡机
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        MOVF    RCREG,W           ;收到的"8bit"数据
        MOVF    RCREG,W           ;清除"帧格式错误".
No_RC_err:
        ;;;;---------------发送完毕,打开"接收中断"-------------
        bcf   PCLATH,3              ;选择页面0
        CALL  RC485MODE             ;发送完毕,置为"接收模式"
        RegBnk1
        MOVLW   21h
        MOVWF   PIE1                ;open RCIE, open TMR1IE.

TX485OUT:
        bcf   PCLATH,3              ;选择页面0
        GOTO   RETRET

      ;------------------------------------------------------------------
      ;--------------------RB0中断处理;(已关闭)--------------------------
      ;------------------------------------------------------------------

      ;-------------------------------------------------------------------
      ;-------------TIMR1中断处理(电能脉冲处理)---------------------------
      ;----------------2ms------------------------------------------------
TR1IF:
        RegBnk0
        BCF  PIR1,TMR1IF              ;电能脉冲判定
        RegBnk1
        bsf  TRISA,RA4_kWhsgn         ;I/O方向input state
        ;-------------
        tstf  Lamp_on
        skpnz
        goto  tst_kWhsg
        bsf  kWh_stat,kWhsgn_impuls   ;LCD脉冲指示,1-有脉冲,0-没有脉冲.
        decf  Lamp_on,1               ;校表led点亮时间控制变量.
        ;-------------
tst_kWhsg:
        RegBnk0
        btfsc  RA,RA4_kWhsgn           ; RA.kWhsgn = low?
        goto   tst_kWhsgn_hi           ; No, process high level

tst_kWhsgn_lo:                         ; kWhsign="Lo"
        RegBnk1
        movlw   .10                    ; 10*1=10ms
        movwf   kWhsgn_cnt_hi          ; set kWhsign "Hi" counter=4
        btfsc   kWh_stat,kWhsgn        ; already "Lo" ?
        decfsz  kWhsgn_cnt_lo,1        ; No, kWhsgn_cnt_lo -- =0 ?
        goto    No_kWh_ret             ; Yes or kWhsgn_cnt_lo not zero
        bcf     kWh_stat,kWhsgn        ;说明现在为低电平(并记亿)
        goto    No_kWh_ret

tst_kWhsgn_hi:                          ; kWhsign="Hi"
        RegBnk1
        movlw   .10                     ; 10*1=10ms
        movwf   kWhsgn_cnt_lo           ; set kWhsign "Lo" counter=4
        btfss   kWh_stat,kWhsgn         ; already "Hi" ?
        decfsz  kWhsgn_cnt_hi,1         ; No,  kWhsgn_cnt_hi --
        goto    No_kWh_ret              ; Yes or kWhsgn_cnt_hi not zero
        bsf     kWh_stat,kWhsgn         ; 说明现在为高电平(并记亿)
        ;;;;
        ;;bsf  kWh_stat,kWhsgn_impuls   ;LCD脉冲指示,1-有脉冲,0-没有脉冲.
        bcf  TRISC,RC2_led              ;RC2为输出口方式.
        movlw  .80                      ;led on 80ms
        movwf  Lamp_on                  ;led点亮时间.

        RegBnk0
        bcf   RC,RC2_led                ;0---校表led点亮.
        bcf   dsp_flag3,disp_No_updata  ;?????????0-->0.10秒到,更新显示数据项.
       ;---------------------
       ;---------------
        goto    No_kWh_ret              ; NOT ZERO!
        RegBnk0
        movfw   Constat                 ; ZERO! set kWh_cnt=kWh_cnst
        RegBnk1
        movwf  kWh_cnst
        bsf   kWh_stat,kWhsgn_add1      ;需 ++0.01 kWh

        RegBnk0
        decfsz  Wt_epm_count,1          ;写EPM计数
        goto    No_kWh_ret
        movlw   .10
        movwf   Wt_epm_count            ;写 E2PROM 一次.
        bsf  RWepmSTA,Wt_e2pm_kWh       ;set write 0.10 kWh to EEPROM flag
        ;------------------------------------
No_kWh_ret:
       ;-------------------------------------
        RegBnk0
        MOVLW   0FFH
        MOVWF   TMR1H        ;5*2ms=10ms

        MOVLW   .131         ;(256-131)*8=125*8=1000uS(1ms),new adjusted
        MOVWF   TMR1L        ;256*8=2048uS=2ms

        MOVLW   30H          ;1mS检测一次"电能脉冲"
        MOVWF   T1CON

        BSF     T1CON,0      ;open timer1,start time

        bcf     PCLATH,3     ;选择页面0
        goto    RETRET

;---------------------------------------------------------------
;--------------RS485数据接收模块(中断处理)---------------
;---------------------------------------------------------------
USATIF:
        clrwdt
        RegBnk0
        BCF  PIR1,RCIF                 ;GENR0,GENR1,GENR2,GENR3
        ;;;;
        RegBnk1
        BTFSC  CONTROL485,ir_prs_end   ;1--接收的数据已处理完毕(可以发送).
                                       ;0--接收的数据未处理,不可以接收.
        ;;;;
        btfsc  CONTROL485,ir_Txing     ;1--正在发送数据!不可以接收.
        goto   RX485ERR                ;0--已发送完数据,可以接收.
        ;;;;-------------------
        ;;;;;------------------
        RegBnk0
        MOVF    RCSTA,W        ;RCSTA---收到的数据的"9"
        MOVWF   GENR0

        BTFSC   GENR0,1
        GOTO    RX485ERR       ;1---越位错误
        BTFSC   GENR0,2
        GOTO    RX485ERR       ;1---格式错误
        MOVF    RCREG,W        ;收到的"8bit"数据

        MOVWF   IR_Rec         ;接收数据的LOW8位

        BTFSS  GENR0,0         ;接收数据的第9位(校验位1:有奇数个1)
        GOTO   RX485_1
        bcf    PCLATH,3        ;选择页面0
        CALL   MKEVENBIT
        BTFSS  temp_4,0
        GOTO   RX485ERR        ;校验位错误
        GOTO   RX485_2
RX485_1:
        bcf   PCLATH,3         ;选择页面0
        CALL   MKEVENBIT
        BTFSC  temp_4,0
        GOTO   RX485ERR        ;校验位错误
RX485_2:
        ;;;;;;;;;;;;
        RegBnk1
        tstf   COUNT485
        SKPNZ
        GOTO   CLR_Cun_byte
        ;;;;
        MOVLW  .255             ;2s
        SUBWF  CSCOM485,W       ;"485" 超时检测.
        SKPNC
        GOTO   RX485EXIT
        ;;;;--------------

CLR_Cun_byte:
        RegBnk1
        movlw  .60             ;60
        subwf  COUNT485,W      ;是大于60个字节吗(包括2个"FE")?
        skpnc
        goto   RX485EXIT       ;是大于60,错误数据,不处理.
        ;;;;;;
tst_IR_long:
        RegBnk1
        tstf  COUNT485         ;是否是开始数据(即"已接收数据长度"是否是00)?
        skpz
        goto  save_ir_data

        RegBnk0
        movlw  68h
        xorwf  IR_Rec,W
        skpz
        GOTO   RX485EXIT       ;第x个数据,不是"68".

        RegBnk1
        movlw   .03
        movwf   COUNT485
        movlw   68h
        movwf   IR_TXcv_Buf
        bsf  CONTROL485,ir_Recing      ;1--处在接收状态.
        ;;RegBnk1                      ;??????????
        BCF   TXSTA,TXEN               ;2003.2.18
        goto    RX485OUT

save_ir_data:
        RegBnk0
        bcf  dsp_flag3,disp_met_Add     ;0--半分钟到,关显示表地址.
        RegBnk1
        bcf  broadcast_stat,broad_Add   ;广播地址"标志是"1"时,不读时段".

        btfss  CONTROL485,ir_Recing     ;0--接收数据完毕(发送状态)
        goto   RX485EXIT                ;1--处在接收状态.
        ;;;;;;RegBnk1
        INCF    COUNT485                ;保存收到的字节数.
        movlw   IR_TXcv_Buf
        addwf   COUNT485,W
        movwf   FSR
        movlw   .03
        SUBWF   FSR,1
        RegBnk0
        movfw   IR_Rec
        movwf   INDF              ;保存收到的数据
        ;;;;;
        RegBnk1
        movlw   .8
        xorwf   COUNT485,W        ;是第12个字节吗?
        btfss   3,Z
        goto    tst_IR_long1
        RegBnk0
        movfw   IR_Rec            ;需要继续"接收的数据长度"给"RCOUNT".
        RegBnk1
        movwf   RCOUNT
        movlw   .2                ;校验吗和结束码(2byte).
        addwf   RCOUNT,1
        goto    RX485OUT

tst_IR_long1:
        RegBnk1                   ;??
        movlw   .8
        subwf   COUNT485,W        ;是大于12个字节吗(包括2个"FE")?
        skpc
        goto   RX485OUT
        ;------------------
        movlw   .48
        subwf   RCOUNT,W          ;是小于47个字节吗(包括2个"FE")?
        skpnc
        goto    RX485EXIT
        ;------------------
        decfsz  RCOUNT,1
        goto    RX485OUT          ;已测试
        ;-------------------------------------------------------------
Rcv_data_end:
        CLRF  COUNT485               ;接收的"字节数"清0".
        bcf   CONTROL485,ir_prs_end  ;0--接收的数据没处理.

       ;数据"正确接收"完毕,关闭"红外接收"中断,未处理,不可以接收.
        MOVLW   01h
        MOVWF   PIE1                 ;close RCIE, open TMR1IE.
        goto  RX485OUT1

RX485EXIT:                           ;第三个不是"68".
        RegBnk1
        CLRF   COUNT485              ;错误数据"不计数".
        GOTO   RX485OUT1             ;????????
        ;-------------------清除错误---------------------
RX485ERR:
        RegBnk0
        bcf   RCSTA,CREN             ;清"0"越位溢出错误.
        ;nop                         ;清除"帧格式错误".
        bsf   RCSTA,CREN
        MOVF  RCREG,W                ;收到的"8bit"数据
        MOVF  RCREG,W                ;清除"帧格式错误".
RX485OUT1:
        RegBnk1
        bcf  CONTROL485,ir_Recing    ;0--红外已接收数据完毕.

RX485OUT:
        RegBnk1
        CLRF  CSCOM485               ;清零超时计数器

;-------------------------------------------------------
RETRET:                              ;中断返回

            RegBnk0                  ;BCF STATUS,RP0
            MOVF    GENR3_TEMP,W     ;8
            MOVWF   GENR3

            MOVF    GENR2_TEMP,W     ;7
            MOVWF   GENR2

            MOVF    GENR1_TEMP,W     ;6
            MOVWF   GENR1

            MOVF    GENR0_TEMP,W     ;5        ;ADD BY JI
            MOVWF   GENR0

            MOVF    FSR_TEMP, W      ;4
            MOVWF   FSR

            MOVF    PCLATH_TEMP,W    ;3
            MOVWF   PCLATH

            SWAPF   STATUS_TEMP,W    ;2
            MOVWF   STATUS

            SWAPF   W_TEMP,F         ;1
            SWAPF   W_TEMP,W

            RETFIE
                        
 
;----------------------------------------------------------------
;----------------------------------------------------------------
     ;   bsf    PCLATH,3          ;选择页面1
     ;   goto   meter_initer      ;2003  320
;----------------------------------------------------------------
;----------------------------------------------------------------
              org    0800h        ;page  1
;----------------------------------------------------------------
;------------------两个字节比较子程序(用于标识)------------------
;----------------------------------------------------------------
            bsf    PCLATH,3            ;选页1
            goto   meter_initer
;----------------------------------------------------------------
;----------------------------------------------------------------
ir_comparat:
         movfw   IR_TXcv_Buf+10
         subwf   temp_ir1,W
         skpz
         goto    No_ident
         movfw   IR_TXcv_Buf+11
         subwf   temp_ir2,W
         skpz
         goto   No_ident
         bsf    CONTROL485,ir_ident      ;1--数据标识相等
         retlw   0
No_ident:
         bcf    CONTROL485,ir_id

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -