⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text1.asm

📁 基于单片机的电子密码锁程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
						;********************************************
        ;*********        电子密码锁        *********
        ;********************************************
        ;*********         2008/6/10         *********
        ;********************************************
;显示缓冲区
        LED1    EQU    6FH
        BUFF    EQU    6EH
        TIMERS1 EQU    6DH     ;输入回车的次数
        TIMERS2 EQU    6CH     ;报警的次数
        LED6    EQU    6AH
        ;密码缓冲区
        PS1   EQU    69H
        PS2   EQU    78H
        PS3   EQU    67H
        PS4   EQU    66H
        PS5   EQU    65H
        PS6   EQU    64H
        PS7   EQU    63H
        PS8   EQU    62H
        ;AT24C02读取缓冲区
        AT1   EQU    61H
        AT2   EQU    60H
        AT3   EQU    5FH
        AT4   EQU    5EH
        AT5   EQU    5DH
        AT6   EQU    5CH
        AT7   EQU    5BH
        AT8   EQU    5AH
        ;按键标志位
        F_0   BIT    20H
        F_1   BIT    21H
        F_2   BIT    22H
        F_3   BIT    23H
        F_4   BIT    24H
        F_5   BIT    25H
        F_6   BIT    26H
        F_7   BIT    27H
        F_8   BIT    28H
        F_9   BIT    29H
        CH_STATE BIT 2AH     ;系统更改的状态标志位,为1表示busy
        FLAG1 BIT    2BH     ;功能键标志位,为1表示功能按键。
        F_F1  BIT     2CH
        F_F2  BIT     2DH
        PSW_F BIT     2EH    ;密码是否正确的标志位
        ;口资源定义
        SPK   BIT    P2.1
        WP    BIT    P3.5
        SDA   BIT    P3.6     ;定义串口数据端
        SCL   BIT    P3.7
       
        ORG   0000H
        AJMP  MAIN
        ORG   000BH
        ;AJMP  TIMER0
        ORG   001BH
        ;AJMP  TIMER1
        ORG   0030H
   MAIN:MOV   SP,    #70H
        MOV   TMOD,  #11H
        MOV   TH0,   #3CH
        MOV   TL0,   #0B0H
        MOV   TH1,   #3CH
        MOV   TL1,   #0B0H
        CLR   F_0            ;清除标志位
        CLR   F_1
        CLR   F_2
        CLR   F_3
        CLR   F_4
        CLR   F_5
        CLR   F_6
        CLR   F_7
        CLR   F_8
        CLR   F_9
        CLR   BUF_FULL
        CLR   CH_STATE
        CLR   FLAG1
        CLR   F_F1
        CLR   F_F2
        CLR   PSW_F
        MOV   BUFF,#00H      ;调用
        LCALL INITPS          ;初始化环境
        LCALL INITAT
        LCALL  XSA           ;调用默认显示
        MOV    TIMERS1,#00H
        NOP
        MOV   PS1,  #11H      ;初始化密码830620
        MOV   PS2,  #0AH
        MOV   PS3,  #02H
        MOV   PS4,  #13H
        MOV   PS5,  #0BH
        MOV   PS6,  #02H
  START:NOP                   ;程序开始
        LCALL CH_KEY         ;检查键盘
        AJMP  START           ;返回

 CH_KEY:LCALL KS             ;检查有没有按键按下
        JNZ   LK1
        AJMP  CH_KEY
    LK1:
        LCALL T10MSD
        ACALL KS
        JNZ   LK2
        RET

    LK2:
        NOP
        LCALL SBIE             ;按键识别子程序
        MOV   BUFF,  A        ;送缓冲区以识别是数字键还是功能键?
        LCALL CH_KF           ;判断按键功能。
        JB    FLAG1  ,KEY_FUN ;标志为1,则为功能键
;***********数字按键输入并且存放到缓冲区内等待比较***********
KEY_DIG:NOP                   ;设一标志,辨别输入是否满
        ;SETB  TR0
        INC   TIMERS           ;输入数字的位数
        MOV   A,    TIMERS
        CLR   C
        SUBB  A,    #01H
        JNZ   PS_2
        MOV   PS1,  BUFF      ;依照顺序存放密码
        AJMP  NEXT
   PS_2:MOV   A,   TIMERS
        SUBB  A,    #02H
        CLR   C
        JNZ   PS_3
        MOV   PS2,   BUFF
        AJMP  NEXT
    PS_3:MOV   A,   TIMERS
         CLR   C
         SUBB  A,    #03H
         JNZ   PS_4
         MOV   PS3,   BUFF
        AJMP  NEXT
   PS_4:MOV   A,    TIMERS
        CLR   C
        SUBB  A,    #04
        JNZ   PS_5
        MOV   PS4,  BUFF
        AJMP  NEXT
   PS_5:MOV   A,    TIMERS
        CLR   C
        SUBB  A,    #05
        JNZ   PS_6
        MOV   PS5,  BUFF
        AJMP  NEXT
   PS_6:MOV   A,    TIMERS
        CLR   C
        SUBB  A,    #06H
        JNZ   CH_KEY
        MOV   PS6,  BUFF
   NEXT:LCALL XSC
        MOV   R7,   TIMERS     ;比较输入的次数。
        CJNE  R7,   #06H  ,FULL
   FULL:JC    NEXT9
        SETB  BUF_FULL
        MOV   TIMERS1,#06H
        CLR   L3
        NOP
        CLR   P2.1
        LCALL T100MSD
        SETB  P2.1
        NOP
        AJMP  CH_KEY
  NEXT9:CLR   P2.1             ;密码输入一位,鸣叫一声。
        CLR   L3
        LCALL T100MSD         ;延时100ms
        SETB  L3
        SETB  P2.1
        AJMP  CH_KEY
;***************开门子程序 ********************************
     CL:NOP
        SETB  L3
        MOV   BUFF, #00H          ;消密码缓冲
        MOV   TIMERS,#00H
        LCALL INITPS              ;消除AT缓冲,调电存储后一定要加上
        LCALL XSC
        LCALL BP
        LCALL BP
        LCALL T100MSD
        LCALL BP
        CLR   FLAG1
        AJMP  CH_KEY

    FU4:NOP
        LCALL BP
        LCALL T100MSD
        LCALL BP
        LCALL T100MSD
        LCALL BP
        LCALL T100MSD
        LCALL BP
        LCALL T100MSD
        LCALL BP
        CLR   FLAG1
        AJMP  CH_KEY

    FU3:NOP
        LCALL BP
        LCALL T100MSD
        LCALL BP
        LCALL KILLXS ;关闭显示
        CLR   FLAG1
        AJMP  CH_KEY

    FU1:NOP
        LCALL XSC
        JB    F_F1,   NEXT_F1
        CLR   TL1
        LCALL BP
        SETB  F_F1
        AJMP  CH_KEY
NEXT_F1:SETB  TL1
        LCALL BP
        CLR   F_F1
        ;LCALL CH_STATE           ;查看现在的状态以防误按
        ;SETB  TR1                 ;报警限制暂时不开
        ;INC   F_F1
        CLR    FLAG1
        AJMP  CH_KEY

    FU2:NOP
        JB    F_F2,   NEXT_F2
        CLR   L2
        LCALL BP
        SETB  F_F2
        AJMP  CH_KEY
NEXT_F2:SETB  L2
        LCALL BP
        CLR   F_F2
        CLR   FLAG1
        AJMP  CH_KEY
;**************各类子程序********************************
;****  注意清楚缓冲区时AT1...AT8不应在初始化中执行,以 ***
;****  防两缓冲区都为0,相同开锁                       ***
;********************************************************

CLR_BUF:MOV   R7,  #06H
        MOV   R0,  #6FH
  LOOP1:MOV   A,   #00H
        MOV   @R0, A
        DEC   R0
        DJNZ  R7,LOOP1
        RET
;*************初始化显示缓冲区以及其他缓冲区**************
 INITPS:PUSH  ACC
        PUSH  PSW
        MOV   R7,  #06H
        MOV   R1,  #PS1
        MOV   A,   #00H
INIT_PS:MOV   @R1, A
        DEC   R1
        DJNZ  R7,  INIT_PS
        POP   PSW
        POP   ACC
        NOP
        RET

 INITAT:PUSH  ACC
        PUSH  PSW
        MOV   R7,#06H
        MOV   R1,#AT1
        MOV   A, #00H
INIT_AT:MOV   @R1, A
        DEC   R1
        DJNZ  R7,  INIT_AT
        MOV   TIMERS1,#00H     ;密码输入的次数清零。
        POP   PSW
        POP   ACC
        RET
;****************检验密码正误******************************
   C_PSW:PUSH  PSW
         PUSH  ACC
         MOV  R2,#06H
         MOV  R0,#PS1
         MOV  R1,#AT1
     C_P:CLR  C
         MOV  A,@R0
         SUBB A,@R1
         JNZ  RETURN
         DEC  R0
         DEC  R1
         DJNZ R2,C_P
         NOP
         SETB PSW_F
         AJMP EXIT7
  RETURN:CLR  PSW_F
   EXIT7:NOP
         POP  ACC
         POP  PSW
         RET
;×××××××××××××××××锁定,鸣笛子程序××××××××××××
 LOCK_1M:MOV  R4,#3CH       ;锁定1分钟
 M1_LOOP:LCALL SEC
         DJNZ  R4,M1_LOOP
         NOP
         RET

    WARN2S:PUSH  PSW
          PUSH  ACC
          MOV   R5, #14H      ;调用20次BP,报警2s
     WARN:LCALL BP
          DJNZ  R5,WARN
          NOP
          POP   ACC
          POP   PSW
          NOP
          RET
      BP:CLR   SPK            ;鸣笛子程序
          LCALL T100MSD
          SETB  SPK
          NOP
          RET
        ;***************************
        ;*****  显示子程序  ********
        ;***************************
        ;锁定状态显示。
     XSA:PUSH  ACC
         PUSH  PSW
         MOV  A,    TIMERS1
         MOV  DPTR, #TAB
         MOVC A,    @A+DPTR
         MOV  SBUF, A                    ;送已经输入密码的次数
         JNB  TI, $
         CLR  TI
         MOV  SBUF, #0FEH                ;送短线
         JNB  TI, $
         CLR  TI
         MOV  SBUF, #0FEH                ;送短线
         JNB  TI, $
         CLR  TI                           ;送F
         MOV  SBUF, #78H
         JNB  TI, $
         CLR  TI
         MOV  SBUF, #78H
         JNB  TI, $
         CLR  TI
         MOV  SBUF, #11H
         JNB  TI, $
         CLR  TI
         POP  PSW
         POP  ACC
         RET
         ;成功开锁状态显示
     XSB:PUSH ACC
         PUSH PSW
         MOV  A,    TIMERS1
         MOV  DPTR, #TAB
         MOVC A,    @A+DPTR
         MOV  SBUF, A
         JNB  TI, $
         CLR  TI
         MOV  SBUF, #0FEH
         JNB  TI, $
         CLR  TI
         MOV  SBUF, #0FEH
         JNB  TI, $
         CLR  TI
         MOV  SBUF, #10H
         JNB  TI, $
         CLR  TI
         MOV  SBUF, #10H
         JNB  TI, $
         CLR  TI
         MOV  SBUF, #10H
         JNB  TI, $
         CLR  TI
         POP  PSW
         POP  ACC
         RET
         ;密码输入及修改状态
     XSC:PUSH ACC
         PUSH PSW
         LCALL KILLXS
         SETB RS1   ;切换到第三组寄存器。防止操作数读取错误。
         MOV  R6,  TIMERS1
         MOV  A,   R6
         SUBB A,   #01H
         JNC  SC0
         JZ  SC1
     SC0:MOV  SBUF, #0FEH
         JNB  TI, $
         CLR  TI

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -