📄 带02的密码验证修改.asm
字号:
LCALL WRI
LCALL DELAY10
CLR 18H ;指示光标闪烁
LCALL CODEDIP
LCALL CODEBIT
LCALL DELAY10
RET
;***
CODEDIP:
LCALL DELAY10
MOV COM,#01H ;清除屏幕显示
LCALL WRI
LCALL DELAY10
MOV COM,#91H ;从第2行开始显示
LCALL WRI
MOV DATT,#0C7H ;显示"请"
LCALL WRD
MOV DATT,#0EBH
LCALL WRD
MOV COM,#92H
LCALL WRI
MOV DATT,#0CAH ;显示"输"
LCALL WRD
MOV DATT,#0E4H
LCALL WRD
MOV COM,#93H
LCALL WRI
MOV DATT,#0C8H ;显示"入"
LCALL WRD
MOV DATT,#0EBH
LCALL WRD
MOV COM,#94H
LCALL WRI
MOV DATT,#0C3H ;显示"密"
LCALL WRD
MOV DATT,#0DCH
LCALL WRD
MOV COM,#95H
LCALL WRI
MOV DATT,#0C2H ;显示"码"
LCALL WRD
MOV DATT,#0EBH
LCALL WRD
; MOV 70H,#2AH
; MOV 71H,#2AH
; MOV 72H,#2AH
; MOV 73H,#2AH
; MOV 74H,#2AH
; MOV 75H,#2AH
; MOV 70H,#2AH
LCALL CODEIN ;将密码部分读出,但不显示,显示"******"
RET
;************************************************************************************
CODEIN:
MOV COM,#89H ;从第3行开始显示,显示6个 ******
LCALL WRI
MOV DATT,#20H ;显示"*"
LCALL WRD
; MOV DATT,70H ;70H---75H,可以显示输入的数字,或者显示"*",有光标移动指示
MOV DATT,#2AH
LCALL WRD
MOV COM,#8AH
LCALL WRI
MOV DATT,#20H ;显示"*"
LCALL WRD
; MOV DATT,71H
MOV DATT,#2AH
LCALL WRD
MOV COM,#8BH
LCALL WRI
MOV DATT,#20H ;显示"*"
LCALL WRD
; MOV DATT,72H
MOV DATT,#2AH
LCALL WRD
MOV COM,#8CH
LCALL WRI
MOV DATT,#20H ;显示"*"
LCALL WRD
; MOV DATT,73H
MOV DATT,#2AH
LCALL WRD
MOV COM,#8DH
LCALL WRI
MOV DATT,#20H ;显示"*"
LCALL WRD
; MOV DATT,74H
MOV DATT,#2AH
LCALL WRD
MOV COM,#8EH
LCALL WRI
MOV DATT,#20H ;显示"*"
LCALL WRD
; MOV DATT,75H
MOV DATT,#2AH
LCALL WRD
RET
;*************************************************************************
;密码输入光标闪烁子程序,输入一个数字,光标移动一位,并在该位闪烁
;处理光标在此位置闪烁子程序,在调整数据时应该加入闪烁,才可知道调整项目
;增加的项目由此闪烁指示
CODEBIT: JB 18H,NBIT2
MOV COM,#0DH ;由89H地址开始显示
LCALL WRI ;实质上是让光标在此位置闪烁
MOV COM,#89H
LCALL WRI
MOV COM,#0DH
LCALL WRI
LJMP EXBIT7
NBIT2: JB 19H,NBIT3
MOV COM,#0DH ;由8AH地址开始显示
LCALL WRI ;实质上是让光标在此位置闪烁
MOV COM,#8AH
LCALL WRI
MOV COM,#0DH
LCALL WRI
LJMP EXBIT7
NBIT3: JB 1AH,NBIT4
MOV COM,#0DH ;由8BH地址开始显示
LCALL WRI ;实质上是让光标在此位置闪烁
MOV COM,#8BH
LCALL WRI
MOV COM,#0DH
LCALL WRI
LJMP EXBIT7
NBIT4: JB 1BH,NBIT5
MOV COM,#0DH ;由8CH地址开始显示
LCALL WRI ;实质上是让光标在此位置闪烁
MOV COM,#8CH
LCALL WRI
MOV COM,#0DH
LCALL WRI
LJMP EXBIT7
NBIT5: JB 1CH,NBIT6
MOV COM,#0DH ;由8DH地址开始显示
LCALL WRI ;实质上是让光标在此位置闪烁
MOV COM,#8DH
LCALL WRI
MOV COM,#0DH
LCALL WRI
LJMP EXBIT7
NBIT6: JB 1DH,NBIT7
MOV COM,#0DH ;由8EH地址开始显示
LCALL WRI ;实质上是让光标在此位置闪烁
MOV COM,#8EH
LCALL WRI
MOV COM,#0DH
LCALL WRI
LJMP EXBIT7
NBIT7: CLR 30H ;指示密码数据输入完毕,等待"确认键"
EXBIT7: RET
;*************************************
WRIDAT:
MOV R6,#00H ;写入字节地址的设置
LCALL XXX ;写入第一页(8个字节的数据,24C01/02一次最多只能写 8 个字节!!!)
LCALL DELAY ;调用大概 1mS 延时,此延时程序非常必要!!!
LCALL DELAY
LCALL DELAY
LCALL DELAY
RET
;--------------------------------写入数据//
XXX:
LCALL START_IC ;发开始信号
MOV A,#0A0H ;写入器件地址设置为 A0H
LCALL WR_BYTE
MOV A,R6 ;写入字节地址
LCALL WR_BYTE
LCALL WRITE_BYTE ;写入第一页的数据
LCALL STOP_IC
RET
;*******************
WRITE_BYTE: ;字节写入模式写数据(WRITE_BYTE)
MOV A,50H
LCALL WR_BYTE ;写入数据
MOV A,51H
LCALL WR_BYTE ;写入数据
MOV A,52H
LCALL WR_BYTE ;写入数据
MOV A,53H
LCALL WR_BYTE ;写入数据
MOV A,54H
LCALL WR_BYTE ;写入数据
MOV A,55H
LCALL WR_BYTE ;写入数据
RET
;----------------------------------------------------------------------
READAT:
MOV R1,#00H ;THE FIRST BYTE'S ADDRESS
LCALL DDD
LCALL DELAY
LCALL DELAY
MOV 56H,80H
INC R1 ;THE SECOND BYTE'S ADDRESS
LCALL DDD
LCALL DELAY
LCALL DELAY
MOV 57H,80H
INC R1
LCALL DDD
LCALL DELAY
LCALL DELAY
MOV 58H,80H
INC R1
LCALL DDD
LCALL DELAY
LCALL DELAY
MOV 59H,80H
INC R1
LCALL DDD
LCALL DELAY
LCALL DELAY
MOV 5AH,80H
INC R1
LCALL DDD
LCALL DELAY
LCALL DELAY
MOV 5BH,80H
RET
;--------------------------------读取一个数据//2005.06.27// OK!!!
DDD:
MOV A,#00H
PUSH ACC ;保存A中的数据
LCALL START_IC ;发开始信号
MOV A,#0A0H ;写入器件地址,表示选中该器件
LCALL WR_BYTE
MOV A,R1 ;写入字节地址---------------地址设置!!!!!!!
LCALL WR_BYTE
POP ACC ;恢复A中数据
LCALL START_IC
MOV A,#0A1H ;*****读器件时地址必须设置为 A1H !!!!!
LCALL WR_BYTE
LCALL RD_BYTE ;读出第一个字节
MOV 80H,A
NOP
NOP
LCALL STOP_IC
RET
;*******************************************************************************
;*********************************以下为各功能子程序****************************
;*******************************************************************************
;-------------------------------------------------------------------
;-----------------------------开始条件------------------------------
START_IC:
CLR SCL ; SCL低电平时才允许SDA更改
NOP ;加入空指令延时以确保信号可靠
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
NOP
RET
;----------------------------------------------------------------------------------
;-------------------写一字节数据到EEPROM,程序中已包含应答子程序!!!-----------------
;----------------------------------------------------------------------------------
WR_BYTE:
MOV R5,#08 ;一字节8位数据
CLR SCL
NOP
NOP
WR_BYTE1:RLC A ;带进位位左移,A.8->C
MOV SDA,C ; SCL低电平时改变SDA上的数据
NOP
SETB SCL ;拉高SCL把数据发送出去
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R5,WR_BYTE1; 依次发送A中的8位数据
SETB SDA
SETB SCL
JB SDA,$ ; 等待IC卡确认信号
CLR SCL
NOP
nop
RET
;---------------------------------------------------------------------------
;--------------------------从EEPROM读一字节(RD_BYTE)//2005.06.27 ---------
;---------------------------------------------------------------------------
RD_BYTE:
MOV R5,#08
SETB SDA;设备SDA为读状态
CLR A;清空A寄存器
RD_BYTE1:
MOV C,SDA;读一位数据到进位位
RLC A;左移数据到A.0
SETB SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R5,RD_BYTE1;依次读出8位数据到A中
RET;无应答信号
;利用该程序可将读出的数据存放在A中。需要注意的是:读数据的器件不是通过确认状态来应答的,
;而是随后产生一个停止状态。
;-----------------------------------------------------------------------
;------------------------------------停止条件
STOP_IC:
CLR SCL
NOP
NOP
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SCL
NOP
NOP
CLR SDA
RET
;-------------------------------------------------------------------------
DELAY: MOV R4,#2;延时程序,延时1000微秒= 1mS FOSC=6MHz
DD3:MOV R5,#124
DJNZ R5,$
DJNZ R4,DD3
RET
DELAY1: MOV R4,#10H ;一秒延迟子程序
DELAY11:MOV R5,#255
DELAY41:MOV R6,#0FFH
DJNZ R6,$
DJNZ R5,DELAY41
DJNZ R4,DELAY11
RET
;*******************************************
;*******************************************
DATAMA: NOP ;数字键存储在5DH,每一次按键均从5DH中读出
MOV A,5DH ;5DH存储BCD,临时存储第一次按键键值
ORL A,#30H
MOV 5EH, A ;5EH--ASC,只是单一数字,为送显示做准备工作
NOP
JNB 00H,DAMA1 ;密码输入模式
JNB 01H,DAMA4 ;密码修改模式
JNB 02H,DAMA3 ;时间修改模式
LJMP DAMA2
DAMA1 : LCALL KEYCODE ;密码输入模式
LJMP DAMA2
DAMA3 : LCALL TIMECH ;时间修改模式
LJMP DAMA2
DAMA4 : LCALL keyx ;密码修改模式
DAMA2 :
RET ;由模式键切换数据状态模式
;**********************************************************
; 修改密码部分
;*****************************************************
keyx:
JB 78H,CHACODE2
MOV 71H,5EH
MOV 56H,5DH
SETB 78H
CLR 79H
LCALL CODEINX ;显示新输入的密码
LCALL CODEBITX;键入的数字键已经处理完毕
LJMP EXKYCDX
CHACODE2: JB 79H,CHACODE3
MOV 72H,5EH
MOV 57H,5DH
SETB 79H
CLR 7AH
LCALL CODEINX ;显示新输入的密码
LCALL CODEBITX;键入的数字键已经处理完毕
LJMP EXKYCDX
CHACODE3: JB 7AH,CHACODE4
MOV 73H,5EH
MOV 58H,5DH
SETB 7AH
CLR 7BH
LCALL CODEINX ;显示新输入的密码
LCALL CODEBITX;键入的数字键已经处理完毕
LJMP EXKYCDX
CHACODE4: JB 7BH,CHACODE5
MOV 74H,5EH
MOV 59H,5DH
SETB 7BH
CLR 7CH
LCALL CODEINX ;显示新输入的密码
LCALL CODEBITX;键入的数字键已经处理完毕
LJMP EXKYCDX
CHACODE5: JB 7CH,CHACODE6
MOV 75H,5EH
MOV 5AH,5DH
SETB 7CH
CLR 7DH
LCALL CODEINX ;显示新输入的密码
LCALL CODEBITX;键入的数字键已经处理完毕
LJMP EXKYCDX
CHACODE6: JB 7DH,CHACODE7
MOV 76H,5EH
MOV 5BH,5DH
SETB 7DH
CLR 31H
LCALL CODEINX ;显示新输入的密码
LCALL CODEBITX;键入的数字键已经处理完毕
LJMP EXKYCDX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -