密码锁+1602液晶显示C程序.docx

上传人:b****5 文档编号:5798261 上传时间:2023-01-01 格式:DOCX 页数:24 大小:18.37KB
下载 相关 举报
密码锁+1602液晶显示C程序.docx_第1页
第1页 / 共24页
密码锁+1602液晶显示C程序.docx_第2页
第2页 / 共24页
密码锁+1602液晶显示C程序.docx_第3页
第3页 / 共24页
密码锁+1602液晶显示C程序.docx_第4页
第4页 / 共24页
密码锁+1602液晶显示C程序.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

密码锁+1602液晶显示C程序.docx

《密码锁+1602液晶显示C程序.docx》由会员分享,可在线阅读,更多相关《密码锁+1602液晶显示C程序.docx(24页珍藏版)》请在冰豆网上搜索。

密码锁+1602液晶显示C程序.docx

密码锁+1602液晶显示C程序

#include

#defineuintunsignedint

#defineucharunsignedchar

voidkey_scan();

ucharcount0,count1,count3,num,n=0,temp,a,j,count4;

ucharmima[8];//初始密码存储区

uchartab_key[50];//输入密码存储区

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

bitenterflag;//确认键按下与否的标志

bitmimaflag;//密码正确与否的标志

bitxiugaiflag;//修改密码标志

bitenter1flag;//修改密码确认键标志

sbitred=P3^7;

sbitbell=P3^6;

sbitrs=P2^0;

sbitrw=P2^1;

sbitlcden=P2^2;

sbitscl=P3^4;

sbitsda=P3^5;

ucharcodetable1[]="inputthepassco";

ucharcodetable2[]="de:

--------";

ucharcodetable3[]="*";

ucharcodetable4[]="right(^_^)";

ucharcodetable5[]="firsterror!

!

!

!

";

ucharcodetable6[]="seconderror!

!

!

!

";

ucharcodetable7[]="thirderrorsee";

ucharcodetable8[]="utomorrow(^_^)";

ucharcodetable9[]="definethepassc";

ucharcodetable10[]="ode:

--------";

ucharcodetable11[]="codeisnew";

//******************************键盘消抖函数*******************************

voiddelay1()

{;;}

voiddelay2(ucharx)

{

uchara,b;

for(a=x;a>0;a--)

for(b=100;b>0;b--);

}

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

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

}

//****************************e^2room的初始化*******************************

voidstart()//开始信号

{

sda=1;

delay1();

scl=1;

delay1();

sda=0;

delay1();

}

voidstop()//停止

{

sda=0;

delay1();

scl=1;

delay1();

sda=1;

delay1();

}

//****************************应答信号*************************************

voidrespond()

{

uchari;

scl=1;

delay1();

while((sda==1)&&(i<250))i++;

scl=0;

delay1();

}

//*****************************写字节操作函数**********************************

voidwrite_byte(uchardate)

{

uchari,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<<1;//保持最高位,左移到进位CY

scl=0;

delay1();

sda=CY;

delay1();

scl=1;

delay1();

}

scl=0;

delay1();

sda=1;//总线释放

delay1();

}

//*******************************读字节操作函数*****************************

ucharread_byte()

{

uchari,k;

scl=0;

delay1();

sda=1;

delay1();

for(i=0;i<8;i++)

{

scl=1;

delay1();

k=(k<<1)|sda;//或运算,放到最低位

scl=0;

delay1();

}

returnk;

}

//**********************************写地址函数******************************

voidwrite_add(ucharaddress,uchardate)

{

start();

write_byte(0xa0);

respond();

write_byte(address);

respond();

write_byte(date);

respond();

stop();

}

//*******************************读地址函数*************************************

ucharread_add(ucharaddress)

{

uchardate;

start();

write_byte(0xa0);

respond();

write_byte(address);

respond();

start();

write_byte(0xa1);

respond();

date=read_byte();

stop();

returndate;

}

//****************************LCD1602的初始化*******************************

voidwrite_com(ucharcom)

{

rs=0;

lcden=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

voidwrite_date(uchardate)

{

rs=1;

lcden=0;

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

//***************************************密码比较函数********************************

bitmimacmp()

{

bitflag;

uchari;

for(i=0;i<8;i++)

{

if(mima[i]==tab_key[i])

flag=1;

else

{

flag=0;

i=8;

}

}

return(flag);//返回flag

}

////**********************************LCD显示函数开始**************************************

voidlcd_display()

{

uchari=0;

write_com(0x80+0x40+8);

for(i=0;i

{

write_date(table3[0]);

}

}

//****************************************键盘功能分配函数群开始****************************

//**0**1**2**3**

//**4**5**6**7**

//**8**9**确认(A)**无效(B)

//**取消(C)**修改密码键(D)**确认修改键(E)**无效(F)

voidkey_manage1()

{

tab_key[n]=0;

n++;

if(xiugaiflag==1)

{

mima[count4]=0;

count4++;

}

}

voidkey_manage2()

{

tab_key[n]=1;

n++;

if(xiugaiflag==1)

{

mima[count4]=1;

count4++;

}

}

voidkey_manage3()

{

tab_key[n]=2;

n++;

if(xiugaiflag==1)

{

mima[count4]=2;

count4++;

}

}

voidkey_manage4()

{

tab_key[n]=3;

n++;

if(xiugaiflag==1)

{

mima[count4]=3;

count4++;

}

}

voidkey_manage5()

{

tab_key[n]=4;

n++;

if(xiugaiflag==1)

{

mima[count4]=4;

count4++;

}

}

voidkey_manage6()

{

tab_key[n]=5;

n++;

if(xiugaiflag==1)

{

mima[count4]=5;

count4++;

}

}

voidkey_manage7()

{

tab_key[n]=6;

n++;

if(xiugaiflag==1)

{

mima[count4]=6;

count4++;

}

}

voidkey_manage8()

{

tab_key[n]=7;

n++;

if(xiugaiflag==1)

{

mima[count4]=7;

count4++;

}

}

voidkey_manage9()

{

tab_key[n]=8;

n++;

if(xiugaiflag==1)

{

mima[count4]=8;

count4++;

}

}

voidkey_manage10()

{

tab_key[n]=9;

n++;

if(xiugaiflag==1)

{

mima[count4]=9;

count4++;

}

}

//**********************************确认键**************************************************************

voidkey_manage11()

{

enterflag=1;//确认键按下

if(n==8)//只有输入8个密码后按确认才做比较

mimaflag=mimacmp();

else

mimaflag=0;

if(enterflag==1)

{

enterflag=0;

n=0;

//用FFFFFFFF清除已经输入的密码

for(count3=0;count3<8;count3++)

{

delay(5);

tab_key[count3]=0x0f;

}

TR1=1;//打开计数器1

count1=0;//定时器1由50MS累计到1S所用的计数器

if(mimaflag==1)

{

a=0;

write_com(0x01);

write_com(0x80);

for(count3=0;count3<16;count3++)

{

write_date(table4[count3]);//密码正确,显示RIGHT,绿灯亮

delay(5);

}

}

else

{

n=0;

red=0;

bell=0;

a++;

if(a==1)

{

for(count3=0;count3<8;count3++)//ffffffff清除密码

{

delay(5);

tab_key[count3]=0x0f;

}

write_com(0x01);

write_com(0x80);

for(count3=0;count3<16;count3++)

{

write_date(table5[count3]);//密码错误,显示firsterror,红灯亮

delay(5);

}

TR1=1;

}

if(a==2)

{

for(count3=0;count3<8;count3++)//ffffffff清除密码

{

delay(5);

tab_key[count3]=0x0f;

}

write_com(0x01);

write_com(0x80);

for(count3=0;count3<16;count3++)

{

write_date(table6[count3]);//密码错误,显示SECONDERROR,红灯亮

delay(5);

}

TR1=1;

}

if(a==3)

{

for(count3=0;count3<8;count3++)//ffffffff清除密码

{

delay(5);

tab_key[count3]=0x0f;

}

write_com(0x01);

write_com(0x80);

for(count3=0;count3<16;count3++)

{

write_date(table7[count3]);//密码错误,显示thirderrorsee,红灯亮

delay(5);

}

write_com(0x80+0x40);

for(count3=0;count3<16;count3++)

{

write_date(table8[count3]);//密码错误,显示UTOMORROW,红灯亮

delay(5);

}

TR1=0;

}

}

}

}

voidkey_manage12()

{

tab_key[n]=11;

n++;//密码计数清零

}

//****************************************************取消键********************************************

voidkey_manage13()

{

n=0;//密码计数清零

write_com(0x80);//指针所指位置

for(count3=0;count3<16;count3++)

{

write_date(table1[count3]);//第一行显示INPUTTHEPASSPORD:

delay(5);

}

write_com(0x80+0x40);

for(count3=0;count3<16;count3++)

{

write_date(table2[count3]);//开机显示--------

delay(5);

tab_key[count3]=0x0f;//用FFFFFFFF清楚已经输入的密码

}

}

//*******************************************修改密码键**********************************

voidkey_manage14()

{

ucharaa=0;

n=0;

xiugaiflag=1;

write_com(0x01);

write_com(0x80);

for(count3=0;count3<16;count3++)

{

write_date(table9[count3]);//显示definethepassword

delay(5);

tab_key[count3]=0x0f;//用FFFFFFFF清楚已经输入的密码

}

write_com(0x80+0x40);

for(count3=0;count3<16;count3++)

{

write_date(table10[count3]);//显示--------

delay(5);

}

TR0=1;

}

//******************************************修改密码键的确认键********************************

voidkey_manage15()

{

n=0;

enter1flag=1;

if(enter1flag==1)

{

enter1flag=0;

count4=0;

for(count3=0;count3<16;count3++)

{

tab_key[count3]=0x0f;//用FFFFFFFF清楚已经输入的密码

}

write_com(0x01);

write_com(0x80);

for(count3=0;count3<16;count3++)

{

write_date(table11[count3]);

delay(100);

}

TR1=1;

count1=0;

}

}

voidkey_manage16()

{

tab_key[n]=15;

n++;

}

//****************************************定时器1的50MS,共延时1秒*****************************

voidtime_1()interrupt3

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

if(count1<20)

{

count1++;

}

else//计时到1S

{

TR1=0;

count1=0;

mimaflag=0;

red=1;

bell=1;

//显示FFFFFFFF

write_com(0x01);

write_com(0x80);

for(count3=0;count3<16;count3++)

{

write_date(table1[count3]);//显示INPUTTHEPASSCODE

delay(5);

}

write_com(0x80+0x40);

for(count3=0;count3<16;count3++)

{

write_date(table2[count3]);//开机显示FFFFFFFF

delay(5);

}

}

}

//***********************************************定时0**********************************************

voidtime_0()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

if(count4<8)

{

key_scan();

}

else

{

TR0=0;

count4=0;

}

}

//初始化函数

voidinit()

{

uchari;

lcden=0;

write_com(0x38);//打开显示模式设置

write_com(0x0c);//打开显示,光标等等设置未零

write_com(0x06);//当读或写一个字符后地址指针加一,且光标加一,当写一个字符后整频显示左移,

write_com(0x01);//清零指令

write_com(0x80);//指针所指位置

//定时器初始化

TMOD=0x11;//T0,T1工作方式1

TH0=(65536-2000)/256;

TL0=(65536-2000)%256;//T0初始化2MS

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;//T1初始化50MS

TR1=0;

ET1=1;

EA=1;

TR0=0;

ET0=1;

count0=0;//初始没有密码输入,故为零

enterflag=0;//没有确认键按下

mimaflag=0;//密码正确与否键先置零

red=1;//红灯不亮

//************密码存入EPROM中**********************************

sda=1;

delay(5);

scl=1;

delay(5);

for(i=0;i<8;i++)

{

write_add(i,8);

delay2(100);

}

for(i=0;i<8;i++)

{

mima[i]=read_add(i);

delay(5);

}

}

voidmain()

{rw=0;

init();

write_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1