搜索
您的当前位置:首页正文

密码锁设计

来源:爱够旅游网


完整程序

en bit p3.0;

rw bit p3.1; rs bit p3.2; display equ p0;

speaker bit P1.0; led bit P1.2; open bit P1.1; returnbit bit 20h.1;

ORG 0000h; LJMP start; ORG 000bh;

LJMP intermit_t0; ORG 001bh;

LJMP intermit_t1; ORG 0030h; start:

MOV sp,#60h;

lcall sys_initialization;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;主程序 main0: lcall strat_display;

main:

MOV 52h,#0; 52h判断输入错误次数储存地址 setb led; setb tr0; lcall key;

cjne a,#'A',next1;

LJMP set_password; next1: cjne a,#'B',next2;

LJMP input_password; next2: ajmp main;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;系统初始化 sys_initialization: clr led; setb open; clr speaker;

MOV 34h,#'1'; MOV 35h,#'2'; MOV 36h,#'3'; MOV 37h,#'4'; MOV 38h,#'5'; MOV 39h,#'6';

;存放初始密码

MOV r7,#12; MOV r0,#40h; loop: MOV @r0,#10h; inc r0;

djnz r7,loop;

;密码键值存放区清零完毕

lcall delay0_1s; MOV p0,#03h;

call write_instruction; 液晶软复位

MOV p0,#01h;

call write_instruction;

MOV p0,#3fh;

call write_instruction;

MOV p0,#0fh;

call write_instruction;

MOV p0,#06h;

call write_instruction; ;液晶初始化完毕

MOV r4,#10; MOV tmod,#11h; MOV th0,#3ch; MOV tl0,#0b0h; setb ea; setb et0;

;定时器T0,0.5S定时中断初始化完毕

ret;

;系统初始化完毕

;;;;;;;;;;;;;;;;;;;;;;中断服务程序 intermit_t0:

push acc; push psw;

MOV th0,#3ch; MOV tl0,#0b0h; djnz r4,return; cpl led;

MOV r4,#10; return: pop psw; pop acc; reti;

intermit_t1:

push acc; push psw;

MOV th1,#9eh; MOV tl1,#58h; djnz r4,return_t1; cpl led; cpl speaker; MOV r4,#10; return_t1:pop psw; pop acc; reti;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;键盘扫描 key: call ks; jnz k1; jmp key; k1:

call delay; call ks; jnz k2; jmp key; k2:

clr tr0; clr led;

MOV r2,#0feh; MOV r6,#00h;

k3: MOV a,r2; MOV p2,a; MOV a,p2; jb acc.4,l1; MOV a,#0; LJMP lk;

l1: jb acc.5,l2; MOV a,#4; LJMP lk;

l2: jb acc.6,l3; MOV a,#8; LJMP lk;

l3: jb acc.7,next_key; MOV a,#12;

lk: add a,r6; MOV r6,a;

k4: call ks; jnz k4; MOV a,r6;

MOV dptr,#table0; MOVc a,@a+dptr;

MOV 50h,a; 查表取值存入50h,保护键值

ret;

next_key: inc r6;

MOV a,r2; jnb acc.7,key; rl a;

MOV r2,a; jmp k3;

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

ks: MOV p2,#0f0h; MOV a,p2; xrl a,#0f0h; ret;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置密码程序 set_password:

call clear_display; MOV dptr,#table4; call input_hint;

MOV r0,#40h; call password;

jbc returnbit,set_password; ;先输入原密码完毕

MOV r5,#6; MOV r0,#40h; MOV r1,#34h; input_compere:

MOV a,@r0; xrl a,@r1;

jnz input_error; inc r0; inc r1; nop; nop;

djnz r5,input_compere; ;验证输入密码完毕 jmp set_password0;

input_error:

setb speaker; setb led;

call clear_display; MOV dptr,#table5; call input_hint; call delay1_5s;

clr speaker; clr led;

inc 52h; MOV a,52h;

cjne a,#3,set_password; sjmp $;

;输入密码错误次数超过3次,锁死

set_password0:

call clear_display; MOV dptr,#table2; call input_hint;

MOV r0,#40h; call password;

jbc returnbit,set_password; ;第一次输入新密码完毕

call clear_display; MOV dptr,#table3; call input_hint; call delay1_5s;

;显示再次输入新密码完毕

call clear_display; MOV dptr,#table4; call input_hint;

MOV r0,#46h; call password;

jbc returnbit,set_password; ;第二次输入新密码完毕

MOV r5,#6; MOV r0,#40h; MOV r1,#46h; set_compere:

MOV a,@r0; xrl a,@r1; jnz set_error; inc r0; inc r1;

djnz r5,set_compere;

MOV 34h,40h; MOV 35h,41h; MOV 36h,42h; MOV 37h,43h; MOV 38h,44h; MOV 39h,45h; ;存入新密码完毕

jmp main0;

;设置新密码成功,返回主程序

set_error:

setb speaker; setb led;

call clear_display; MOV dptr,#table5; call input_hint; call delay1_5s;

clr speaker; clr led;

LJMP set_password0;

;前后两次输入新密码不一致,返回重设

;;;;;;;;;;;;;;;;;;输入密码开锁程序 input_password:

call clear_display; MOV dptr,#table4; call input_hint;

MOV r0,#40h; call password;

jbc returnbit,input_password; ;输入原密码完毕

MOV r5,#6; MOV r0,#40h; MOV r1,#34h; input_compere0:

MOV a,@r0; xrl a,@r1;

jnz input_error22; inc r0; inc r1; nop; nop;

djnz r5,input_compere0; ;验证输入密码完毕 jmp display_right;

input_error22:

setb speaker; setb led;

call clear_display; MOV dptr,#table5; call input_hint; call delay1_5s;

clr speaker; clr led;

inc 52h; MOV a,52h;

cjne a,#3,input_password; sjmp $;

;输入密码错误超过3次,锁死

display_right:

call clear_display; MOV dptr,#table6;

call input_hint; 显示输入密码正确提示完毕

setb open; 开锁 next_key1:call key; nop; nop;

cjne a,#'F',next_key1;

clr open; 按下关锁键,关锁 jmp main0; 返回主程序

;;;;;;;;;;;;;;;;;;;;;;;; strat_display:

MOV p0,#80h;

call write_instruction; MOV dptr,#table1; call input_hint;

MOV p0,#0c0h;

call write_instruction; MOV dptr,#table11; call input_hint; ret;

clear_display:

MOV display,#01h; call write_instruction; MOV p0,#06h;

call write_instruction; ret;

input_hint:

MOV r5,#16; MOV a,#00h; all_or_not:

MOVc a,@a+dptr; MOV display,a; call writedata; inc dptr; clr a; nop; nop;

djnz r5,all_or_not; ret;

password:

MOV r5,#6; MOV r1,#0c0h; MOV a,r1; MOV p0,a;

call write_instruction; loop1: call key; nop; nop;

cjne a,#'C',next_to; setb returnbit; jmp endt; next_to:

MOV a,50h; MOV @r0,a;

MOV display,#'*';a; call writedata;

inc r1; inc r0;

djnz r5,loop1; endt: ret;

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;写数据指令 writedata: SETB rs; CLR rw; clr en; setb en; nop; nop; clr en; call delay; ret; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;写指令 write_instruction:

CLR rs; CLR rw; clr en; setb en; nop; nop; clr en; call delay; ret;

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

;;;;;;;;;;;;;;;;;;;;;;;;;延时程序 delay1_5s: push 07h; push 02h; push 03h; MOV r7,#15; del22s: MOV r3,#0; del11s: MOV r2,#0; djnz r2,$;

djnz r3,del11s; djnz r7,del22s; pop 03h; pop 02h; pop 07h; ret;

delay0_1s: push 02h; push 03h; MOV r3,#0; del21s: MOV r2,#0; nop; nop;

djnz r2,$;

djnz r3,del21s; pop 03h; pop 02h; ret;

delay: push 07h; push 06h; MOV r7,#10; d1: MOV r6,#248; nop nop

djnz r6,$; djnz r7,d1; pop 06h; pop 07h; ret

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

table0: db 'C','B','0','A'; db 'D','9','8','7'; db 'E','6','5','4'; db 'F','3','2','1';

table1: db 'PASSWORD: A gmi'; table11: db ' B kai';

table2: db 'SET PASSWORD: '; table3: db 'INPUT AGAIN! '; table4: db 'INPUT PASSWROD: '; table5: db 'PASSWORD ERROR! '; table6: db 'PASSWORD RIGHT! '; ;;;;;;;;;;;;;;;;;;;;;;;;;; End

电路图设计

因篇幅问题不能全部显示,请点此查看更多更全内容

Top