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

📄 密码锁.asm

📁 24C01 读写工具程序主要在下列情况下使用: 1、首次往 24C01 芯片里写密码。 2、你忘记了密码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
          CALL  LCD_SHOW
          RET
;-----------------------------------------------------
INFO1:  DB  "                ",0  ;LCD 第一行显示信息
INFO2:  DB  "PASSWORD ------ ",0  ;LCD 第二行显示信息
;-----------------------------------------------------
INIT_LCD:                 ;8位I/O控制 LCD 接口初始化
          MOV  A,#38H     ;双列显示,字形5*7点阵
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#38H     ;双列显示,字形5*7点阵
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#38H     ;双列显示,字形5*7点阵
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#0CH     ;开显示,关光标,
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#01H     ;清除 LCD 显示屏
          CALL  WCOM
          CALL  DELAY1
          RET
;----------------------------------------------------
LCD_SHOW:       ;在LCD的第一行或第二行显示信息字符

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

  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址
          CALL  WCOM        ;写入命令
          CALL  CLR_LINE    ;清除该行字符数据
          MOV  A,#0C0H      ;设置 LCD 的第二行地址
          CALL  WCOM
  FILL:   CLR  A            ;填入字符
          MOVC  A,@A+DPTR   ;由消息区取出字符
          CJNE  A,#0,LC1    ;判断是否为结束码
          RET
  LC1:    CALL  WDATA       ;写入数据
          INC  DPTR         ;指针加1
          JMP  FILL         ;继续填入字符
          RET
;---------------------------------------------------
CLR_LINE:                  ;清除该行 LCD 的字符
          MOV  R0,#24
   CL1:   MOV  A,#' '
          CALL  WDATA
          DJNZ  R0,CL1
          RET
;-----------------------------------------------------
; 写指令、数据使能子程序
;-----------------------------------------------------
ENABLE:                    ;写指令使能
          CLR RS           ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
          CLR RW
          SETB EN
          CALL  DELAY0
          CLR EN
          RET
ENABLE1:                  ;写数据使能
          SETB  RS        ;RS=H,RW=L,D0-D7=数据,E=高脉冲
          CLR   RW
          SETB  EN
          CALL  DELAY0
          CLR   EN
          RET

DELAY0:   MOV  R7,#250      ;延时500微秒
          DJNZ  R7,$
          RET
;----------------------------------------------------
;写入命令子程序
;----------------------------------------------------
WCOM:                     ;以8位控制方式将命令写至LCD
          MOV  P0,A       ;写入命令
          CALL  ENABLE
          RET
;----------------------------------------------------
;写入数据子程序
;----------------------------------------------------
WDATA:                    ;以8位控制方式将数据写至LCD
          MOV  P0,A       ;写入数据
          CALL  ENABLE1
          RET
;---------------------------------------------------
;在 LCD 第二行显示字符
;A=ASC DATA, B=LINE X POS
;---------------------------------------------------
LCDP2:                    ;在LCD的第二行显示字符
         PUSH  ACC        ;
         MOV  A,B         ;设置显示地址
         ADD  A,#0C0H     ;设置LCD的第二行地址
         CALL  WCOM       ;写入命令
         POP  ACC         ;由堆栈取出A
         CALL  WDATA      ;写入数据
         RET

;-------------------------------------------------------
;ASCII 转换并显示子程序
;-------------------------------------------------------
CONV:
          MOV   X,#9        ;设置显示起始位置
          MOV   A,R3
          ANL   A,#0F0H      ;取出高四位二进制数
          SWAP  A            ;高四位与低四位互换
          PUSH  ACC          ;压入堆栈
          CLR   C            ;C=0
          SUBB  A,#0AH       ;减10
          POP   ACC          ;弹出堆栈
          JC    ASCII0       ;该数小于10,转ASCII0
          ADD   A,#07H       ;大于10的数加上37H
ASCII0:   ADD   A,#30H       ;小于10的数加上30H
          MOV   B,X
          CALL  LCDP2

          MOV   A,R3
          ANL   A,#0FH        ;取出低四位二进制数
          PUSH  ACC
          CLR   C
          SUBB  A,#0AH        ;减10
          POP   ACC
          JC    ASCII1        ;该数小于10,转ASCII1
          ADD   A,#07H        ;大于10的数加上37H
ASCII1:   ADD   A,#30H        ;小于10的数加上30H
          INC   X
          MOV   B,X
          CALL  LCDP2
          RET
;-----------------------------------------------------
DELAY2:  MOV  R5,#15H
DELAY:                    ;延时R5×10MS
         MOV  R6,#50
  D1:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,D1
         DJNZ  R5,DELAY
         RET
;-----------------------------------------------------
DELAY1:                    ;延时5MS
         MOV  R6,#25
  D2:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,D2
         RET
;-----------------------------------------------------
KEYTABLE:
    DB  0EEH,0EDH,0EBH,0E7H,0DEH  ;0,1,2,3,4,  顺序码
    DB  0DDH,0DBH,0D7H,0BEH,0BDH  ;5,6,7,8,9,
    DB  0BBH,0B7H,07EH,07DH,07BH  ;A,B,C,D,E,
    DB  077H,0FFH                 ;F      0FF为结束码


    DB  0DBH,0EEH,0DEH,0BEH,07EH   ;0,1,2,3,4,  顺序码
    DB  0EDH,0DDH,0BDH,07DH,0EBH   ;5,6,7,8,9,
    DB  0BBH,07BH,0E7H,0D7H,0B7H   ;A,B,C,D,E,
    DB  077H,067H,066H,065H,0FFH   ;F,C+F,1+F,8+C
;-------------------------------------------------------
INIT_TIMER:                ;初始化定时器
         MOV  TMOD,#01H    ;设置定时器0 工作模式为模式1
         MOV  IE,  #82H    ;启用定时器0 中断产生
         MOV  TL0,#TLOW
         MOV  TH0,#THIGH
         RET
;-------------------------------------------------------
;定时器0计时中断子程序
;-------------------------------------------------------
T0_INT:
         PUSH  ACC
         MOV  TL0,#TLOW
         MOV  TH0,#THIGH
         INC  D_TIME
         MOV  A,D_TIME        ;5ms 计数值加1
         CJNE  A,#COUN0,T0_T
         MOV  D_TIME,#0
         INC  SEC             ;秒加1
         MOV  A,SEC
         CJNE  A,#03H,TO_INT0
         SETB  20H.3
TO_INT0: CJNE  A,#8,T0_T      ;是否到8秒?
         MOV  SEC,#0          ;秒单元清0
         SETB  20H.0
 T0_T:   POP  ACC
         RETI

;----------------------------------------------------
;读密码值子程序
;-----------------------------------------------------
PASS_READ:
          CALL  EEPR
          RET

         MOV  COUN1,#06H    ;6位密码数值
         MOV  R7,#00H
         MOV  R1,#PASS_NEW
P_READ:  MOV  A,R7
         MOV  DPTR,#R_TABLE
         MOVC  A,@A+DPTR
         MOV  @R1,A
         INC  R1
         INC  R7
         DJNZ  COUN1,P_READ
         RET
R_TABLE:
     DB   35H,36H,34H,34H,38H,38H
;-----------------------------------------------------
COMP_ERR:
         MOV  DPTR,#COMP_ERR1  ;
         MOV    A,#2          ;
         CALL   LCD_SHOW
         RET
COMP_ERR1:
         DB  " PASSWORD ERROR ",0
;------------------------------------------------------
COMP_OK:
         MOV  DPTR,#COMP_OK0  ;
         MOV    A,#2          ;
         CALL   LCD_SHOW
         RET
COMP_OK0:
         DB  " PASSWORD RIGHT ",0
;------------------------------------------------------
RESET_ERR:
         MOV  DPTR,#RESET_ERR0  ;
         MOV    A,#2          ;
         CALL   LCD_SHOW
         RET
RESET_ERR0:
         DB  "  RESET  ERROR  ",0
;------------------------------------------------------
RESET_OK:
         MOV  DPTR,#RESET_OK0 ;
         MOV    A,#2          ;
         CALL   LCD_SHOW
         RET
RESET_OK0:
         DB  "  RESET  RIGHT  ",0
;------------------------------------------------------
;------------------------------------------------------
INPUT_ERR:
         MOV  DPTR,#INPUT_ERR0  ;
         MOV    A,#2          ;
         CALL   LCD_SHOW
         RET
INPUT_ERR0:
         DB  "  INPUT  ERROR  ",0
;------------------------------------------------------
INPUT_OK:
         MOV  DPTR,#INPUT_OK0 ;
         MOV    A,#2          ;
         CALL   LCD_SHOW
         RET
INPUT_OK0:
         DB  "  INPUT  RIGHT  ",0

;=================================================
;写串行E2PROM子程序
;(R1)=欲写数据存放地址指针
;(R7)=连续读字节数
;24CO1一次可连续写8个字节,12个字节分两次写。
;=================================================
EEPW:    PUSH  ACC
         PUSH  PSW
         CLR  PSW.3
         SETB  PSW.4
         MOV  R1,#PASS_NEW
         MOV  R7,#06H      ;连续写8个字节
         LCALL START
         MOV A,#0A0H       ;送器件地址
         ACALL SUBS
         MOV A,#00H        ;送片内字节地址
         ACALL  SUBS
AGAIN1:
         MOV A,@R1
         ACALL SUBS       ;调发送单字节子程序
         INC R1
         DJNZ R7,AGAIN1    ;连续写8个字节
         LCALL  STOP      ;发停止信号
         POP  PSW
         POP  ACC
         RET
SUBS:
         MOV R0,#08H      ;发送单字节子程序
LOOP:    CLR  SCLK24
         RLC A
         MOV SDA,C
         NOP
         SETB SCLK24
         ACALL DELAY24
         DJNZ R0,LOOP     ;循环8次送8个bit
         CLR SCLK24
         ACALL DELAY24
         SETB SCLK24
REP:     MOV C,SDA
         JC REP          ;判应答到否,未到则等待
         CLR  SCLK24
         RET

DELAY24:
         NOP
         NOP
         RET
;=========================================================
;读串行E2PROM子程序EEPR
;(R1)=欲读数据存放地址指针
;(R7)=连续读字节数
;=========================================================
EEPR:    PUSH  ACC
         PUSH  PSW
         CLR  PSW.3
         SETB  PSW.4
         MOV  R7,#06H
         MOV  R1,#PASS_NEW
         LCALL  START    ;发开始信号
         MOV A,#0A0H     ;送器件地址
         ACALL SUBS      ;调发送单字节子程序
         MOV A,#00H      ;送片内字节地址
         ACALL SUBS
         LCALL  START    ;再发开始信号
         MOV A,#0A1H
         ACALL SUBS
MORE:    ACALL SUBR
         MOV @R1,A
         MOV  A,#00H
         INC  R1
         DJNZ R7,MORE
         LCALL  STOP      ;送停止信号
         POP  PSW
         POP  ACC
         RET

SUBR:    MOV  R0,#08H      ;接受单字节子程序
SUBR2:   SETB  SCLK24
         ACALL DELAY24
         MOV  C,SDA
         RLC  A
         CLR  SCLK24
         ACALL DELAY24
         DJNZ R0,SUBR2
         CJNE R7,#01H,ALOW
         SETB SDA          ;若是最后一个字节置SDA=1
         AJMP SETOK
ALOW:
         CLR  SDA          ;否则置SDA=0
SETOK:   ACALL DELAY24
         SETB  SCLK24
         ACALL DELAY24
         CLR  SCLK24
         ACALL  DELAY24
         SETB  SDA         ;应答毕,SDA置1
         RET
START:
         CLR  SDA
         ACALL DELAY24
         SETB  SDA
         SETB  SCLK24
         ACALL DELAY24
         CLR  SDA
         SETB SCLK24
         RET
STOP:
         CLR  SDA
         SETB  SCLK24
         ACALL DELAY24
         SETB SDA
         ACALL DELAY24
         RET
;------------------------------------------------------
BZ:                        ;蜂鸣器
         MOV  R6,#100
  B1:    CALL  DEX
         CPL  BEEP
         DJNZ  R6,B1
         MOV  R5,#20
         CALL  DELAY
         RET
 DEX:    MOV  R7,#180
 DE1:    NOP
         DJNZ  R7,DE1
         RET
;-----------------------------------------------------
         END

⌨️ 快捷键说明

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