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 14:48
;*************************************
;功能:数码管显示N位数
;初始化:POUT=PDIG=0XFF

;输入:LEDS=1   DAT1为要显示的数
;        LEDS=2                DAT1,DAT2为要显示的数
;        LEDS=3                DAT1,DAT2,DAT3为要显示的数
;        LEDS=4或5        4<=N<=8  DAT1[N]为要显示的数

;应用:改变LEDS 的赋值可选择编译调用不同的程序
;DEFINE                LEDS        1
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
;**********************************
POUT        EQU        PB
PDIG        EQU        PC
;DAT1        EQU        VAL
;NBYT 为4,5子程序用
;NBYT为要显示的位数
#DEFINE        NBYT        6
;LEDS  为要调用的显示程序
#DEFINE        LEDS        4

;#DEFINE        LEDAC        2
IF        LEDS==3||4
DID                EQU                29H
ENDIF
IF        LEDS==5
DID                EQU                29H
DIG                EQU                28H
ENDIF
;************************
IF LEDS==1
LEDNS        MACRO
;1BYTE LED DISPLAY
;功能:数码管显示1位数
;初始化:POUT=PDIG=0XFF
;输入:DAT1为要显示的数
;应用:在程序中声明
;DEFINE                LEDS        1
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
DISP:
        MOVF        DAT1,0
        CALL        TAB
        MOVWF        POUT
;        MOVLW        02H
;        MOVWF        PDIG
        COMF        POUT,1        ;共阴极,共阳可略
        BCF                PDIG,0       
        RETLW        0
        LEDTAB
        ENDM
ENDIF
;**********************
IF        LEDS==2
LEDNS        MACRO
;2BYTE LED DISPLAY
;功能:数码管显示2位数
;初始化:POUT=PDIG=0XFF
;输入:DAT1,DAT2为要显示的数
;应用:在程序中声明
;DEFINE                LEDS        2
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
DISP:
        MOVLW        0FFH
        MOVWF        POUT
        BTFSC        PDIG,1
        GOTO        DPS1               
        MOVF        DAT1,0
        CALL        TAB
        MOVWF        POUT
        COMF        POUT,1
        BCF                PDIG,0
        BSF                PDIG,1
        RETLW        0
DPS1:MOVF        DAT2,0
        CALL        TAB
        MOVWF        POUT
        COMF        POUT,1
        BSF                PDIG,0
        BCF                PDIG,1
        RETLW        0
        LEDTAB
        ENDM
ENDIF
;**********************
IF        LEDS==3
LEDNS        MACRO
;功能:数码管显示3位数
;初始化:POUT=PDIG=0XFF
;                DID=0
;输入:DAT1,DAT2为要显示的数
;应用:在程序中声明
;DEFINE                LEDS        3
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
DISP:  ; 3-4BYTE
        MOVLW        0H
        MOVWF        POUT
        MOVF        DID,0
        ADDWF        PCL,1
DSP:GOTO        DSP1
        GOTO        DSP2
        GOTO        DSP3
        CLRF        DID
        RETLW        0
DSP1:               
        MOVF        DAT1,0
        CALL        TAB
        MOVWF        POUT
        COMF        POUT,1
        MOVLW        0FEH
        MOVWF        PDIG
        INCF        DID,1
        RETLW        0       
DSP2:MOVF        DAT2,0
        CALL        TAB
        MOVWF        POUT
        COMF        POUT,1
        SETC
        RLF                PDIG,1
        INCF        DID,1
        RETLW        0
DSP3:MOVF        DAT3,0
        CALL        TAB
        MOVWF        POUT
        COMF        POUT,1
        SETC
        RLF                PDIG,1
        INCF        DID,1
        RETLW        0       
        LEDTAB
        ENDM
ENDIF
;************************
IF        LEDS==4
LEDNS        MACRO
;功能:数码管显示N位数
;初始化:POUT=PDIG=0XFF
;                DID=0
;输入:DAT1[N]为要显示的数
;应用:在程序中声明
;DEFINE                NBYT        N        4<=NBYT<=8
;DEFINE                LEDS        4         
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
DISP:MOVF        DID,0
        XORLW        NBYT
        BTFSS        STATUS,Z
        GOTO        DNEX
        CLRF        DID
        MOVLW        0FEH
        MOVWF        PDIG
DNEX:
        MOVF        DID,0
        BZ                DNEX1
        SETC
        RLF                PDIG,1       
DNEX1:MOVLW        DAT1
        MOVWF        FSR
        MOVF        DID,0
        ADDWF        FSR,1
        MOVF        INDF,0
        CALL        TAB
        MOVWF        POUT
        COMF        POUT,1
        INCF        DID,1
        RETLW        0
        LEDTAB       
        ENDM
ENDIF
;************************
IF        LEDS==5
LEDNS        MACRO
;功能:数码管显示N位数,同上
;初始化:POUT=PDIG=0XFF
;                DID=0 ,DIG=0XFE
;输入:DAT1[N]为要显示的数
;应用:在程序中声明
;DEFINE                NBYT        N        N位要显示的数       
;DEFINE                LEDS        N  5
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
DISP:
        MOVLW        0H
        MOVWF        POUT
        MOVLW        DAT1
        MOVWF        FSR
        MOVF        DID,0
        ADDWF        FSR,1
DSLP:MOVF        INDF,0
        CALL        TAB
        MOVWF        POUT
        COMF        POUT,1
        MOVF        DIG,0
        MOVWF        PDIG
        SETC
        RLF                DIG,1
DSEXT:       
        INCF        DID,1
        MOVF        DID,0
        XORLW        NBYT
        BTFSS        STATUS,Z
        RETLW        0       
        CLRF        DID
        MOVLW        0FEH
        MOVWF        DIG
        RETLW        0
        LEDTAB
        ENDM
ENDIF

LEDTAB        MACRO       
TAB:;ANDLW        0FH
        ADDWF        PCL
TAB1:RETLW        0XC0        ;0
        RETLW        0XF9        ;
        RETLW        0XA4
        RETLW        0XB0
        RETLW        0X99
        RETLW        0X92
        RETLW        0X82
        RETLW        0XF8
        RETLW        0X80
        RETLW        0X90
        RETLW        0X88
        RETLW        0X83
        RETLW        0XC6
        RETLW        0XA1
        RETLW        0X86
        RETLW        0X8E        ;F       
        RETLW        0XBF        ;-        10H
        RETLW        0X89        ;H        11H
        RETLW        0X8F        ;K
        RETLW        0XC7        ;L
        RETLW        0XAB        ;N        14H
        RETLW        0X8C        ;P
        RETLW        0X0               
        ENDM

一周热门 更多>