?? em4001門禁卡解碼程序.txt
字號:
;本例是一個用PIC16F73編寫的門禁讀卡器解碼并顯示的源程序
;門禁讀卡頭為韋根26編碼格式,數據“0"為DATAO線上出現400US的低電平加2000US的高電平
; 數據”1"為DATA1線上出現400US的低電平加2000US的高電平
; 無數據輸出時DATA0,DATA1線上為高電平
;晶振4MHZ
;*******************************************************************
LIST P=16F73,R=DEC ;定義器件為16F73,默認數制為十進制
#INCLUDE<P16F73.INC>
#DEFINE DATE164 PORTA,0 ;定義164數據位
#DEFINE CLK164 PORTA,1 ;定義164時鐘位
#DEFINE ENABLE164 PORTA,2 ;定義164顯示使能位
;-------中斷保護寄存器
W_TEMP EQU 20H ;W中間寄存器
STATUS_TEMP EQU 21H ;STATUS中間寄存器
;-------延時寄存器
COUNT0_DELAY EQU 22H ;延時記數用寄存器
COUNT1_DELAY EQU 23H
;-------顯示寄存器
DATE_ZJ EQU 24H ;顯示數據寄存器
TEMP_JZ EQU 25H ;顯示間址寄存器
BZ_TEMP EQU 26H ;刷新標志寄存器
COUNT_FMBCD EQU 27H ;發碼次數寄存器
QIAN EQU 28H ;顯示千位寄存器
BAI EQU 29H ;百
SHI EQU 2AH ;十
GE EQU 2BH ;個
;-------移位數據寄存器
TEMP_YIWEI EQU 2DH
;-------韋根解碼寄存器
TEMP_QIAN EQU 30H ;韋根解碼數據寄存器
TEMP_BAI EQU 31H
TEMP_SHI EQU 32H
TEMP_GE EQU 33H
COUNT_WG EQU 34H ;韋根數據位數寄存器
;--------------數制轉換寄存器
DATE_7 EQU 35H
DATE_6 EQU 36H
DATE_5 EQU 37H
DATE_4 EQU 38H
DATE_3 EQU 39H
DATE_2 EQU 3AH
DATE_1 EQU 3BH
;------------------------------------------------
ORG 00H
NOP
GOTO START
;--------------中斷子程序----------------------------
ORG 04H
PBDPZD
MOVWF W_TEMP ;現場保護
SWAPF STATUS,0
MOVWF STATUS_TEMP
CALL SHUJU_JS
;----------------
INEND BCF INTCON,RBIF ;清PORTB中斷標志位
SWAPF STATUS_TEMP,W ;恢復中斷前STATUS,W的值
MOVWF STATUS
SWAPF W_TEMP,1
SWAPF W_TEMP,0 ;(用SWAPF才不會影響STATUS的值)
RETFIE
;--------------顯示代碼表-------------------------------
TB ADDWF PCL,1
RETLW 03H ;0
RETLW 9FH ;1
RETLW 25H ;2
RETLW 0DH ;3
RETLW 99H ;4
RETLW 49H ;5
RETLW 0C1H ;6
RETLW 1FH ;7
RETLW 01H ;8
RETLW 19H ;9
RETLW 11H ;A
RETLW 0C1H ;B
RETLW 63H ;C
RETLW 0A1H ;D
RETLW 61H ;E
RETLW 71H ;F
RETLW 0FFH ;關顯示
RETURN
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;--------------主程序------------------------------------------------------
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ORG 60H
START
;--------------寄存器全部清零
MOVLW 20H
MOVWF FSR
ST: CLRF 00H
INCF FSR,1
BTFSS FSR,6
GOTO ST
;---------------
BCF STATUS,RP0 ;選體0
BCF STATUS,RP1 ;
CLRF PORTA ;清RA,RB,RC口
CLRF PORTB
CLRF PORTC
;---------------
BSF STATUS,RP0 ;選體1
MOVLW 06H
MOVWF ADCON1 ;RA口設置為普通I/O口
MOVLW 00H
MOVWF TRISA ;RA口設置為輸出口
MOVLW 0FFH
MOVWF TRISB ;RB口設置為輸入口
MOVLW 06H
MOVWF TRISC ;CCP1,CCP2為輸入口
BCF STATUS,RP0 ;恢復體0
;--------------程序測試子程序(初始顯示1234)
MOVLW 01H ;1
MOVWF QIAN
MOVLW 02H ;2
MOVWF BAI
MOVLW 03H ;3
MOVWF SHI
MOVLW 04H ;4
MOVWF GE
CALL XIANSHI
;---------------
BCF INTCON,RBIF
BSF INTCON,RBIE ;開RB口電平中斷
BSF INTCON,GIE ;開總中斷
;************************************************************
;**************主程序內核************************************
MAIN NOP
MOVLW 1AH ;設置韋根解碼位數
MOVWF COUNT_WG
BTFSS PORTB,1 ;判斷是否需要移位操作
CALL AJYW
BTFSS PORTB,2 ;判斷是否需要顯示轉換
CALL XSZH
BTFSC BZ_TEMP,0 ;判斷是否需要數制轉換
CALL BINZHEX
BTFSC BZ_TEMP,1 ;判斷是否需要顯示刷新
CALL XIANSHI
GOTO MAIN
;************************************************************
;==============數據接收子程序================================
SHUJU_JS
CLRF TEMP_GE ;清韋根解碼數據寄存器
CLRF TEMP_SHI
CLRF TEMP_BAI
CLRF TEMP_QIAN
CLRF TMR1L ;清TMR1寄存器
CLRF TMR1H
CLRF T1CON ;TMR1計數分配比1:1
BCF PIR1,TMR1IF ;清TMR1中斷標志位
;--------------
BTFSS PORTB,6 ;判斷數據是"0"?
GOTO SHUJU_JS0L
BTFSS PORTB,7 ;判斷數據是"1"?
GOTO SHUJU_JS1L
GOTO SHUJU_WAN
;--------------數據0
SHUJU_JS0L
BCF T1CON,TMR1ON ;關閉TMR1
CLRF TMR1L ;清TMR1寄存器
CLRF TMR1H
BSF T1CON,TMR1ON ;啟動TMR1
BTFSC PIR1,TMR1IF ;如TMR1計數溢出則是錯誤接收
GOTO SHUJU_WAN
BTFSS PORTB,6
GOTO $-3
BCF STATUS,C ;將數據"0"壓入數據寄存器
RLF TEMP_GE,1
RLF TEMP_SHI,1
RLF TEMP_BAI,1
RLF TEMP_QIAN,1
DECFSZ COUNT_WG,1 ;判斷26位數據是否接收完畢
GOTO SHUJU_JSH ;未接收完畢則轉向測高電平脈寬
GOTO SHUJU_BZ ;數據接收完畢則置刷新標志位
;--------------數據1
SHUJU_JS1L
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -