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

📄 12864lcdlocker.asm

📁 该汉字密码锁
💻 ASM
📖 第 1 页 / 共 5 页
字号:



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;*****************************************
;       蜂鸣器鸣响程序
;*****************************************
       FMQ:
        MOV   58H,#200
        MOV   59H,#250
      FMQ1:
        CPL   BEEP
       DJNZ   59H,$
        MOV   59H,#125
        CPL   BEEP
       DJNZ   59H,$
        MOV   59H,#250
       DJNZ   58H,FMQ1
       SETB   BEEP
        RET

;*****************************************
;          按键识别子程序
;*****************************************
      SBIE:
        MOV   R0,#0F7H        ;识别按键子程序,数据送A保存,课本P146页。
        MOV   R1,#00H
       LK4:
        MOV   A,R0
        MOV   P1,A
        nop
        nop
        nop
        nop
         JB   ACC.0,L_JUMP    ;判断第四行的键值,0,CLR,MODI,ENTER
        MOV   A,P1
         JB   ACC.7,LLONE
        MOV   A,#11H          ;CLR  清除键
       AJMP   LKP1
     LLONE:
         JB   ACC.6,LLTWO
        MOV   A,#00H          ;0
       AJMP   LKP1
     LLTWO:
         JB   ACC.5,LLTHR
        MOV   A,#14H          ;ENTER 回车键
       AJMP   LKP1
     LLTHR:
         JB   ACC.4,KND
        MOV   A,#12H          ;
       AJMP   LKP1
    L_JUMP:
        NOP
        MOV   A,    P1
         JB   ACC.7,LONE      ;数字键1-9和特殊功能键
        MOV   A,#01H
       AJMP   LKP
      LONE:
         JB   ACC.6,LTWO
        MOV   A,#02H
       AJMP   LKP
      LTWO:
         JB   ACC.5,LTHR
        MOV   A,#03h
       AJMP   LKP
      LTHR:
         JB   ACC.4,NEXTT     ;判断下一列
        MOV   A,#10H
       LKP:
        ADD   A,R1
      LKP1:
       PUSH   ACC

      LCALL   FMQ
       LK3:
      LCALL   KS
        JNZ   LK3            ;判断按键是否松开,防止按键误触发


        POP   ACC
        RET
     NEXTT:
        INC   R1
        INC   R1
        INC   R1
        MOV   A,R0
        JNB   ACC.0,KND
         RR   A
        MOV   R0,A
       AJMP   LK4
       KND:
       LJMP   CH_KEY


;*****************************************
;         判断按键功能子程序
;*****************************************
     CH_KF:
        CLR   C
        MOV   A,BUFF          ;判断是数字按键还是功能按键,为1表示功能键
       CJNE   A,#10H,KY       ;如果按键值<10H,CY=1,如果按键值>=10H,CY=0
        KY:
         JC   SET_CH
       setb   FLAG1           ;假若是数字按键则标志位置0
       AJMP   CH_END
    SET_CH:
        clr   FLAG1           ;假若是功能按键则标志位置1
    CH_END:
        NOP
        RET



;*********************************
;*           分离程序            *
;*********************************
     DIVIDE:
         MOV   A,R0
         ANL   A,#0FH
         MOV   R1,A
         MOV   A,R0
        SWAP   A
         ANL   A,#0FH
         MOV   R2,A
         RET

;===================================================
;    电子密码锁开机之后工作界面
;===================================================
     MENU1:
        MOV   DPTR,#TAB1
        MOV   A,#1
      LCALL   LCD_SHOW
        RET
      TAB1:  DB "20  年  月  日",0




    MENU2:
        MOV   DPTR,#TAB2
        MOV   A,#2
      LCALL   LCD_SHOW
        RET
      TAB2:  DB "星期",0

      MENU3:
        MOV   DPTR,#TAB3
        MOV   A,#3
      LCALL   LCD_SHOW
        RET
      TAB3:  DB "当前温度:",0

     MENU4:
        MOV   DPTR,#TAB4
        MOV   A,#4
      LCALL   LCD_SHOW

        RET
      TAB4:  DB "密码",0


;===================================================
;    电子密码锁几种输入状态
;===================================================
    MENU_A1:
        MOV   DPTR,#ATAB1
        MOV   A,#4
      LCALL   LCD_SHOW
        RET
     ATAB1:  DB "密码正确,开锁。",0

   MENU_A2:
        MOV   DPTR,#ATAB2
        MOV   A,#4
      LCALL   LCD_SHOW
        RET
     ATAB2:  DB "第一次输入错误",0

   MENU_A3:
        MOV   DPTR,#ATAB3
        MOV   A,#4
      LCALL   LCD_SHOW
        RET
     ATAB3:  DB "第二次输入错误",0


   MENU_A4:
        MOV   DPTR,#ATAB4
        MOV   A,#4
      LCALL   LCD_SHOW
        RET
     ATAB4:  DB "三次输入错误报警",0

;===================================================
;    电子密码锁修改密码几种状态
;===================================================
    MENU_B1:
        MOV   DPTR,#BTAB1
        MOV   A,#1
      LCALL   LCD_SHOW
        RET
     BTAB1:   DB "  [ 修改密码 ]",0

   MENU_B2:
        MOV   DPTR,#BTAB2
        MOV   A,#2
      LCALL   LCD_SHOW
        RET
     BTAB2:   DB "请输入原始密码:",0

   MENU_B3:
        MOV   DPTR,#BTAB3
        MOV   A,#2
      LCALL   LCD_SHOW
        RET
     BTAB3:   DB "请输入新的密码:",0


   MENU_B4:
        MOV   DPTR,#BTAB4
        MOV   A,#2
      LCALL   LCD_SHOW
        RET
     BTAB4:   DB "请确认新的密码:",0

   MENU_B5:
        MOV   DPTR,#BTAB5
        MOV   A,#2
      LCALL   LCD_SHOW
        RET
     BTAB5:   DB "密码修改成功",0

   MENU_B6:
        MOV   DPTR,#BTAB6
        MOV   A,#3
      LCALL   LCD_SHOW
        RET
     BTAB6:   DB "新密码是:",0



    MENU_B8:
        MOV   DPTR,#BTAB8
        MOV   A,#2
      LCALL   LCD_SHOW
        RET
     BTAB8:   DB "    两次输入密码",0

   MENU_B9:
        MOV   DPTR,#BTAB9
        MOV   A,#3
      LCALL   LCD_SHOW
        RET
     BTAB9:   DB "不正确, 很抱歉",0

  MENU_B10:
        MOV   DPTR,#BTAB10
        MOV   A,#4
      LCALL   LCD_SHOW
        RET
    BTAB10:   DB "密码修改失败....",0


;===================================================
;    遥控器解码几种状态
;===================================================
   MENU_C1:
        MOV   DPTR,#CTAB1
        MOV   A,#1
      LCALL   LCD_SHOW
        RET
     CTAB1:   DB "  [ 遥控器解码 ]",0

   MENU_C2:
        MOV   DPTR,#CTAB2
        MOV   A,#2
      LCALL   LCD_SHOW
        RET
     CTAB2:   DB "KBLKING@163.COM",0

   MENU_C3:
        MOV   DPTR,#CTAB3
        MOV   A,#3
      LCALL   LCD_SHOW
        RET
     CTAB3:   DB "地址码: - - H",0

   MENU_C4:
        MOV   DPTR,#CTAB4
        MOV   A,#4
      LCALL   LCD_SHOW
        RET
     CTAB4:   DB "数据码: - - H",0

   MENU_C5:
        MOV   DPTR,#CTAB5
        MOV   A,#3
      LCALL   LCD_SHOW
        RET
     CTAB5:   DB "  地址码和数据码",0

   MENU_C6:
        MOV   DPTR,#CTAB6
        MOV   A,#4
      LCALL   LCD_SHOW
        RET
     CTAB6:   DB "保存成功!",0

   MENU_C7:
        MOV   DPTR,#CTAB7
        MOV   A,#4
      LCALL   LCD_SHOW
        RET
     CTAB7:   DB "保存失败!",0


;===================================================
;       后门查看界面
;===================================================
   MENU_E1:
        MOV   DPTR,#ETAB1
        MOV   A,#1
      LCALL   LCD_SHOW
        RET
     ETAB1:   DB "  [ 后门查看 ]",0

   MENU_E2:
        MOV   DPTR,#ETAB2
        MOV   A,#2
      LCALL   LCD_SHOW
        RET
     ETAB2:   DB "KBLKING@163.COM",0

   MENU_E3:
        MOV   DPTR,#ETAB3
        MOV   A,#3
      LCALL   LCD_SHOW
        RET
     ETAB3:   DB "密码是:",0

   MENU_E4:
        MOV   DPTR,#ETAB4
        MOV   A,#3
      LCALL   LCD_SHOW
        RET
      ETAB4:  DB "13",0




                  ; 9月21
                ;星期一
                ;北京时间22:12:12

;===================================================
;在 LCM 各行显示信息字符
;===================================================
  WEEK_SHOW:


        MOV   A,#92H       ;设置 LCD 的第一行地址
       CALL   SEND_I        ;写入命令
        JMP   FILL
LCD_SHOW:

       CJNE   A,#1,LINE2  ;判断是否为第一行
     LINE1:
        MOV   A,#80H       ;设置 LCD 的第一行地址
       CALL   SEND_I        ;写入命令
       CALL   CLR_LINE    ;清除该行字符数据
        MOV   A,#80H       ;设置 LCD 的第一行地址
       CALL   SEND_I        ;写入命令
        JMP   FILL

     LINE2:
       CJNE   A,#2,LINE3  ;判断是否为第三行
        MOV   A,#090H      ;设置 LCD 的第三行地址
       CALL   SEND_I        ;写入命令
       CALL   CLR_LINE    ;清除该行字符数据
        MOV   A,#090H      ;设置 LCD 的第三行地址
       CALL   SEND_I
        JMP   FILL

     LINE3:
       CJNE   A,#3,LINE4  ;判断是否为第三行
        MOV   A,#088H      ;设置 LCD 的第三行地址
       CALL   SEND_I        ;写入命令
       CALL   CLR_LINE    ;清除该行字符数据
        MOV   A,#088H      ;设置 LCD 的第三行地址
       CALL   SEND_I
        JMP   FILL

     LINE4:
       CJNE   A,#4,LINE5  ;判断是否为第三行
        MOV   A,#098H      ;设置 LCD 的第三行地址
       CALL   SEND_I        ;写入命令
       CALL   CLR_LINE    ;清除该行字符数据
        MOV   A,#098H      ;设置 LCD 的第三行地址
       CALL   SEND_I

      FILL:
        CLR   A            ;填入字符
       MOVC   A,@A+DPTR   ;由消息区取出字符
       CJNE   A,#0,LC1    ;判断是否为结束码
     LINE5:
        RET
       LC1:
       CALL   SEND_D       ;写入数据
        INC   DPTR         ;指针加1
        JMP   FILL         ;继续填入字符
        RET
;=================================================
;清除该行 LCM 的字符
;=================================================
CLR_LINE:
          MOV   R0,#16      ;
   CL1:   MOV   A,#' '
          CALL  SEND_D
          DJNZ  R0,CL1
          RET





;==================================================
;清屏
;==================================================
   CLEAR_P:
        MOV   A,#01H ;清屏
      LCALL   SEND_I

        RET

;===============================================
;写数据子程序
;RS=1,RW=0,E=高脉冲,D0-D7=数据
;===============================================
    SEND_D:
      LCALL   CHK_BUSY ;写数据子程序
       SETB   RS
        CLR   RW
        MOV   P2,A
       SETB   E
        NOP
        NOP
        CLR   E
        RET
;===============================================
;写指令子程序
;RS=0,RW=0,E=高脉冲,D0-D7=指令码
;===============================================
    SEND_I:
      LCALL   CHK_BUSY
        CLR   RS
        CLR   RW
        MOV   P2,A
       SETB   E
        NOP
        NOP
        CLR   E
        RET

;================================================
;;测忙碌子程序
;RS=0,RW=1,E=H,D0-D7=状态字
;================================================
  CHK_BUSY:
        MOV   P2,#0FFH ;测忙碌子程序
        CLR   RS
       SETB   RW
       SETB   E
         JB   P2.7,$
        CLR   E
        RET





;****************************************************







;---------------------------------------------
;           DS18B20温度转换程序
;---------------------------------------------
   get_temper:
           CLR    EA
         lcall    rest           ;复位DS18B20
            jb    F1,dss2        ;判断DS18B20是否存在
           ret
         dss2:
           mov    a,#0cch        ;跳过ROM匹配
         lcall    DSWR
           mov    a,#44h         ;向DS18B20发出温度转换命令
         lcall    DSWR
         lcall    rest           ;读温度前先复位
           mov    a,#0cch        ;跳过ROM匹配
         lcall    DSWR
           mov    a,#0beh        ;向DS18B20发出度温度命令
         lcall    DSWR
         lcall    DSRE           ;读取温度数据
          SETB    EA
           ret

            ;DS18B20 RESET
         rest:
          setb    date_line
           nop
           clr    date_line
           mov    r0,#6bh         ;主机发出延时复位低脉冲
           mov    r1,#04h
         tsr1:
          djnz    r0,$
           mov    r0,#6bh
          djnz    r1,tsr1
          setb    date_line        ;然后拉高数据线
           nop
           nop
           nop
           mov    r0,#32h
         tsr2:
           jnb    date_line,tsr3   ;等待DS18B20回应
          djnz    r0,tsr2
           jmp    tsr4             ; 延时
         tsr3:
          setb    f1           ; 置标志位,表示DS1820存在
           jmp    tsr5
         tsr4:
           clr    f1          ; 清标志位,表示DS1820不存在
           jmp    tsr7
         tsr5:
           mov    r0,#06bh
         tsr6:
          djnz    r0,$            ; 时序要求延时一段时间
         tsr7:
          setb    date_line
           ret

             ;WRITE DS18B20                             2007-05-28>>MON
         DSWR:
           mov    r2,#8            ;一共8位数据
           CLR    C
          wr1:
           clr    date_line        ;开始写入DS18B20总线要处于复位(低)状态
           mov    r3,#07
          djnz    r3,$            ;总线复位保持16微妙以上
           rrc    a 

⌨️ 快捷键说明

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