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

📄 lock.asm

📁 实现集密码显示,语音报警和加密解密等功能于一身的防试探型密码锁!
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;密码锁源程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;端口定义
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYPAD EQU P0           ;键盘扫描用P0口
LCDP   EQU P1           ;LCD用P1口
LOCK   EQU P2.0         ;开锁用p2.0
A0     EQU P2.3         ;lcd的A0
E1     EQU P2.1         ;lcd的E1
E2     EQU P2.2         ;lcd的E2
BUZZER EQU P2.4         ;蜂鸣器 高为响,低为不响
BELL   EQU P2.4         ;门铃 高为响,低为不响
SCK    EQU P3.0         ;24lc02 的SCK
SDK    EQU P3.1         ;24lc02 的SDK
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;以下六字节存放外部输入的六位密码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PS1    EQU    4FH
PS2    EQU    4EH
PS3    EQU    4DH
PS4    EQU    4CH
PS5    EQU    4BH
PS6    EQU    4AH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;以下六字节存放管理员的六位密码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SUPPER1     EQU     49H
SUPPER2     EQU     48H
SUPPER3     EQU     47H
SUPPER4     EQU     46H
SUPPER5     EQU     45H
SUPPER6     EQU     44H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;以下六字节存放用户的六位密码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
USER1        EQU     43H
USER2        EQU     42H
USER3        EQU     41H
USER4        EQU     40H
USER5        EQU     3FH
USER6        EQU     3EH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;标志位定义
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MODE_FLAG     EQU     3DH        ; 0: 用户模式  1:管理模式
ROW           EQU     3CH        ;按键行号
COL           EQU     3BH        ;按键列号
VAL           EQU     3AH        ;键值
IN_TIME       EQU     39H        ;连续输入错误的次数
PS_ALL        EQU     38H        ;本次输入密码的位数
COMMAND       EQU     37H        ;显示器指令
DATA1         EQU     36H        ;显示器写入数据
LEFT_ALL      EQU     35H        ;左边*个数
RIGHT_ALL     EQU     34H        ;右边*个数
MODIFY_F      EQU     33H        ;是否在修改密码  0:没改 1:改用户密码  2:改管理密码
PS_OK         EQU     32H        ;修改密码前管理密码正确标志  0:错,1:对
LCD_OPEN      EQU     31H        ;显示器开关标志     0:开    1:关
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;常数定义
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MS50      EQU   15536            ;50ms定义
TMH       EQU   (MS50)/256
TML       EQU   (MS50) mod 256
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
           ORG     00H
           SJMP    MAIN
           ORG     0BH
           LJMP    INT_T0   ;定时器0中断
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;待加入串型通信

           ORG     0030H
MAIN:
           MOV     SP,#50H
           LCALL   INIT_FLAG  ;标志初始化
           LCALL   READ_PS    ;密码初始化
           LCALL   INIT_LCD   ;显示器初始化
START:
           CLR     BUZZER       ;蜂鸣器不响
           CLR     LOCK         ;关锁
           CLR     BELL         ;门铃不响
           LCALL   INIT_PS    ;输入密码至FF
           LCALL   DISP_CLR    ;显示器清屏
           LCALL   DISP_MODE  ;显示模式

           LCALL BEGIN_TIME    ;开始计时
           ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;键盘
START1:
            CLR  BELL  ;关门铃
            CLR  BUZZER
 ROWSCAN:
           MOV    KEYPAD,#0F0H     ;扫描行码
    ROW00:
           JNB    KEYPAD.4,ROW0
    ROW01:
	   JNB    KEYPAD.5,ROW1
    ROW02:
           JNB    KEYPAD.6,ROW2
    ROW03:
	   JNB    KEYPAD.7,ROW3
	   JMP    ROWSCAN
    ROW0:
	   LCALL DELAY1
	   JB    KEYPAD.4,ROW00
	   MOV   ROW,#00H
	   JMP   COLSCAN
    ROW1:
	   LCALL DELAY1
	   JB    KEYPAD.5,ROW01
	   MOV   ROW,#01H
	   JMP   COLSCAN
    ROW2:
	   LCALL DELAY1
	   JB    KEYPAD.6,ROW02
	   MOV   ROW,#02H
	   JMP   COLSCAN
    ROW3:
	   LCALL DELAY1
	   JB    KEYPAD.7,ROW03
	   MOV   ROW,#03H
    COLSCAN:
           MOV   KEYPAD,#0FH      ;扫描列码
    COL00:
	   JNB   KEYPAD.3,COL0
    COL01:
	   JNB   KEYPAD.2,COL1
    COL02:
	   JNB   KEYPAD.1,COL2
    COL03:
	   JNB   KEYPAD.0,COL3
	   JMP   ROWSCAN
    COL0:
           LCALL DELAY1
           JB    KEYPAD.3,COL00
	   MOV   COL,#00H
	   JMP   KEYVAL
    COL1:
           LCALL DELAY1
           JB    KEYPAD.2,COL01
	   MOV   COL,#01H
	   JMP   KEYVAL
    COL2:
	   LCALL DELAY1
	   JB    KEYPAD.1,COL02
	   MOV   COL,#02H
	   JMP   KEYVAL
    COL3:
	   LCALL DELAY1
	   JB    KEYPAD.0,COL03
	   MOV   COL,#03H
  KEYVAL:   ;;;;;;;;;;;;;;计算键值
           MOV   A,ROW
           RL    A
           RL    A
           ADD   A,COL
           MOV   VAL,A
           LCALL ALARM_KEY   ;按键声
           MOV   A,LCD_OPEN
           CJNE  A,#01H,LCDISOPEN
           MOV   COMMAND,#0AFH   ;开显示器
           LCALL  WINSTR1
           MOV   COMMAND,#0AFH
           LCALL  WINSTR2
           MOV   LCD_OPEN,#00H
           LJMP  W00
  LCDISOPEN:
           LCALL BEGIN_TIME    ;开始计时
           ;是否锁定
           MOV   A,IN_TIME
           CJNE  A,#03H,N_L
           MOV   A,VAL
           CJNE  A,#0CH,N_LL    ;按下不是解锁键

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   ;对不同按键进行处理
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  N_L:
           MOV   A,PS_OK
           JNB   ACC.0,CH_CODE2
           MOV   A,MODIFY_F
           CJNE  A,#01,CH_CODE1
           JMP   CH_CODE3
  CH_CODE1:
           CJNE  A,#02,CH_CODE2
  CH_CODE3:
           LCALL DISP_CLR
           LCALL DISP_CH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按下CLR 清除键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CH_CODE2:
           MOV   A,VAL
           CJNE  A,#0AH,NO_CLR         ;不是CLR键则跳至NO_CLR
           MOV   R3,PS_ALL
           CJNE  R3,#00H,CAN_CLR   ;输入密码位数不为0至CAN_CLR
           LCALL ALARM_KEY    ;输入有误,报警
           MOV   R3,#0AH
   DEL_A1:
           LCALL DELAY1
           DJNZ  R3,DEL_A1
           LCALL ALARM_KEY
           MOV   MODE_FLAG,#00H   ;返回用户模式
           MOV   PS_OK,#00H
           MOV   PS_ALL,#00H
           MOV   MODIFY_F,#00H
           LCALL DISP_CLR
           LCALL DISP_MODE
           LJMP  W00
  CAN_CLR:    ;删除一位密码   PS6
             MOV   PS6,PS5
             MOV   PS5,PS4
             MOV   PS4,PS3
             MOV   PS3,PS2
             MOV   PS2,PS1
             MOV   PS1,#0FFH  ;PS1值为0ffh
             DEC   PS_ALL   ;密码位数减一
             LCALL DISP_START   ;显示"*"
             ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
             ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;等键抬起
W00:
             MOV   A,KEYPAD
             CJNE  A,#0F0H,W01
             LJMP  START1
    W01:
             MOV   A,KEYPAD
             CJNE  A,#0FH,W02
             LJMP  START1
    W02:     SJMP  W00
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    N_LL:
           LCALL DISP_CLR
           LCALL DISP_LOCK
           MOV   A,MODE_FLAG
           CJNE  A,#01H,N_LLL     ;不是管理模式
           LJMP  N_L
    N_LLL:
           MOV  A,VAL        ;门铃可以用
           CJNE A,#0FH,N_LLLL
           LJMP N_L
    N_LLLL:
           LJMP W00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按下ENT 确认键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NO_CLR:
              MOV  A,VAL
              CJNE A,#0BH,NO_ENT       ;不是ENT键则转至NO_ENT

              MOV  R3,PS_ALL
              CJNE R3,#06H,ERR_IN

              MOV A,PS_OK
              JB  ACC.0,CHA_PS1    ;修改密码

              MOV A, MODE_FLAG
              JB  ACC.0,M_PS1    ;跳至管理密码比较
              ;用户密码比较
              MOV  A,PS1
              CJNE A,USER1,PS_ERR
              MOV  A,PS2
              CJNE A,USER2,PS_ERR
              MOV  A,PS3
              CJNE A,USER3,PS_ERR
              MOV  A,PS4
              CJNE A,USER4,PS_ERR
              MOV  A,PS5
              CJNE A,USER5,PS_ERR
              MOV  A,PS6
              CJNE A,USER6,PS_ERR
   OPEN:
              SETB  LOCK      ; 开门
              MOV   IN_TIME,#00H   ;连续错误清零
              MOV   PS_ALL,#00H;密码位数清零
              LCALL DISP_CLR
              LCALL DISP_OPEN     ;显示"密码正确"
              MOV   R3,#40H
   PS_R:
            LCALL DELAY1
            DJNZ R3,PS_R

            LJMP START
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   CHA_PS1:    LJMP CHA_PS        ;跳转搭桥

   M_PS1:      LJMP M_PS          ;跳转搭桥

   NO_ENT:     LJMP NO_ENT2       ;跳转搭桥
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   ERR_IN:
            LCALL ALARM_KEY    ;输入有误,报警
            MOV   R3,#0AH
   ENT_A1:
            LCALL DELAY1
            DJNZ  R3,ENT_A1
            LCALL ALARM_KEY
            LCALL DISP_START
            LJMP   W00
   PS_ERR:
            MOV   A,MODE_FLAG
            JB    ACC.0,M_O
            INC   IN_TIME
            LCALL ALARM_KEY    ;用户模式报警2声
            MOV   R3,#0AH
   PS_ALARM:
            LCALL DELAY1
            DJNZ  R3,PS_ALARM
            LCALL ALARM_KEY
   M_O:
            MOV   A,MODE_FLAG
            JNB   ACC.0,U_O
            SETB  BUZZER
            MOV   R3,#0AH
   PS_ALARM1:
            LCALL DELAY1
            DJNZ  R3,PS_ALARM1
   U_O:
            MOV   PS_ALL,#00H   ;密码位数置0
            LCALL DISP_CLR
            LCALL DISP_PSERR      ;显示密码错误
            MOV   R3,#40H
   DEL_PS:
            LCALL DELAY1
            DJNZ  R3,DEL_PS
            LCALL DISP_CLR
            LCALL DISP_MODE
            MOV   A,MODE_FLAG
            JB    ACC.0,M_OO
            MOV   A,IN_TIME
            CJNE  A,#03H,M_OO
            LCALL DISP_CLR
            LCALL DISP_LOCK
   M_OO:
            LJMP W00

     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   NO_ENT2:    LJMP NO_ENT1        ;跳转搭桥
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   M_PS:      ;管理员密码比较
              MOV  A,PS1
              CJNE A,SUPPER1,PS_ERR
              MOV  A,PS2
              CJNE A,SUPPER2,PS_ERR
              MOV  A,PS3
              CJNE A,SUPPER3,PS_ERR
              MOV  A,PS4
              CJNE A,SUPPER4,PS_ERR
              MOV  A,PS5
              CJNE A,SUPPER5,PS_ERR
              MOV  A,PS6
              CJNE A,SUPPER6,PS_ERR
              ;密码正确
              CLR  BUZZER
              MOV  A,IN_TIME
              CJNE A,#03H,C_PS
              MOV  IN_TIME,#00H
              MOV  PS_ALL,#00H
              MOV  MODE_FLAG,#00H
              LCALL DISP_CLR
              LCALL DISP_UNLOCK      ;显示解锁成功
              MOV R3,#40H
    DEL_UL:
              LCALL DELAY1
              DJNZ  R3,DEL_UL
              LCALL DISP_CLR
              LCALL DISP_MODE
              LJMP  W00
    C_PS:          ;不解锁
              MOV   IN_TIME,#00H   ;连续错误清零
              MOV   PS_ALL,#00H;密码位数清零
              LCALL DISP_CLR
              LCALL DISP_OPEN     ;显示"密码正确"
              MOV   R3,#40H
    CPS_R:
             LCALL DELAY1
             DJNZ  R3,CPS_R
             LCALL DISP_CLR
             LCALL DISP_CH  ;显示"修改密码"

⌨️ 快捷键说明

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