所使用编译器的版本,HI-TECH PICC Version 9.50PL1(正版)
本例是一个用PIC16F73编写的门禁读卡器解码并显示的源程序
;门禁读卡头为韦根26编码格式,数据“0"为DATAO线上出现400US的低电平加2000US的高电平; 数据”1"为DATA1线上出现400US的低电平加2000US的高电平
; 无数据输出时DATA0,DATA1线上为高电平
;晶振4MHZ
;******************************************************************* LIST P=16F73,R=DEC ;定义器件为16F73,默认数制为十进制
#INCLUDE
#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
BCF T1CON,TMR1ON ;关闭TMR1
CLRF TMR1L ;清TMR1寄存器
CLRF TMR1H
BSF T1CON,TMR1ON ;启动TMR1
BTFSC PIR1,TMR1IF ;如TMR1计数溢出则是错误接收GOTO SHUJU_WAN
BTFSS PORTB,7
GOTO $-3
BSF STATUS,C ;将数据"1"压入数据寄存器
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 ;数据接收完毕则置刷新标志位
;--------------测高电平脉宽
SHUJU_JSH
BCF T1CON,TMR1ON ;关闭TMR1
CLRF TMR1L ;清TMR1寄存器
CLRF TMR1H
BSF T1CON,TMR1ON ;启动TMR1
SHUJU_JSH_1
BTFSC PIR1,TMR1IF ;如TMR1计数溢出则是错误接收
GOTO SHUJU_WAN
BTFSS PORTB,6
GOTO SHUJU_JS0L
BTFSS PORTB,7
GOTO SHUJU_JS1L
GOTO SHUJU_JSH_1
;--------------
SHUJU_BZ BSF BZ_TEMP,0 ;置数制转换标志位
SHUJU_WAN RETURN
;--------------二进制转十六进制码--------------------------------------- BINZHEX
BCF BZ_TEMP,0 ;清数制转换标志位
MOVLW 03H ;取TEMP_QIAN的低二位存入DATE_7
ANDWF TEMP_QIAN,0
MOVWF DATE_7
;-------------
MOVLW 0F0H ;取TEMP_BAI的高四位存入DATA_6
ANDWF TEMP_BAI,0
MOVWF DATE_6
SWAPF DATE_6,1
MOVLW 0FH ;取TEMP_BAI的低四位存入DATE_5
ANDWF TEMP_BAI,0
MOVWF DATE_5
;--------------
MOVLW 0F0H ;取TEMP_SHI的高四位存入DATA_4
ANDWF TEMP_SHI,0
MOVWF DATE_4
SWAPF DATE_4,1
MOVLW 0FH ;取TEMP_SHI的低四位存入DATE_3
ANDWF TEMP_SHI,0
MOVWF DATE_3
;---------------
MOVLW 0F0H ;取TEMP_GE的高四位存入DATA_2
ANDWF TEMP_GE,0
MOVWF DATE_2
SWAPF DATE_2,1