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

📄 ka.asm

📁 湖北XX县电能卡表写卡机
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;aSDA            EQU     2       ;RA2, data in/out ;Lcd display port

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
bSDA            EQU     5     ;  RA5 /RB0, data in/out
bSCL            EQU     2     ;  RA2 /RB1, serial clock
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RA4_kWhsgn      EQU     4       ;RA4, kWhsign
RA3_PW          EQU     3       ;RA3_AD   PIN5,时钟电池A/D转换口(失压检测).
RB6_PW          EQU     6
RA1_LED         EQU     1       ;读卡指示
RA0_SW          equ     0       ;按键口.
;------------------------------------------------------------------
RC0_met_clear   equ     0       ; RC0(S1) "L"--clear meter
RC2_led         equ     2       ; RC2 校表led控制.

;bSDA            equ     3       ; RC3,data in/out,  RTC 实时时钟 I2C
;bSCL            equ     4       ; RC4,serial clock, RTC

RC5_program_able   equ  5       ; (S3) "H"-- programable.
TXD485          equ     6       ; RC6, TX
RXD485          equ     7       ; RC7, RX
;-----------------------------------------------------------------
;               RB port PORT bits
;-----------------------------------------------------------------
RB7_batt_test     equ      7        ;电池测试
RB6_resev         equ      6        ;电能反相.

RB2_485           equ      2        ;SWRT
RB1_buzzer        equ      1        ;

;--------------------常量定义完-------------------------------

;-------------------------------------------------------------
;       Macro Define
;-------------------------------------------------------------
RegBnk0         macro
                bcf     STATUS,RP0
                endm

RegBnk1         macro
                bsf     STATUS,RP0
                endm

;------------------------------------------------------------
NOPn            macro   numb
                local   i=0
                while   i< numb
                NOP
i++
                endw
                endm


;****************************************************************
;****************************************************************
          org    0000h       ;pic16F73  reset  address
          clrf    PCLATH      ;page  0
          goto    main

           ORG    0x004      ;pic16F73 int address

          MOVWF    W_TEMP            ; W   1

          SWAPF    STATUS,W          ;     2
          CLRF     STATUS            ;  RegBnk0
          MOVWF    STATUS_TEMP

          MOVF    PCLATH,W
          MOVWF   PCLATH_TEMP        ;     3

          MOVF    FSR,W
          MOVWF   FSR_TEMP           ;     4

          MOVF    GENR0,W
          MOVWF   GENR0_TEMP         ;     5

          MOVF    GENR1,W
          MOVWF   GENR1_TEMP          ;    6

          MOVF    GENR2,W
          MOVWF   GENR2_TEMP          ;7

          MOVF    GENR3,W             ;ADD BY JI
          MOVWF   GENR3_TEMP          ;8

          CLRF    PCLATH

;-------中断检测处理程序-----------------------------
INT_DONE:
         bcf   PCLATH,3          ;选择页面0.
         RegBnk0

         BTFSC   PIR1,RCIF       ;串行(SCI)接收中断标志位.
         GOTO    USATIF          ;红外"接收中断".

         BTFSC  PIR1,TMR1IF      ;IS TMR1 INT ?   JI
         GOTO   TR1IF            ;定时器1中断处理

         BTFSC   INTCON,T0IF     ;IS TMR0 INT ? (延时10mS)
         GOTO    MAIN_DELA       ;定时器0中断处理.
         ;;;;
         CLRF    PIR2
         CLRF    PIR1
         BCF    INTCON,0
         BCF    INTCON,1
         BCF    INTCON,3
         BCF    INTCON,4

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

;-------------;modify  2002.6.1-------------------------
;-------------------------------------------------------

;-------------------------------------------------------
;       DELAY : delay  16*(1us*3*255+5) = 12.3 ms
;       input : None
;     RAM use : DLY_cnt1 (byte_num), DLY_cnt2 (address)
;-------------------------------------------------------
DELAY:
        movlw   15                     ;13=10ms  16=12.3
        movwf   DLY_cnt1
delay1:
        clrwdt                          ; clear WDTimer
        clrf    DLY_cnt2                ; second loop_count=256
delay2:
        decfsz  DLY_cnt2,1              ; (second loop_count -- )= 0 ?
        goto    delay2                  ; No, goto loop second_loop
        decfsz  DLY_cnt1,1              ; (first loop_count -- )= 0 ?
        goto    delay1                  ; No, goto loop first_loop
        RETLW   0


;-------------------------------------------------------
;-------------------------------------------------------
; Read and Write IC Card AT24C01
;-------------------------------------------------------
;       Subroute : 1. ICRd
;                  2. ICWt
;-------------------------------------------------------

;-------------------------------------------------------
;       IC Crad  START bus communication routine
;-------------------------------------------------------
;       input   : none
;       output  : initialize bus communication
;-------------------------------------------------------
ICSTART:
        RegBnk1
        MOVLW   b'00000001'     ; Put bSCL, bSDA line in output state
        MOVWF    TRISA          ;IN BANK1

        ;TRIS    RA             ; set RB2,RB3 as output
        RegBnk0
        NOPn     5              ;01. 8.6      

        BSF     RA,bSDA         ; bSDA make sure sda is high
        BSF     RA,bSCL         ; bSCL Set clock high
        clrwdt
        NOPn    4               ; Timing adjustment
        BCF     RA,bSDA         ; bSDA goes low during bSCL high
        NOPn    5
        BCF     RA,bSCL         ; Start clock train
        RETLW   0


;-----------------------------------------------------------------------
;       IC Card  STOP bus communication routine
;-----------------------------------------------------------------------
;       Input   :       None
;       Output  :       Bus communication, STOP condition
;-----------------------------------------------------------------------
ICSTOP:
        RegBnk1
        MOVLW   b'00000001'     ; Put bSCL, bSDA line in output state
        MOVWF   TRISA           ;IN BANK1

        RegBnk0                 ;01. 8.6 /
        BCF     RA,bSDA         ; Return bSDA to low
        BSF     RA,bSCL         ; Set bSCL high
        NOPn    5
        BSF     RA,bSDA         ; bSDA goes from low to high during bSCL high
        NOPn    5
        RETLW   0

;-----------------------------------------------------------------------
;        ICRX   :       RECEIVE    DATA    subroutine
;-----------------------------------------------------------------------
;       Input   :       None
;       Output  :       RXBUF = Receive 8-bit data
;-----------------------------------------------------------------------
ICRX
        RegBnk1
        MOVLW   B'00100001'     ; Force bSDA line as input
        MOVWF   TRISA           ;方向控制Force aSDA line as input state
        RegBnk0                 ;01. 8.6      
        ;;
        MOVLW   8               ; 8 bits of data
        MOVWF   COUNT
        CLRF    RXBUF
         
ICRXLP
        CLRC
        RLF     RXBUF,1
        BSF     RA,bSDA         ; Set bSDA for input
        BSF     RA,bSCL         ; Clock high
        NOPn    5
        BTFSC   RA,bSDA         ; Read bSDA pin
        BSF     RXBUF,0         ; DI = 1
        BCF     RA,bSCL         ; Return bSCL to low
        DECFSZ  COUNT,1         ; 8 bits?
        GOTO    ICRXLP
        RETLW   0
;------------------------------------------------------------------
;        ICTX   :       TRANSMIT  DATA    subroutine
;------------------------------------------------------------------
;       Input   :       TXBUF
;       Output  :       Data X'mitted to IC Card device
;------------------------------------------------------------------
ICTX
        RegBnk1
        movlw   b'00000001'     ; Set bSDA, bSCL as outputs
        MOVWF   TRISA           ;IN BANK1   方向控制
        RegBnk0                          
        ;;;
        MOVLW   8
        MOVWF   COUNT

ICTXLP
        NOPn    5  
        BSF     RA,bSDA         ; Shift data bit out.
        BTFSS   TXBUF,7         ; If shifted bit = 0, data bit = 0
        BCF     RA,bSDA         ; Otherwise data bit = 1
        BSF     RA,bSCL
        NOPn    5
        BCF     RA,bSCL         ; Return bSCL to low
        CLRC
        RLF     TXBUF,1         ; Rotate TXBUF left
        DECFSZ  COUNT,1         ; 8 bits done?
        GOTO    ICTXLP          ; No.

; Read acknowledge bit
        RegBnk1
        MOVLW   B'00100001'     ; Force bSDA line as input
        MOVWF   TRISA              ;IN BANK1   方向控制
        RegBnk0                    ;01. 8.6      
        NOPn    3
        ;;;;
        BSF     RA,bSDA         ; Set bSDA for input
        BSF     RA,bSCL         ; Clock high
        NOPn    5
        ;;;
        BTFSC   RA,bSDA                 ; OK if aSDA is "Lo"
        BSF   meter_error,E2PROM_error  ; Set R/W Error flag
        BCF     RA,bSCL                 ; Return aSCL to low

        NOPn    5
        RETLW   0


;------------------------------------------------------------------------
;        ICWt   :       write one byte to IC Card device
;------------------------------------------------------------------------
;       Input   :          FSR  = begin data address to be written
;                       address = IC Card destination address
;                      byte_num = write bytes number
;                        bSLAVE = device address (10100000)
;       Output  :       Data written to IC Card device
;-------------------------------------------------------------------------
ICWt
        MOVLW   bSLAVE          ; Get bSLAVE address
        MOVWF   TXBUF           ; to TX buffer
        CALL    ICSTART         ; Generate START bit
        CALL    ICTX            ; Output bSLAVE address
        ;;;;
        btfsc   meter_error,E2PROM_error ; Skip if OK
        retlw   0FFh                    ; Error Return
        ;;;;

        MOVF    address,W       ; Get WORD address
        MOVWF   TXBUF           ; into buffer
        CALL    ICTX            ; Output WORD address
        ;;;;
        btfsc  meter_error,E2PROM_error ; Skip if OK
        retlw   0FFh                    ; Error Return

ICWt_loop:
        MOVFW   INDF            ; Move DATA
        MOVWF   TXBUF           ; into buffer
        CALL    ICTX            ; Output DATA and detect acknowledgement
        ;;;;
        btfsc  meter_error,E2PROM_error ; Skip if OK
        retlw   0FFh                    ; Error Return

        INCF    FSR,1
        DECFSZ  byte_num,1
        GOTO    ICWt_loop

        CALL    ICSTOP          ; Generate STOP bit

        CALL    DELAY

        RETLW   0


;-------------------------------------------------------------------------
;       ICRd   :       read one byte from IC Card device
;-------------------------------------------------------------------------
;       Input   :       address  = IC Card source address
;                        bSLAVE  = device address (10100000)
;                      byte_num  = read bytes number
;       Output  :          FSR   = data begin address from IC Card
;-----------------------------------------------------------------------------
ICRd

⌨️ 快捷键说明

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