📄 main.asm
字号:
list p=16f877,R=DEC
include "p16f877.inc"
A_reg equ 32
B_reg equ 33
C_reg equ 34
TempFSR equ 35
AI_reg equ 36
BI_reg equ 37
CI_reg equ 38
TempD equ 39
Count_reg equ 40
Value_reg equ 41
Temp equ 42
Delay1_reg equ 43
Delay2_reg equ 44
IsChanging equ 45
NumOfErr equ 46
W_Temp equ 47
STATUS_Temp equ 48
Scaler equ 49
;;;;;;;;;User Reset Vector;;;;;;;;;
org 0x00
nop
goto MainLine
;;;;;;;;;Interrupt Vector;;;;;;;;;
org 0x04
goto IntService
;;;;;;;;;Interrupt Server Routine;;;;;;;;;
IntService
banksel W_Temp
movwf W_Temp
swapf STATUS,w
movwf STATUS_Temp
btfsc PIR1,TMR1IF
call Timer1
swapf STATUS_Temp,w
movwf STATUS
swapf W_Temp,f
swapf W_Temp,w
retfie
;;;;;;;;;Timer1 Subroutine;;;;;;;;;
Timer1
banksel PIR1
bcf PIR1,TMR1IF
decf Scaler,f
clrf TMR1L
movlw 0x3c
movwf TMR1H
movlw 0x50
movwf TMR1L
return
;;;;;;;;;Main Program;;;;;;;;;
MainLine
call Initial
MainLoop
;;;light locked LED;;;
banksel NumOfErr
movlw 0x05
subwf NumOfErr,w
btfsc STATUS,Z
goto SoundAlarm
banksel PORTE
movlw 0x02
movwf PORTE
;;;turn off 7SEG-LED;;;
movlw 0xff
movwf PORTC
movlw 0x0f
movwf PORTD
movlw 0xff
movwf AI_reg
movwf BI_reg
movwf CI_reg
call Polling
goto MainLoop
;;;Sound Alarm for trying;;;
SoundAlarm
movlw 0x00
movwf NumOfErr
movlw 0xff
movwf Temp
LoopAlarm
movlw 0x07
movwf PORTE
call Delay4ms
decfsz Temp
goto LoopAlarm
goto MainLoop
;;;;;;;;;Initial;;;;;;;;;
Initial
;;;Initialize Port Control Here;;;
banksel TRISB
movlw 0xff
movwf TRISB
movlw 0x00
movwf TRISC
movwf TRISD
movwf TRISE
;;;Initialize Register Here;;;
banksel AI_reg
movlw 0xff
movwf AI_reg
movwf BI_reg
movwf CI_reg
movlw 0x00
movwf Count_reg
movwf Value_reg
movwf Temp
movwf IsChanging
;;;Read Last Modified Password;if not set,Password is '8888'
call RDEPROM
;;;Set Number of Error to 0
movlw 0x00
movwf NumOfErr
;;;Set Scaler To 200;;;
movlw 200
movwf Scaler
;;;Initialze Timer1;;;;
banksel T1CON
clrf T1CON
clrf TMR1H
clrf TMR1L
clrf INTCON
bsf INTCON,PEIE
banksel PIE1
clrf PIR1
bsf PIE1,TMR1IE
banksel PIR1
clrf PIR1
clrf TMR1L
movwf 0x3c
movwf TMR1H
movlw 0x50
movwf TMR1L
bsf INTCON,GIE
return
;;;;;;;;;RDEPROM;;;;;;;;;
RDEPROM
banksel EEADR
movlw 0x10
movwf EEADR
banksel EECON1
bcf EECON1,EEPGD
bsf EECON1,RD
banksel EEDATA
movf EEDATA,W
banksel A_reg
movwf A_reg
banksel EEADR
movlw 0x11
movwf EEADR
banksel EECON1
bcf EECON1,EEPGD
bsf EECON1,RD
banksel EEDATA
movf EEDATA,W
banksel B_reg
movwf B_reg
banksel EEADR
movlw 0x12
movwf EEADR
banksel EECON1
bcf EECON1,EEPGD
bsf EECON1,RD
banksel EEDATA
movf EEDATA,W
banksel C_reg
movwf C_reg
return
;;;;;;;;;Polling the keyboard input;;;;;;;;;
Polling
;;;any key pressed;;;
call CheckKeyPressed
btfsc STATUS,Z
;;;Here might be an Error;;;
goto Polling
call Delay4ms
call CheckKeyPressed
btfsc STATUS,Z
goto Polling
call KeyTable
movlw 0x0a
subwf Temp,w
btfsc STATUS,Z
goto SetModifyFlag
;;;Check Range;;;
btfss STATUS,C
goto SameProcess
goto Polling
;;;Set Flag for Changing password and Lighting the Changing LED;;;
SetModifyFlag
banksel PORTE
movlw 0x04
movwf PORTE
movlw 0x01
movwf IsChanging
;;;Input password;;;
SameProcess
call InputPassword
call Delay4ms
call Delay4ms
call Delay4ms
;;;Check Password;;;
call CheckPassword
;;;If Wrong;;;
btfss STATUS,Z
goto WrongPassword
goto RightPassword
WrongPassword
banksel NumOfErr
;;;;;;;;;Chesk Whether is Time out;;;;;
movf Scaler,f
btfsc STATUS,Z
goto EndPolling
movlw 201
subwf Scaler,w
btfsc STATUS,C
goto EndPolling
movlw 0x01
addwf NumOfErr,f
movlw 0x00
movwf IsChanging
goto EndPolling
RightPassword
;;;Set Nmber Of Error to 0;;;
banksel NumOfErr
movlw 0x00
movwf NumOfErr
;;;If Changing Password,Inputing New Password;;;
btfss IsChanging,0
goto UnLock
;;;ligting the 1111<Debug only>;;;
banksel PORTC
movlw 0x11
movwf PORTC
movlw 0x01
movwf PORTD
movwf AI_reg
movwf BI_reg
movwf CI_reg
call InputNewPassword
call WriteEPROM
;;;lighting the 0000<Debug only>;;;
banksel PORTC
movlw 0x99
movwf PORTC
movlw 0x09
movwf PORTD
;;;return to default setting;;;
banksel IsChanging
movlw 0x00
movwf IsChanging
movwf Count_reg
goto EndPolling
;;;If not Changing Paddword,lighting the unlocked LED;;;
UnLock
banksel PORTE
movlw 0x01
movwf PORTE
movlw 0X88
movwf PORTC
movlw 0x08
movwf PORTD
;;;Check Whether Press Unlock key;;;
CheckUnlock
;;;any key pressed;;;
call CheckKeyPressed
btfsc STATUS,Z
;;;Here might be an Error;;;
goto CheckUnlock
call Delay4ms
call CheckKeyPressed
btfsc STATUS,Z
goto CheckUnlock
call KeyTable
movlw 0x0b
subwf Temp,w
btfsc STATUS,Z
goto CheckUnlock
EndPolling
return
;;;;;;;;;Check Key Pressed;;;;;;;;;
;;;Return Value 0(Z=1) for none pressed;;;
CheckKeyPressed
banksel PORTD
movlw 0x0f
andwf PORTD,f
movf PORTB,w
movwf Temp
movlw 0x0f
andwf Temp,f
subwf Temp,w
return
;;;;;;;;;KeyTable;;;;;;;;;
;;;Return Value is in Temp ranging from 1 to16 includeing 25;;;
;;;which indicate an Error;;;
KeyTable
banksel Delay1_reg
movlw 0x04
movwf Delay1_reg
movlw 0x0f
andwf PORTD,f
movlw 0xe0
movwf TempD
iorwf PORTD,f
KeyTablePolling
movf PORTB,w
movwf Temp
movlw 0x04
movwf Delay2_reg
RowPolling
bcf STATUS,C
rrf Temp,f
btfss STATUS,C
goto EndKeyTablePolling
decfsz Delay2_reg
goto RowPolling
bcf STATUS,C
rlf TempD,f
btfss STATUS,C
bcf TempD,4
bsf TempD,4
movlw 0x0f
andwf PORTD,f
movf TempD,w
iorwf PORTD,f
decfsz Delay1_reg,f
goto KeyTablePolling
EndKeyTablePolling
;;;Delay1_reg is Column Index,and Delay2_reg is Row Index;;;
movlw 0x05
movwf Temp
movf Delay1_reg,w
subwf Temp,w
movwf Delay1_reg
;;;index=Delay1_reg+(Delay2_reg-1)*Delay1_reg;;;
movlw 0x05
movwf Temp
movf Delay2_reg,w
subwf Temp,w
movwf Delay2_reg
;;;Set Temp=0;;;
movlw 0x00
movwf Temp
PollingMutiply
decfsz Delay1_reg
goto DoMutiply
goto EndMutiply
DoMutiply
movlw 0x04
addwf Temp,f
goto PollingMutiply
EndMutiply
;;;End Mutiplying and add Column Index;;;
movf Delay2_reg,w
addwf Temp,f
;;;for'0';;;
movlw 0x01
subwf Temp,f
return
;;;;;;;;;InputPassword;;;;;;;;;
InputPassword
banksel Temp
btfss IsChanging,0
goto Input
bcf T1CON,TMR1ON
movlw 200
movwf Scaler
bsf T1CON,TMR1ON
InputEx
movf Scaler,f
btfsc STATUS,Z
goto EndInputPassword
;;;any key pressed;;;
call CheckKeyPressed
btfsc STATUS,Z
;;;Here might be an Error;;;
goto InputEx
call Delay4ms
call CheckKeyPressed
btfsc STATUS,Z
goto InputEx
call KeyTable
movlw 0x0c
subwf Temp,w
btfsc STATUS,Z
goto EndInputPassword
movlw 0x0a
subwf Temp,w
;;;Check Range;;;
btfsc STATUS,C
goto InputEx
Input
bcf T1CON,TMR1ON
movlw 200
movwf Scaler
bsf T1CON,TMR1ON
movwf 36
movwf TempFSR
movf TempFSR,w
movwf FSR
;;;Store First Input and set Count_reg;;;
movf Temp,w
movwf INDF
movlw 0x02
movwf Count_reg
;;;UpdateLEDOutput;;;
call UpdateLEDOutput
PollingInputPassword
;;;any key pressed;;;
movf Scaler,f
btfsc STATUS,Z
goto EndInputPassword
call CheckKeyPressed
btfsc STATUS,Z
goto PollingInputPassword
call Delay4ms
call CheckKeyPressed
btfsc STATUS,Z
goto PollingInputPassword
call KeyTable
movlw 0x0c
subwf Temp,w
btfsc STATUS,Z
goto BackSpace
movlw 0x0a
subwf Temp,w
btfsc STATUS,C
goto PollingInputPassword
bcf T1CON,TMR1ON
movlw 200
movwf Scaler
bsf T1CON,TMR1ON
movf TempFSR,w
addlw 0x01
movwf TempFSR
movwf FSR
movf Temp,w
movwf INDF
call UpdateLEDOutput
decfsz Count_reg
goto PollingInputPassword
goto EndInputPassword
BackSpace
bcf T1CON,TMR1ON
movlw 200
movwf Scaler
bsf T1CON,TMR1ON
movlw 0x03
subwf Count_reg,w
btfsc STATUS,Z
goto EndInputPassword
movf TempFSR,w
movwf FSR
movlw 0xff
movwf INDF
movlw 0x01
addwf Count_reg,f
movlw 0x01
subwf TempFSR,f
call UpdateLEDOutput
goto PollingInputPassword
EndInputPassword
bcf T1CON,TMR1ON
return
;;;;;;;;;Update LED Output in terms of Keyboard Input;;;;;;;;;
UpdateLEDOutput
;;;Following For <Debug Only>;;;
banksel AI_reg
movf AI_reg,w
andlw 0x0f
movwf Temp
swapf BI_reg
andlw 0xf0
iorwf Temp,f
movf Temp,w
movwf PORTC
movf CI_reg,w
movwf Temp
movlw 0x0f
andwf Temp,w
movwf PORTD
EndUpdate
return
;;;;;;;;;Check Password;;;;;;;;;
CheckPassword
banksel A_reg
;;;Check AI_reg;;;
movf A_reg
subwf AI_reg,w
btfss STATUS,Z
goto EndCheck
;;;Check BI_reg;;;
movf B_reg
subwf BI_reg,w
btfss STATUS,Z
goto EndCheck
;;;Check CI_reg;;;
movf C_reg
subwf CI_reg,w
btfss STATUS,Z
goto EndCheck
EndCheck
return
;;;;;;;;;Input New Password;;;;;;;;;
InputNewPassword
banksel Temp
movlw 36
movwf TempFSR
movf TempFSR,w
movwf FSR
movlw 0x03
movwf Count_reg
PollingInputNewPassword
;;;any key pressed;;;
call CheckKeyPressed
btfsc STATUS,Z
goto PollingInputNewPassword
call Delay4ms
call CheckKeyPressed
btfsc STATUS,Z
goto PollingInputNewPassword
call KeyTable
movlw 0x0c
subwf Temp,w
btfsc STATUS,Z
goto BackSpaceNew
movlw 0x0a
subwf Temp,w
btfsc STATUS,C
goto PollingInputNewPassword
movf TempFSR,w
movwf FSR
movf Temp,w
movwf INDF
movf TempFSR,w
addlw TempFSR
movwf FSR
call UpdateLEDOutput
decfsz Count_reg
goto PollingInputNewPassword
goto EndInputNewPassword
BackSpaceNew
movlw 0x03
subwf Count_reg,w
btfsc STATUS,Z
goto PollingInputNewPassword
movlw 0x01
subwf TempFSR,f
movf TempFSR,w
movwf FSR
movlw 0x01
movwf INDF
movlw 0x01
addwf Count_reg,f
call UpdateLEDOutput
goto PollingInputNewPassword
EndInputNewPassword
return
;;;;;;;;WriteEPROM;;;;;;;;;
WriteEPROM
;;;Write AI_reg;;;
movlw 0x10
movwf Temp
movf AI_reg,w
movwf A_reg
movwf Value_reg
call WriteEPROM_Parameters
;;;Write BI_reg;;;
movlw 0x11
movwf Temp
movf BI_reg,w
movwf B_reg
movwf Value_reg
call WriteEPROM_Parameters
;;;Write CI_reg;;;
movlw 0x12
movwf Temp
movf CI_reg,w
movwf C_reg
movwf Value_reg
call WriteEPROM_Parameters
return
;;;;;;;;;WriteEPROM Accepts Temp and Value_reg ad a parameter;;;;;;;;;
;;;Here Temp is Address and Value_reg is Value;;;
WriteEPROM_Parameters
banksel Temp
movf Temp,w
banksel EEADR
movwf EEADR
banksel Value_reg
movf Value_reg,w
banksel EECON1
bsf EECON1,EEPGD
bsf EECON1,GIE
movlw 0x55
movwf EECON2
movlw 0xaa
movwf EECON2
bsf EECON1,WR
bsf INTCON,GIE
banksel PIR2
Wait_EEIF
btfss PIR2,EEIF
goto Wait_EEIF
bcf PIR2,EEIF
bcf EECON1,WREN
banksel Value_reg
return
;;;;;;;;;Delay 4ms;;;;;;;;;
Delay4ms
banksel Delay1_reg
movlw 0xff
movwf Delay1_reg
clrf Delay2_reg
Loop4ms
decfsz Delay2_reg
goto Loop4ms
decfsz Delay1_reg
goto Loop4ms
return
;;;;;;;;;Main Exit;;;;;;;;;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -