📄 main.asm
字号:
list p=18f252
include "p18f252.inc"
Command udata
ReadBlocks res 0x05;{0xBA,0x04,0x33,0x0,0x10};
Delay_Count1 res 0x01
Delay_Count2 res 0x01
Delay_Count3 res 0x01
Delay_Count4 res 0x01
Delay_Para1 res 0x01
Delay_Para2 res 0x01
_WREG res 0x01
_STATUS res 0x01
_BSR res 0x01
SendLength res 0x01
CheckData res 0x01
ReceiveNum res 0x01
ReceiveLen res 0x01
Flag res 0x01
CardSelect res 0x01
ResetCard_RAM res 0x01
SetCodeCard_RAM res 0x01
SetKeyCard_RAM res 0x01
KeyCard_RAM res 0x01
Code_RAM res 0x01
Key_RAM res 0x01
EEPROM_Count res 0x01
Key_Temp res 0x01
WREEPROM_ADD res 0x01
WREEPROM_DAT res 0x01
UsefullData res 0x04
ReceiveBuffer res 0x10
#define Flag_OpenDoor Flag,0
#define Flag_FourSecond Flag,1
#define Flag_Alern Flag,2
#define Flag_TwentySecond Flag,3
#define Flag_ReceiveReady Flag,4
#define Flag_ReceiveOver Flag,5
#define Flag_TimeOut Flag,6
#define Flag_DeterLen Flag,7
#define ResetCard CardSelect,0
#define SetCodeCard CardSelect,1
#define SetKeyCard CardSelect,2
#define KeyCard CardSelect,3
#define IllegalCard CardSelect,4
#define IO_Door PORTB,1
#define IO_Buzzer PORTB,2
#define IO_Trip PORTB,3
#define Dir_Door TRISB,1
#define Dir_Buzzer TRISB,2
#define Dir_Trip TRISB,3
ResetCard_EE equ 0x00
SetCodeCard_EE equ 0x01
SetKeyCard_EE equ 0x02
KeyCard_EE equ 0x03
Code_EE equ 0x04
Key_EE equ 0x05
FirstRun equ 0x06
org 0x00
goto start
org 0x08
goto INTServer
org 0x30
;**************************************************************************
;中断服务程序,包括接收串行中断和外部中断服务程序
;**************************************************************************
INTServer
bcf INTCON,GIE
push
movwf _WREG
movff STATUS,_STATUS
movff BSR,_BSR
;*************************************************************************
btfsc INTCON,INT0IF
call INTServer_SendCMD
btfsc PIR1,RCIF
call INTServer_Receive
;*************************************************************************
movff _BSR,BSR
movff _STATUS,STATUS
movf _WREG,W
pop
bsf INTCON,GIE
retfie
;**************************************************************************
start
;**************************************************************************
;指令初始化
;**************************************************************************
lfsr FSR0,ReadBlocks
movlw 0xba
movwf POSTINC0
movlw 0x04
movwf POSTINC0
movlw 0x33
movwf POSTINC0
movlw 0x00
movwf POSTINC0
movlw 0x10
movwf POSTINC0
;****************************************************************************
movlw FirstRun
movwf EEADR
bcf EECON1,EEPGD
bcf EECON1,CFGS
bsf EECON1,RD
a
btfsc EECON1,RD
goto a
movf EEDATA,W
xorlw 0xff
btfss STATUS,Z
goto runwei
movlw ResetCard_EE
movwf WREEPROM_ADD
movlw 0x00
movwf WREEPROM_DAT
call WREEPROM
movlw SetCodeCard_EE
movwf WREEPROM_ADD
movlw 0x01
movwf WREEPROM_DAT
call WREEPROM
movlw SetKeyCard_EE
movwf WREEPROM_ADD
movlw 0x02
movwf WREEPROM_DAT
call WREEPROM
movlw FirstRun
movwf WREEPROM_ADD
movlw 0x00
movwf WREEPROM_DAT
call WREEPROM
runwei
;****************************************************************************
;端口初始化
;****************************************************************************
bsf Dir_Door
bcf Dir_Buzzer
bcf Dir_Trip
bcf IO_Door
bcf IO_Buzzer
bcf IO_Trip
;****************************************************************************
;标志初始化
;****************************************************************************
clrf Flag
clrf CardSelect
;****************************************************************************
;串口初始化
;****************************************************************************
movlw 0x19
movwf SPBRG
movlw 0x04
movwf TXSTA
movlw 0x80
movwf RCSTA
movlw 0x80
movwf TRISC
bsf TXSTA,TXEN
bcf RCSTA,CREN
bcf PIE1,RCIE
movlw 0xc0
movwf INTCON
bsf INTCON,INT0IE
bcf INTCON2,INTEDG0
;****************************************************************************
;主程序
;****************************************************************************
IsDoorOpen
btfss IO_Door
goto IsDoorOpen
movlw 0x01;20ms
movwf Delay_Para1
movlw 0x01
movwf Delay_Para2
call Delay
btfss IO_Door
goto IsDoorOpen
btfss Flag_OpenDoor
goto Alern
OpenDoor
bcf Flag_OpenDoor
Continue_OpenDoor
bsf IO_Buzzer
movlw 0x01;100ms
movwf Delay_Para1
movlw 0x05
movwf Delay_Para2
call Delay
bcf IO_Buzzer
bsf Flag_FourSecond
movlw 0x01;4s延时
movwf Delay_Para1
movlw 0x90
movwf Delay_Para2
call Delay
bcf Flag_FourSecond
goto Continue_OpenDoor
Alern
movlw 0xc0
movwf INTCON
bsf INTCON,INT0IE
bcf INTCON2,INTEDG0
bsf Flag_Alern
bsf IO_Buzzer
movlw 0x01;250ms
movwf Delay_Para1
movlw 0x0c
movwf Delay_Para2
call Delay
bcf IO_Buzzer
Countinue_Alern
bsf IO_Trip
movlw 0x01;20ms
movwf Delay_Para1
movlw 0x01
movwf Delay_Para2
call Delay
bcf IO_Trip
bsf Flag_TwentySecond
movlw 0x03;20s
movwf Delay_Para1
movlw 0xf2
movwf Delay_Para2
call Delay
bcf Flag_TwentySecond
goto Countinue_Alern
;****************************************************************************
;延时子程序
;两个入口参数,分别是Delay_Para1、Delay_Para2
;****************************************************************************
Delay
movf Delay_Para1,W
movwf Delay_Count1
Delay1
movf Delay_Para2,W
movwf Delay_Count2
Delay2
movlw 0x09
movwf Delay_Count3
Delay3
movlw 0x00
movwf Delay_Count4
Delay4
;******************************************************
btfss Flag_FourSecond
goto Next1
btfsc IO_Door
goto Next1
bcf Flag_FourSecond
movlw 0xc0
movwf INTCON
bsf INTCON,INT0IE
bcf INTCON2,INTEDG0
goto IsDoorOpen
Next1
btfss Flag_TwentySecond
goto Next2
btfsc Flag_Alern
goto Next2
bcf Flag_TwentySecond
goto OpenDoor
Next2
; btfss Flag_Twelve
; goto Next3
; btfsc IO_Door
; goto Next3
; bcf Flag_Twelve
; goto
;Next3
;*******************************************************
decfsz Delay_Count4
goto Delay4
decfsz Delay_Count3
goto Delay3
decfsz Delay_Count2
goto Delay2
decfsz Delay_Count1
goto Delay1
return
;*******************************************************************************
;读卡中断服务子程序
;*******************************************************************************
INTServer_SendCMD
bcf INTCON,INT0IF
bcf PIE1,RCIE
lfsr FSR0,ReadBlocks
incf FSR0L
movf POSTDEC0,W
movwf SendLength
incf SendLength,F
clrf CheckData
OneByte
movf POSTINC0,W
xorwf CheckData,F
movwf TXREG
nop
IsAllBitsOver_OneByte
btfss PIR1,TXIF
goto IsAllBitsOver_OneByte
decfsz SendLength
goto OneByte
movf CheckData,W
movwf TXREG
nop
IsAllBitsOver_CheckDataByte
btfss PIR1,TXIF
goto IsAllBitsOver_CheckDataByte
bcf INTCON,INT0IE
bsf Flag_ReceiveReady
bcf Flag_ReceiveOver
bsf RCSTA,CREN
bsf PIE1,RCIE
bsf INTCON,GIE
lfsr FSR0,ReceiveBuffer
WaitReceiveOver
btfsc Flag_ReceiveOver
goto VerifyData
btfsc Flag_TimeOut
goto VerifyData
goto WaitReceiveOver
VerifyData
bsf IO_Buzzer
movlw 0x01;100ms
movwf Delay_Para1
movlw 0x05
movwf Delay_Para2
call Delay
bcf IO_Buzzer
bcf INTCON,GIE
bcf PIE1,RCIE
lfsr FSR0,ReceiveBuffer
incf FSR0L,F
incf FSR0L,F
movf POSTINC0,W
xorlw 0x33
btfss STATUS,Z
goto DataError
movf POSTINC0,W
xorlw 0x00
btfss STATUS,Z
goto DataError
btfsc Flag_TimeOut
goto DataError
ExtractUsefullData
lfsr FSR1,UsefullData
movf POSTINC0,W
movwf POSTINC1
movf POSTINC0,W
movwf POSTINC1
movf POSTINC0,W
movwf POSTINC1
movf POSTINC0,W
movwf POSTINC1
DetermineCard
movlw 0x06
movwf EEPROM_Count
movlw ResetCard_EE
movwf EEADR
lfsr FSR0,ResetCard_RAM
bcf EECON1,EEPGD
bcf EECON1,CFGS
Continue_EEPROM
bsf EECON1,RD
movf EEDATA,W
movwf POSTINC0
incf EEADR,F
decfsz EEPROM_Count
goto Continue_EEPROM
movf UsefullData,W
cpfseq ResetCard_RAM
goto a1
goto TheCardIsResetCard
a1
cpfseq SetCodeCard_RAM
goto b1
goto TheCardIsSetCodeCard
b1
cpfseq SetKeyCard_RAM
goto c1
goto TheCardIsSetKeyCard
c1
cpfseq KeyCard_RAM
goto d1
goto TheCardIsKeyCard
d1
bsf IllegalCard
goto Action
TheCardIsResetCard
bsf ResetCard
goto Action
TheCardIsSetCodeCard
bsf SetCodeCard
goto Action
TheCardIsSetKeyCard
bsf SetKeyCard
goto Action
TheCardIsKeyCard
bsf KeyCard
goto Action
Action
btfsc IllegalCard
goto DataError
btfsc ResetCard
goto Action_ResetCard
btfsc SetCodeCard
goto Action_SetCodeCard
btfsc SetKeyCard
goto Action_SetKeyCard
btfsc KeyCard
goto Action_KeyCard
Action_ResetCard
lfsr FSR0,UsefullData
incf FSR0L,F
movf POSTINC0,W
movwf WREEPROM_DAT
movlw Code_EE
movwf WREEPROM_ADD
call WREEPROM
movf POSTINC0,W
movwf WREEPROM_DAT
movlw KeyCard_EE
movwf WREEPROM_ADD
call WREEPROM
return
Action_SetCodeCard
lfsr FSR0,UsefullData
incf FSR0L,F
movf POSTINC0,W
bcf STATUS,Z
xorwf Code_RAM
btfss STATUS,Z
return
movf POSTINC0,W
movwf WREEPROM_DAT
movlw Code_EE
movwf WREEPROM_ADD
call WREEPROM
return
Action_SetKeyCard
lfsr FSR0,UsefullData
incf FSR0L,F
movf POSTINC0,W
bcf STATUS,Z
xorwf Code_RAM
btfss STATUS,Z
return
movf POSTINC0,W
movwf WREEPROM_DAT
movlw KeyCard_EE
movwf WREEPROM_ADD
call WREEPROM
return
Action_KeyCard
lfsr FSR0,UsefullData
incf FSR0L,F
movf POSTINC0,W
bcf STATUS,Z
xorwf Code_RAM
btfss STATUS,Z
return
btfss Flag_Alern
goto wangrunwei
bcf Flag_Alern
clrf INTCON
return
wangrunwei
bsf Flag_OpenDoor
; bsf Flag_Twelve
; movlw 0x10
; movwf Delay_Para1
; movlw 0x10
; movwf Delay_Para2
; call Delay
; bcf Flag_Twelve
; goto wangrunwei
clrf INTCON
return
DataError
nop
nop
return
;*******************************************************************************
;接收中断服务子程序
;*******************************************************************************
INTServer_Receive
bcf PIR1,RCIF
movf RCREG,W
btfss Flag_ReceiveReady
goto ReceiveOtherBytes
ReceiveFirstByte
xorlw 0xbd
btfss STATUS,Z
goto FirstByteIsNotBD
FirstByteIsBD
bcf Flag_ReceiveReady
bcf Flag_ReceiveOver
clrf ReceiveNum
movlw 0xbd
movwf POSTINC0
; clrf POSTINC0
return
FirstByteIsNotBD
incf ReceiveNum,F
return
ReceiveOtherBytes
btfsc Flag_DeterLen
goto ReceiveStart
incf ReceiveNum,F
movwf POSTINC0
movwf ReceiveLen
bsf Flag_DeterLen
return
ReceiveStart
movwf POSTINC0
movf ReceiveNum,W
incf ReceiveNum,F
cpfseq ReceiveLen
return
bsf Flag_ReceiveOver
bcf Flag_DeterLen
return
;*******************************************************************************
WREEPROM
movf WREEPROM_ADD,W
movwf EEADR
movf WREEPROM_DAT,W
movwf EEDATA
bcf EECON1,EEPGD
bsf EECON1,WREN
bcf INTCON,GIE
movlw 0x55
movwf EECON2
movlw 0xaa
movwf EECON2
bsf EECON1,WR
kk
btfsc EECON1,WR
goto kk
bcf EECON1,WREN
bsf INTCON,GIE
return
;*******************************************************************************
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -