用51单片机和at24c02储存密码的密码锁,密码对比程序怎么写,C语言

用51单片机和at24c02储存密码的密码锁,密码对比程序怎么写,C语言,第1张

#include<reg51.h>

#include <INTRINS.H>

#define uchar unsigned char

#define uint unsigned int

#define No_key 20 //定义无按键时的默认值

#define KEY P3 //定义按键输入口

uchar m=0 //定义密码删除次数//输入新密码用

#define lcddata P0 //定义液晶数据入口

uchar data save[6] //定义用户输入密码保存数组

sbit lcden= P3^4 //定义液晶使能端

sbit lcdrs= P3^5 //液晶数据 指令信号转换端口

sbit dula=P2^6 //定义段选

sbit wei=P2^7 //定义位选

unsigned char yinyue=0

uchar password[]={2,2,2,2,2,2}//定义初始密码

uchar code table[]= " Hello! "

uchar code table1[]=" OK!"

uchar code table2[]="Enter please"

uchar code table3[]="word wrong "

uchar code table4[]="old word! "

uchar code table5[]="new word! "

uchar wrong=0

sbit Beep = P2^3

/*void delayms(unsigned char a) //豪秒延时子程序

{

while(--a) //采用while(--a) 不要采用while(a--)各位可编译一下看看汇编结果就知道了!

}

void ydelay (unsigned char m) //控制频率延时

{

unsigned i=3*m

while(--i)

}

unsigned char yn=0 //n为节拍常数变量

unsigned char yp,ym //m为频率常数变量

unsigned char code music_tab[] ={

0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,

0x20, 0x40, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x10,

0x1C, 0x10, 0x18 , 0x40,

0x1C, 0x20, 0x20 , 0x20,

0x1C, 0x20, 0x18 , 0x20,

0x20, 0x80, 0xFF , 0x20,

0x30, 0x1C, 0x10 , 0x18,

0x20, 0x15, 0x20 , 0x1C,

0x20, 0x20, 0x20 , 0x26,

0x40, 0x20, 0x20 , 0x2B,

0x20, 0x26, 0x20 , 0x20,

0x20, 0x30, 0x80 , 0xFF,

0x20, 0x20, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x20, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x20, 0x15 , 0x20,

0x1C, 0x20, 0x20 , 0x20,

0x26, 0x40, 0x20 , 0x20,

0x2B, 0x20, 0x26 , 0x20,

0x20, 0x20, 0x30 , 0x80,

0x20, 0x30, 0x1C , 0x10,

0x20, 0x10, 0x1C , 0x10,

0x20, 0x20, 0x26 , 0x20,

0x2B, 0x20, 0x30 , 0x20,

0x2B, 0x40, 0x20 , 0x15,

0x1F, 0x05, 0x20 , 0x10,

0x1C, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x20, 0x15 , 0x20,

0x1C, 0x20, 0x20 , 0x20,

0x26, 0x40, 0x20 , 0x20,

0x2B, 0x20, 0x26 , 0x20,

0x20, 0x20, 0x30 , 0x30,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x40, 0x1C , 0x20,

0x20, 0x20, 0x26 , 0x40,

0x13, 0x60, 0x18 , 0x20,

0x15, 0x40, 0x13 , 0x40,

0x18, 0x80, 0x00

}

*/

uchar temp,flag=0,conflag//定义temp做为键盘检测 flag做密码标志

uchar k,xiugai //k为密码计数标志

uchar j=0 //用户输入次数统计

sbit a=P1^0//闪光端

char liang=1 //闪光次数控制量

void display_enter()

void reset()

void enter_code(uchar t)

uchar changepassword ()

void confirm()

void delete()

void change_code(uchar t)

void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200)大约延时200ms.

{ //delay(500)大约延时500ms.

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

/*void InitTimer0(void) //闪光定时器

{

TMOD = 0x01

TH0 = 0x0D8

TL0 = 0x0F0

EA = 1

ET0 = 1

TR0 = 1

}

void InitTimer1(void)

{

TMOD = 0x10

TH1 = 0x0FF

TL1 = 0x9C

EA = 1

ET1 = 1

TR1 = 1

}

void shanguang()

{

a=0

delay(500)

a=1

delay(500)

} */

/******1602写入指令************/

void wright_com(uchar com)

{

lcdrs=0

lcddata=com

delay(1)

lcden=1

delay(1)

lcden=0

}

/******1602写入数据***********/

void wright_data(uchar date)

{

lcdrs=1

lcddata=date

delay(1)

lcden=1

delay(1)

lcden=0

}

/**********4x4矩阵键盘扫描函数*********/

uchar keyscan()

{

uchar temp,num=No_key//num的初值要为无键盘按下时的返回值

/*********扫描第一行****************/

KEY=0xfe

temp=KEY

temp=temp&0xf0 //读出高四位

while(temp!=0xf0)

{

delay(10) //延时消抖

temp=KEY

temp=temp&0xf0

while(temp!=0xf0) //确认确实有按键按下

{

temp=KEY

switch(temp) //根据这八个电平可以确定是哪个按键按下

{

case 0xee:num=1

break

case 0xde:num=2

break

case 0xbe:num=3

break

case 0x7e:num=10

break

}

while(temp!=0xf0)//等待松手

{

temp=KEY

temp=temp&0xf0

}

}

}

/*********扫描第二行***************/

KEY=0xfd

temp=KEY

temp=temp&0xf0

while(temp!=0xf0)

{

delay(15)

temp=KEY

temp=temp&0xf0

while(temp!=0xf0)

{

temp=KEY

switch(temp)

{

case 0xed:num=4

break

case 0xdd:num=5

break

case 0xbd:num=6

break

case 0x7d:num=11

break

}

while(temp!=0xf0)

{

temp=KEY

temp=temp&0xf0

}

}

}

/*********扫描第三行****************/

KEY=0xfb

temp=KEY

temp=temp&0xf0

while(temp!=0xf0)

{

delay(10)

temp=KEY

temp=temp&0xf0

while(temp!=0xf0)

{

temp=KEY

switch(temp)

{

case 0xeb:num=7

break

case 0xdb:num=8

break

case 0xbb:num=9

break

case 0x7b:num=12

break

}

while(temp!=0xf0)

{

temp=KEY

temp=temp&0xf0

}

}

}

/*********扫描第四行****************/

KEY=0xf7

temp=KEY

temp=temp&0xf0

while(temp!=0xf0)

{

delay(10)

temp=KEY

temp=temp&0xf0

while(temp!=0xf0)

{

temp=KEY

switch(temp)

{

case 0xe7:num=0

break

case 0xd7:num=13

break

case 0xb7:num=14

break

case 0x77:num=15

break

}

while(temp!=0xf0)

{

temp=KEY

temp=temp&0xf0

}

}

}

return num

}

void display_OK()

{

uchar num

wright_com(0x80)

for(num=0num<12num++)

{

wright_data(table1[num])

}

}

void display_fired()

{

uchar num

wright_com(0x80)

for(num=0num<12num++)

{

wright_data(table3[num])

wrong++

if(wrong==2)

{

Beep=0

while(1)//进行键盘扫描

{

temp=keyscan()

if(temp!=No_key)//如果不是空值

{ if(temp==11) //是否是密码删除键

{

delete()

}

enter_code(temp) //将该密码保存

if(temp==12) //如果是确认键

{

confirm()// 对比密码 判断是否正确

if(conflag==1) //密码正确

{

Beep=1}}}}

}

}

}

void display_hello()

{

uchar num

wright_com(0x80)

for(num=0num<12num++)

{

wright_data(table[num])

}

}

void display_old()

{

uchar num

wright_com(0x80)

for(num=0num<12num++)

{

wright_data(table4[num])

}

}

void display_new()

{

uchar num

wright_com(0x80)

for(num=0num<12num++)

{

wright_data(table5[num])

}

}

void init()

{

uchar num

/****1602初始化******/

dula=0

wei=0//这个必须要置 零,否则无法正常显示

lcden=0

wright_com(0x38) //初始化

wright_com(0x0c) //打开光标0x0c不显示光标 0x0e光标不闪,0x0f光标闪

wright_com(0x01) //清显示

wright_com(0x01) //清显示

wright_com(0x80)

for(num=0num<7num++)

{

wright_data(table[num])

delay(1)

}

}

void main()

{

//InitTimer0()

init()

while(1)

{

temp=keyscan()

if(temp!=No_key)

{

if(temp==10) //判断是否是密码输入键重新输入键

{

reset()

flag=1

}

if(flag==1)

{

enter_code(temp)

}

if(temp==11) //是否是密码删除键

{

delete()

}

if(temp==12) //判断是否是密码确认键

{

confirm()

if(conflag==1)

{

display_OK()//开锁 //是否按下密码修改改键

}

if(conflag==0) //显示密码错误

{

display_fired()

}

}

if(temp==15)

{

changepassword()

}

}

}

}

void reset()

{

uchar num

wright_com(0x01)

display_enter()

wright_com(0x80+0x40) //擦除屏幕上的显示

for(num=0num<6num++)

{

save[num]=0 //对输入的数值进行清零

wright_data(' ')//显示的是空格

}

wright_com(0x80+0x40) //下次再输入时可以又从起始位置输入 //各种变量要清零回起始状态

flag=0

conflag=0 //标志位没分开 大bug

j=0

}

void enter_code(uchar t)

{

if(t>=0&&t<10)

{

if(j==0)

{

wright_com(0x80+0x40)//第一输入时要先写入地址指令,否则无法显示

wright_data('*')

}

else

{

wright_data('*') //不是第一个输入则不用再写地址

}

save[j++]=t //保存输入的数据

}

}

void confirm()

{

uchar k

for(k=0k<6k++)

{

if(password[k]!=save[k])//对数组中的内容进行逐一比较,一旦有数据不对马上退出循环

{

break

}

}

if(k==6) //要是条件退出的话说明六个数全对密码

{

conflag=1 // 进行标志密码正确

}

}

/****** 删除最后一个********/

void delete()

{ if(j>0)

{

wright_com(0x80+0x40+j-1) //确定删除对象

wright_data(' ')//显示空格即为删除

save[--j]=0

//删除后数据清零

wright_com(0x80+0x40+j) //为下次输入数据时写好位置,必须是在最后一个后面

}

}

void Timer0Interrupt(void) interrupt 1

{ TR0=0

if(P1==0x8f)

{

a=0

TR0 = 1//关定时器1

}

}

/****** 显示enter********/

void display_enter()

{

uchar num

wright_com(0x80)

for(num=0num<12num++)

{

wright_data(table2[num])

}

}

uchar changepassword () //定义修改密码函数

{

display_old()//显示 old word

while(1)//进行键盘扫描

{ if(P3==0x1f) //无线检测模块

{

P1=0x00

}

if(P3==0x2f)

{

P1=0x00

Beep=0}

temp=keyscan()

if(temp!=No_key)//如果不是空值

{ if(temp==11) //是否是密码删除键

{

delete()

}

enter_code(temp) //将该密码保存

if(temp==12) //如果是确认键

{

confirm()// 对比密码 判断是否正确

if(conflag==1) //密码正确

{

display_new()// 显示新密码

for(m=0m<6m++)

delete()

k=0

while(1) //扫描键盘

{ temp=keyscan()

if(temp!=No_key) //如果不是空

if(temp==11) //是否是密码删除键

{

delete()

}

change_code(temp)//将按键保存 放进password

if(temp>=0&&temp<10)

k++

if(k==6)

{ display_OK()//显示修改成功

for(m=0m<6m++)

delete()

delay(500)

display_hello()

flag=0

return 0

}

}

}

else

display_fired()

return 0

}

}

}

}

void change_code(uchar t)

{

if(t>=0&&t<10)

{

if(j==0)

{

wright_com(0x80+0x40)//第一输入时要先写入地址指令,否则无法显示

wright_data('*')

}

else

{

wright_data('*') //不是第一个输入则不用再写地址

}

password[j++]=t //保存输入的数据

}

}

/*void Timer1Interrupt(void) interrupt 3

{

TH0=0xd8

TL0=0xef

yn--

} */

没有iic结构 你自己加就好

#include <stdio.h>

#include <string.h>

typedef struct account{

    char name[32]

    char acc[16]

    char psw[16]

}Acc

//    data是结构体数组,filename是文件绝对地址,n保存读入的结构体数量 

void GetDataFromTxt(Acc* data, const char* filename, int* n)

{

    FILE *fp = fopen(filename, "r")

    if( NULL == fp ){

        printf("Open file failed or no this file!\n")

        return

    }

    

    int i = 0

    while( !feof(fp) )

    {

        fscanf(fp, "%s %s %s", data[i].name, data[i].acc, data[i].psw)

        i++        

    }

    *n = i    

}

int main()

{

    int i, n

    Acc data[100]

    //    获取数据 

    GetDataFromTxt(data, "E:\\secret.txt", &n)

    printf("n = %d\n", n)

    printf("姓名    账号          密码\n") 

    for(i = 0 i < n ++i)

        printf("%-4s %-16s %-10s\n", data[i].name, data[i].acc, data[i].psw)

        

    //    登录示例 

    putchar('\n')

    char acc[16], psw[16]

    do{

        //    这里只是粗略地写了一个

        //    具体的账号错误或者密码错误自行发挥 

        printf("请输入账号:")

        scanf("%s", acc)

        printf("请输入密码:")

        scanf("%s", psw)

        for(i = 0 i < n ++i)

        {

            if( strcmp(acc,data[i].acc)==0 && strcmp(psw,data[i].psw)==0 ){

                printf("登陆成功!\n")

                break 

            }

        }

        if( i == n ){

            printf("账号或密码不正确!请重新输入!\n\n") 

        }else{

            break

        }        

    }while(1)

    printf("Bye bye!!!\n")     

         

    return 0

}

for(i=0i<9i++)

{

cin>>t

p[i]=t

}

这个会使你输入9位密码的,可以改改

while((i!='#')&&(i<100)){cin>>t

p[i]=ti++} 当输入到#或是到最大值就停止;

还有:

for(i=0i<99i++)

{if(p[i]!=k[i])...}

如果两次一样的密码,就会一直检查到最后一位##!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11730214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存