📄 密码开关.asm
字号:
KEY_NUMBER EQU 4BH
KEY EQU 4CH
KEY_CHECK_WORD EQU 4DH
ORG 0000H
AJMP MAIN;转入主程序
ORG 0003H ;外部中断P3.2脚INT0入口地址
AJMP INT ;转入外部中断服务子程序(红外遥控解码程序)
;以下为主程序进行CPU中断方式设置
ORG 030H
MAIN:
MOV 48H,#00H
MOV 49H,#00H
MOV 4AH,#00H
MOV KEY_NUMBER,#03H
;密码初始化
MOV 30H,#10H;0
MOV 31H,#12H;2
MOV 32H,#11H;1
MOV 33H,#11H;1
MOV 34H,#15H;5
MOV 35H,#12H;2
SETB EA ;打开CPU总中断请求
SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发
SETB EX0 ;打开INT0中断请求
START:
AJMP START;反复循环
;以下为进入P3.2脚外部中断子程序,也就是解码程序
INT: CLR EA ;暂时关闭CPU的所有中断请求
MOV R6,#10
SB: ACALL YS1;调用882微秒延时子程序
JB P3.2,EXIT;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲
ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码
MOV R7,#26;忽略前26位系统识别码
JJJJA:JNB P3.2,$;等待地址码第一位的高电平信号
LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2;将P3.2引脚此时的电平状态0或1存入C中
JNC UUUA;如果为0就跳转到UUUA
LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUUA: DJNZ R7,JJJJA
MOV R1,#50H ;设定1AH为起始RAM区
MOV R2,#2;接收从50H到51H的2个内存,用于存放操作码和操作反码
PP: MOV R3,#8;每组数据为8位
JJJJ: JNB P3.2,$;等待地址码第一位的高电平信号
LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2;将P3.2引脚此时的电平状态0或1存入C中
JNC UUU;如果为0就跳转到UUU
LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUU: MOV A,@R1;将R1中地址的给A
RRC A;将C中的值0或1移入A中的最低位
MOV @R1,A;将A中的数暂时存放在R1数值的内存中
DJNZ R3,JJJJ;接收满8位换一个内存
INC R1;对R1中的值加1,换下一个RAM
DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在50H/51H中
MOV A,50H
CPL A;对50H取反后和51H比较
CJNE A,51H,EXIT;如果不等表示接收数据发生错误,放弃
MOV R1,48H
MOV R2,49H
MOV R3,4AH
ACALL CHECK
MOV 4AH,R3
MOV 49H,R2
MOV 48H,R1
EXIT: SETB EA ;允许中断
RETI ;退出解码子程序
YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒
D2: MOV R5,#235
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#2;延时程序3,精确延时1000微秒
D3:MOV R5,#248
DJNZ R5,$
DJNZ R4,D3
RET
;密码检测程序
CHECK:
MOV A,50H
CJNE A,#0AH,CHECK_KEY_0
CLR P3.5;蜂鸣器鸣响嘀嘀嘀的声音
LCALL YS2
LCALL YS2
LCALL YS2
SETB P3.5;蜂鸣器停止
SETB P3.7
MOV KEY,#0H
RET
CHECK_KEY_0:
CJNE A,#01H,CHECK_KEY_1
ACALL SOUND_KEY_PUT
MOV KEY,#01H
MOV R1,#38H
MOV R2,#06H
RET
CHECK_KEY_1:
MOV A,KEY
CJNE A,#01H,CHECK_KEY_2
CLR P3.5;蜂鸣器鸣响嘀嘀嘀的声音
LCALL YS2
LCALL YS2
LCALL YS2
SETB P3.5;蜂鸣器停止
ACALL KEY_PASS
RET
CHECK_KEY_2:
MOV A,KEY
CJNE A,#02H,CHECK_KEY_3
MOV A,50H
CJNE A,#11H,CHECK_KEY_2B
CLR P3.5;蜂鸣器鸣响嘀嘀嘀的声音
LCALL YS2
LCALL YS2
LCALL YS2
SETB P3.5;蜂鸣器停止
ACALL KEY_OPEN
RET
CHECK_KEY_2B:
MOV A,50H
CJNE A,#12H,CHECK_KEY_2C
MOV KEY,#03H
MOV R1,#38H
MOV R2,#06H
MOV R3,#02H
ACALL SOUND_KEY_PUT
CHECK_KEY_2C:
RET
CHECK_KEY_3:
MOV A,KEY
CJNE A,#03H,CHECK_KEY_3B
CLR P3.5;蜂鸣器鸣响嘀嘀嘀的声音
LCALL YS2
LCALL YS2
LCALL YS2
SETB P3.5;蜂鸣器停止
ACALL KEY_MODIFY
CHECK_KEY_3B:
RET
KEY_PASS:
MOV @R1,50H
INC R1
DJNZ R2,KEY_PASS_EXIT
MOV R1,#38H
MOV R2,#30H
MOV R3,#06H
ACALL KEY_CHECK
MOV A,KEY_CHECK_WORD
JZ KEY_WRONG
MOV KEY,#2H
MOV KEY_NUMBER,#03H
ACALL SOUND_KEY_OK
KEY_PASS_EXIT:RET
KEY_CHECK:
MOV A,R2
MOV R0,A
MOV A,@R0
XRL A,@R1
JNZ KEY_CHECK_1
INC R1
INC R2
DJNZ R3,KEY_CHECK
MOV KEY_CHECK_WORD,#01H
RET
KEY_CHECK_1:
MOV KEY_CHECK_WORD,#00H
RET
KEY_WRONG:
ACALL SOUND_KEY_WRONG
DJNZ KEY_NUMBER,KEY_WRONG_1
MOV KEY,#0
MOV R0,#15
SOUND_WRONG_3:
ACALL SOUND_KEY_WRONG
ACALL DELAY
DJNZ R0,SOUND_WRONG_3
MOV KEY_NUMBER,#03H
RET
KEY_WRONG_1:
MOV R1,#38H
MOV R2,#06H
ACALL SOUND_KEY_PUT
RET
KEY_MODIFY:
MOV @R1,50H
INC R1
DJNZ R2,KEY_MODIFY_EXIT
DJNZ R3,KEY_MODIFY_2
MOV R1,#38H
MOV R2,#40H
MOV R3,#06H
ACALL KEY_CHECK
MOV A,KEY_CHECK_WORD
JZ KEY_MODIFY_WRONG
MOV R1,#30H
MOV R2,#38H
MOV R3,#06H
KEY_MODIFY_PASS:
MOV A,R2
MOV R0,A
MOV A,@R0
XCH A,@R1;字节交换
INC R1
INC R2
DJNZ R3,KEY_MODIFY_PASS
MOV KEY,#02H
ACALL SOUND_KEY_OK
RET
KEY_MODIFY_2:
MOV R1,#40H
MOV R2,#06H
ACALL SOUND_KEY_PUT
RET
KEY_MODIFY_WRONG:
MOV KEY,#02H
ACALL SOUND_KEY_WRONG
RET
KEY_MODIFY_EXIT:
RET
KEY_OPEN:
CLR P3.7
MOV KEY,#0
RET
DELAY:MOV R4,#04H;延时子程序,12M晶振延时约500毫秒
L3: MOV R2 ,#0FAH
L1: MOV R3 ,#0FAH
L2: DJNZ R3 ,L2
DJNZ R2 ,L1
DJNZ R4 ,L3
RET
;1声,请输入密码,0.5秒/声 SOUND_KEY_PUT
;2声,密码错误,2秒 SOUND_KEY_WRONG
;2声,密码成功,0.2秒/声 SOUND_KEY_OK
SOUND_KEY_WRONG:
CLR P3.5
MOV R7,#010
KEY_WRONG_D1:MOV R6,#250
KEY_WRONG_D2:MOV R5,#250
DJNZ R5,$
DJNZ R6,KEY_WRONG_D2
DJNZ R7,KEY_WRONG_D1
SETB P3.5
RET
SOUND_KEY_OK:
CLR P3.5
MOV R4,#03
KEY_OK_D1:MOV R6,#250
KEY_OK_D2:MOV R5,#250
DJNZ R5,$
DJNZ R6,KEY_OK_D2
CPL P3.5
DJNZ R4,KEY_OK_D1
SETB P3.5
RET
SOUND_KEY_PUT:
CLR P3.5
MOV R7,#03
KEY_PUT_D1:MOV R6,#250
KEY_PUT_D2:MOV R5,#250
DJNZ R5,$
DJNZ R6,KEY_PUT_D2
DJNZ R7,KEY_PUT_D1
SETB P3.5
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -