PIC 4X4按键做的密码锁

2020-02-08 12:16发布

INCLUDE<P16F877.INC>
#INCLUDE"MAIN.INC"
#INCLUDE"LEDSN.INC"
#INCLUDE"DEL.INC"
#INCLUDE"KEYS.INC"
#INCLUDE"EEPROM.INC"
EADR        EQU                31H
COUNT        EQU                32H

ORG                00H
        NOP       
MAIN:
        CALL        MAINIT
MLP:       
        CALL        DEL
        BTFSS        2FH,0
        GOTO        MLP       
        CALL        KEYS
        CALL        DISP
        BCF                2FH,0
        GOTO MLP
DELA
LEDNS
KEYFS
KEYSA
EPFLASH
KEYS:
        MOVF        KID,0
        ADDWF        PCL,1
KTAB:GOTO        KEYEN
        GOTO        KEYDEL
        GOTO        KEYSCAN
        GOTO        KEYUP
        GOTO        KEYPROC
        CLRF        KID
        RETLW        0
KEYPROC:
        CLRF        KID
        MOVLW        0AH
        SUBWF        VAL,0
        BTFSS        STATUS,C
        GOTO        KEYNUM
        ADDWF        PCL,F
        GOTO        KEYA        ;读数据并比较
        GOTO        KEYB        ;清0
        GOTO        KEYC        ;修改地址
        GOTO        KEYD        ;写入新数据
        GOTO        KEYE        ;--
        GOTO        KEYF        ;--
        CLRF        VAL
        RETLW        0
       
KEYA:        ;AFUN
;        MOVLW        0AH
;        MOVWF        DAT1
        BTFSC        2FH,3
        GOTO        KAEXT
        MOVLW        DAT1
        MOVWF        FSR
        MOVLW        6
        MOVWF        R0
KAL:CALL        EPREAD
        MOVF        DAT,W
        XORWF        INDF,W
        BNZ                KAEXT
        INCF        ADR,F
        DECFSZ        R0,F
        GOTO        KAL
        BSF                2EH,0
KAEXT:
        RETLW        0

KEYB:        ;BFUN
;        MOVLW        0BH
;        MOVWF        DAT1
        MOVLW        6
        MOVWF        R0
        MOVLW        DAT1
        MOVWF        FSR
        CLRW
KBL:CLRF        INDF
        ;MOVWF        INDF,1
        INCF        FSR,F
        DECFSZ        R0,1
        GOTO        KBL
        RETLW        0
               
KEYC:        ;CFUN
;        MOVLW        0CH
;        MOVWF        DAT1
        BSF        2EH,1
        MOVF        EADR,0
        MOVWF        ADR
        CALL        EPREAD
        XORLW        .200
        BNZ                KCEXT
;        CLRF        EADR
        MOVLW        7
        ADDWF        EADR,F
        ADDWF        ADR,F
KCEXT:
        RETLW        0
KEYD:
;        MOVLW        0DH
;        MOVWF        DAT1
        BTFSS        2EH,1
        GOTO        KCEXT
        MOVLW        DAT1
        MOVWF        FSR
        MOVLW        6
        MOVWF        R0
KDL:MOVF        INDF,0
        MOVWF        DAT
        CALL        EPWRITE
        INCF        FSR,F
        INCF        ADR,F
        DECFSZ        R0,F
        GOTO        KDL
        MOVF        EADR,0
        MOVWF        ADR
        MOVF        COUNT,W
        MOVWF        DAT
        CALL        EPWRITE
        INCF        COUNT,F
        BCF                2EH,1               
        RETLW        0
KEYE:

        RETLW        0
KEYF:
        RETLW        0
       
       
KEYNUM:       
        MOVLW        DAT1
        MOVWF        FSR
        MOVLW        2
        MOVWF        R1       
        MOVF        VAL,0
        MOVWF        R0
KPL:       
        MOVF        INDF,0
        MOVWF        KTMP
        MOVF        R0,0
        MOVWF        INDF
        INCF        FSR,1
        MOVF         INDF,0
        MOVWF        R0
        MOVF        KTMP,0
        MOVWF        INDF
        INCF        FSR,1
        DECFSZ        R1,1
        GOTO        KPL       
KNEXT:
        RETLW        0               
MAINIT:
        BANK1
        MOVLW        0FH
        MOVWF        TD
        CLRF        TC
        CLRF        TB
        BANK0
        CLRF        ADR
        CLRF        DAT
        CLRF        COUNT
        MOVLW        7
        MOVWF        EADR       
        MOVLW        04H
        MOVWF        DAT1       
        MOVLW        6H
        MOVWF        DAT2
        CLRF        DAT3
        CLRF        DAT4       
        MOVLW        0FFH
        MOVWF        PB
        MOVLW        0FFH
        MOVWF        PC
        RETLW        0
       
        END
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
789632aa
2020-02-08 23:31
;EPROM=1        EEPROM        读写操作
;EPROM=2        FLASH        读写操作
;EPROM=3        EEPROM AND FLASH        读写操作

;EECON1:18CH | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0
;                          EEPDG         -   -     -  WRERR WREN WR   RD
;EECON2:18DH        BANK3
;EEADR: 10DH        BANK2
;EEDATA:10CH

#DEFINE        EPROM        1
IF        EPROM==1
ADR                EQU                70H
DAT                EQU                71H
ENDIF
IF        EPROM==2
ADR                EQU                70H
ADRH        EQU                71H
DAT                EQU                72H
DATH        EQU                73H
ENDIF

IF        EPROM==1
EPFLASH                MACRO
;查询标志位,写入数据
;向EEPROM中写入一个字节
EPWRITE:
        BANK3
        BTFSC        EECON1,WR        ;
        GOTO        $-1       
        BANK2       
        MOVF        ADR,W
        MOVWF        EEADR
        MOVF        DAT,W
        MOVWF        EEDATA
        BANK3
        BCF        EECON1,EEPGD
        BSF        EECON1,WREN
        BCF        INTCON,GIE
        MOVLW        0X55
        MOVWF        EECON2
        MOVLW        0XAA
        MOVWF        EECON2
        BSF                EECON1,WR
        BCF                EECON1,WREN
        BSF                INTCON,GIE
        RETLW        0
;READ DATA  EEPROM
;从EEPROM中读取一个字节
;读取数据前检测是否写入
EPREAD:       
        BANK3
        BTFSC        EECON1,WR
        GOTO        $-1       
        BANK2
        CLRF        DAT
        MOVF        ADR,W
        MOVWF        EEADR
        BANK3
        BCF                EECON1,EEPGD
        BSF                EECON1,RD
        BANK2
        MOVF        EEDATA,W
        MOVWF        DAT
        RETLW        0
        ENDM
ENDIF
;FLASH        WRITE        READ
IF        EPROM==2
EPFLASH                MACRO
;向FLASH中写入两个字节
FLWRITE:
        BANK3
        BTFSC        EECON1,WR
        GOTO        $-1       
        BANK2       
        MOVF        ADR,W
        MOVWF        EEADR
        MOVF        ADRH,W
        MOVWF        EEADRH
        MOVF        DAT,W
        MOVWF        EEDATA
        MOVF        DATH,W
        MOVWF        EEDATH
        BANK3
        BSF        EECON1,EEPGD
        BSF        EECON1,WREN
        BCF        INTCON,GIE
        MOVLW        0X55
        MOVWF        EECON2
        MOVLW        0XAA
        MOVWF        EECON2
        BSF                EECON1,WR
        NOP
        NOP
        BCF                EECON1,WREN
        BSF                INTCON,GIE
        RETLW        0
;READ DATA  EEPROM
;从FLASH中读取两个字节
FLREAD:
        BANK3
        BTFSC        EECON1,WR
        GOTO        $-1       
        BANK2
        CLRF        DAT
        CLRF        DATH
        MOVF        ADR,W
        MOVWF        EEADR
        MOVF        ADRH,W
        MOVWF        EEADRH
        BANK3
        BSF                EECON1,EEPGD
        BSF                EECON1,RD
        NOP
        NOP
        BANK2
        MOVF        EEDATA,W
        MOVWF        DAT
        MOVF        EEDATH,W
        MOVWF        DATH       
        RETLW        0

        ENDM
ENDIF

IF        EPROM==3
EPFLASH                MACRO
;EEPROM        写入操作       
EPWRITE:
        BANK3
        BTFSC        EECON1,WR
        GOTO        $-1       
        BANK2       
        MOVF        ADR,W
        MOVWF        EEADR
        MOVF        DAT1,W
        MOVWF        EEDATA
        BANK3
        BCF        EECON1,EEPGD
        BSF        EECON1,WREN
        BCF        INTCON,GIE
        MOVLW        0X55
        MOVWF        EECON2
        MOVLW        0XAA
        MOVWF        EECON2
        BSF                EECON1,WR
        BCF                EECON1,WREN
        BSF                INTCON,GIE
        RETLW        0
;READ DATA  EEPROM
;从EEPROM中读取一个字节
EPREAD:
        BANK2
        MOVF        ADR,W
        MOVWF        EEADR
        BANK3
        BCF                EECON1,EEPGD
        BSF                EECON1,RD
        BANK2
        MOVF        EEDATA,W
        MOVWF        DAT1
        RETLW        0
;向FLASH中写入两个字节
EPWRITE:
        BANK3
        BTFSC        EECON1,WR
        GOTO        $-1       
        BANK2       
        MOVF        ADR,W
        MOVWF        EEADR
        MOVF        ADRH,W
        MOVWF        EEADRH
        MOVF        DAT1,W
        MOVWF        EEDATA
        MOVF        DAT2,W
        MOVWF        EEDATH
        BANK3
        BSF        EECON1,EEPGD
        BSF        EECON1,WREN
        BCF        INTCON,GIE
        MOVLW        0X55
        MOVWF        EECON2
        MOVLW        0XAA
        MOVWF        EECON2
        BSF                EECON1,WR
        NOP
        NOP
        BCF                EECON1,WREN
        BSF                INTCON,GIE
        RETLW        0
;从FLASH中读取两个字节
EPREAD:
        BANK2
        MOVF        ADR,W
        MOVWF        EEADR
        MOVF        ADRH,W
        MOVWF        EEADRH
        BANK3
        BCF                EECON1,EEPGD
        BSF                EECON1,RD
        NOP
        NOP
        BANK2
        MOVF        EEDATA,W
        MOVWF        DAT1
        MOVF        EEDATH,W
        MOVWF        DAT2       
        RETLW        0               
       
        ENDM
ENDIF

一周热门 更多>