回 帖 发 新 帖 刷新版面

主题:谁能帮小弟遍个电子密码锁的程序啊

[em18]要求不多,就能检查密码正确,3次错误退出,能修改密码就可以了

回复列表 (共5个回复)

沙发

帮帮忙啊,急用啊[em10]

板凳

;你看看这个适合你不,我调试过了,可以运行。

count    equ    6
number    equ    3

data    segment
    assume    ds:data
message    db 0dh,0ah,'Do you want to modify the password (Y/N):',24h
string1    db 0dh,0ah,'Modify Password:',24h
string2 db 0dh,0ah,'Confirm Password:',24h
string3 db 0dh,0ah,'Not match !!! Press any key to exit.',0dh,0ah,24h        
string4    db 0dh,0ah,'Input Password:',24h    
string5    db 0dh,0ah,'Password is right! Press any key to exit.',0dh,0ah,24h
string6 db 0dh,0ah,'Password is wrong! Pleas input again.',0ah,0dh,24h    
keyword    db 31,32,33,34,35,36
keybak    db 32 dup (0)
buffer    db 32 dup (0)    
times    db number
data    ends
code    segment
    assume    cs:code
main    proc     far
    mov    ax,data
    mov    ds,ax
    mov    es,ax
        
waiting:mov    ah,09h            ;显示字符串
    mov    dx,offset message
    int     21h
    
    mov    ah,0            ;等待输入
    int     16h
        
    cmp    al,79h            ;如果输入的是Y/y那么就转到修改秘码
    je    modify
    cmp    al,59h
    je    modify
    cmp    al,6eh            ;如果输入的是N/n那么就转到输入秘码
    je    input
    cmp    al,4eh
    je    input
    cmp    al,1bh            ;如果输入的是Esc那么就退出程序
    je    exit
    jmp    waiting    
    
modify:    mov    ah,09h            ;显示字符串modify Password:
    mov    dx,offset string1
    int     21h
        
    mov     bx,offset keyword    ;输入秘码
    call    getkeys            ;获得输入秘码,保存到keyword
        
    mov    ah,09h            ;显示字符串Confirm Password:
    mov    dx,offset string2
    int     21h
        
    mov     bx,offset keybak    ;请再次输入秘码
    call    getkeys            ;再次获得输入秘码,保存到keybak
        
    mov    cx,count        ;比较两次输入的秘码是不是一样
cmpkey1:mov    si,offset keyword
    mov    di,offset keybak
    repz    cmpsb
    jz    waiting            ;两次输入的不一样则按任意键就会结束程序
    
    mov    ah,09h            ;Not match and press any key to exit.
    mov    dx,offset string3
    int     21h            
    mov    ah,00h
    int    16h
    jmp    exit
    
    mov    ah,00h
    int    16h
    
input:    mov    ah,09h            ;显示字符串Input Password:
    mov    dx,offset string4
    int     21h
        
    mov     bx,offset buffer    ;输入秘码
    call    getkeys            ;获得输入秘码,保存到buffer
    
    mov    cx,count        ;是否输入了正确的秘码
cmpkey2:mov    si,offset keyword
    mov    di,offset buffer
    repz    cmpsb
    jz    inputok            ;两次输入的不一样则按任意键就会结束程序
    dec    times
    cmp    times,0
    jz    exit
    mov    ah,09h            ;显示字符串Password is wrong!,Pleas input again.
    mov    dx,offset string6
    int     21h
    jmp    input            
    
inputok:mov    ah,09h            ;显示字符串Password is right! Press any key to exit.
    mov    dx,offset string5
    int     21h
        
    mov    ah,0
    int     16h
    
exit:    mov    ah,4ch
    int    21h
main     endp    
getkeys    proc    near

    mov    cx,count        ;设置循环计数为6,能够保存六个秘码
getkey:    mov    ah,00h            ;等待输入秘码
    int    16h    
    mov    byte ptr [bx],al    ;将输入的秘码保存到Bx指向的地址处
    mov    ah,02h            ;在当前光标位置显示*
    mov    dl,'*'
    int    21h
    inc    bx            
    loop    getkey
                
    ret
getkeys endp
code     ends
    end main

3 楼

上面可以保存六个秘码,如果你想保存更多的秘码或者两次输出就退出程序,你只要修改三个地方就行:
1:修改改count的值
2:修改number的值
3:修改keyword区域,你想输入几个秘码,这里就设置几位的初始秘码值

4 楼

谢谢啊,非常感谢

5 楼

#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char
uchar code aa[]={1,2,3,4};   /*****将你想要既密码放在数组中********/
uchar code bb[]={;;;;;;;}    /*****将数码管所显示的数放在数组中****/

void jiaodui()
{uchar i;
 for(i=0;i<4;i++)
 {
  aa[i]=bb[i];    /**********校对密码***********/
 }
 e++;
 if(e>=3)P3_5=1;        /***********电铃响应**********/
 
void main()
{
 while(1)
{
 jiaodui();
}
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册