📄 ka.asm
字号:
;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 + -