嵌入式单片机设计吧 关注:23贴子:96
  • 1回复贴,共1

LCD1602的矩阵式按键 密码锁程序 求解

只看楼主收藏回复


#include<reg51.h>
#include<lcd.h>
sbit P3_3 = P3^3;
sbit P2_7 = P2^7;
bit pw_flag;//密码正确与否
unsigned char str1[]="password:";//第一行显示的
unsigned char str2[]={0,0,0,0,0,0,0,0};//写入密码
unsigned char str3[]={0,0,0,0,0,0}; //密码初始值
unsigned char KeyDriver();
void KeyAction(unsigned char x);
void Passwordsetup();
void delay(unsigned int i)
{
unsigned int k;
for(k=0;k<i;k++);
}
void main()
{
unsigned char key;
InitLcd1602();//初始化LCD160
LcdShowStr(0,0,str1);//password: ****** 第一行第一列
LcdWriteCmd(0xC0);
// LcdShowStr(1,0,'A');
// LcdShowStr(3,0,'P');
// LcdWriteDat('A');
while(1)
{
key=KeyDriver();
KeyAction(key);
}
}
unsigned char KeyDriver()//判断按键是否按下
{
unsigned char button,temp,n,m,key;
unsigned char i,u;
P0=0x0F;//0000 1111
P2=0xF0; //1111 0000
button = P0;
if(button!=0x0F)
{
delay(1200); //延时消抖
button = P2; //再次读取
if(button!=0x0F)
{
for(i=0;i<4;i++)//循环列
{
u=0x01;//0001 0000 0010 0000 0100 0000 1000 0000
P2=~(u<<=i);// 1110 1111 1101 1111 1011 1111 0111 1111
temp=P0;
temp&=0x0F;
if(temp!=0x0F)
{
n=i;
switch(temp)
{
case 0x0E: m=0;key=m*4+n;break;//0000 1110
case 0x0D:m=1;key=m*4+n;break;//0000 1101
case 0x0B:m=2;key=m*4+n;break;//0000 1011
case 0x07:m=3;key=m*4+n;break;//0000 0111
default:break;
}
return key;
}
}
}
}
}
void KeyAction(unsigned char x)//按键动作
{
unsigned char i;
static unsigned count=0;
if(x>=0&&x<=9)
{
str2[count] =x;
//LcdShowStr(1,1,str2);
LcdWriteDat(x+0x30);//ASCII 0+0x30 ='0' //LcdWritedat(输入16进制)
count++;//5++ = 6
while(P0!=0x0F);//判断按键是否松开
}
// else if(x==11)
// {
// LcdWriteDat('A');
// }
else if(x==10)//按下确认件 第一个是个数是否符合 密码是否相同
{
pw_flag = 1;
if(count!=6)//不满足个数 //直接按也会count!=6 pw_flag
{
pw_flag = 0;
}
else//满足个数 str2 与 str3比较
{
for(i=0;i<6;i++)
{
if(str2[i]!=str3[i])//输入密码和初始化密码比较
{
pw_flag = 0;//密码错误
break;
}
}
}
while(P0!=0x0F); //判断10是否松开
if(pw_flag==0)//密码不正确 pw_flag = 0
{
LcdWriteCmd(0x01);
// LcdWriteCmd(0xC0);
LcdShowStr(4,0,"error");//显示密码错误
P3_3 = 1;//灯不亮
}
if(pw_flag==1)//密码正确 pw_flag =1
{
// LcdWriteCmd(0x8A);
// InitLcd1602();
LcdWriteCmd(0x01);
LcdShowStr(4,0,"pass");
// LcdWriteDat("pass");
P3_3=0;//灯亮
x=KeyDriver();
if(x==11)//只有密码输入正确 才能按下重设密码按键
{
LcdWriteDat('A');
while(P0!=0x0F);//判断按键是否松开
}
}
}
}
void Passwordsetup()//重设密码 更改初始值 str3[]
{
unsigned char key;
static unsigned char count=0;
unsigned char str4[]="password setup:";
LcdWriteCmd(0x01);//清屏
LcdShowStr(0,0, str4);//第一行第一列
while(1)//循环输入
{
key=KeyDriver();
LcdWriteDat('*');//显示*
str3[count]=key; //放入密码数组
count++;
if(count==6)
{
break;
}
}
}
想问下为什么当我按下10键以后 pw_flag=1 显示密码正确 我想再进去keyDriver()函数 按下11按键 void Passwordsetup()//重设密码 但是没办法做到呢


IP属地:广东1楼2022-06-02 16:57回复
    程序帮你改好了,按下11键重新设置密码,要先输入正确旧密码,在输入两次一样的新密码就可以了
    #include<reg51.h>
    #include<lcd.h>
    sbit P3_3 = P3^3;
    sbit P2_7 = P2^7;
    bit pw_flag;//ÃÜÂëÕýÈ·Óë·ñ
    static unsigned count=0;
    unsigned char str1[]="password:";//µÚÒ»ÐÐÏÔʾµÄ
    unsigned char str2[]={0,0,0,0,0,0,0,0};//дÈëÃÜÂë
    unsigned char str3[]={0,0,0,0,0,0}; //ÃÜÂë³õʼֵ
    unsigned char KeyDriver();
    void KeyAction(unsigned char x);
    void Passwordsetup();
    void delay(unsigned int i)
    {
    unsigned int k;
    for(k=0;k<i;k++);
    }
    void mms_init(){
    pw_flag=0;
    P3_3 = 0;
    count=0;
    LcdWriteCmd(0x01);
    LcdShowStr(0,0,str1);//password£º ****** µÚÒ»ÐеÚÒ»ÁÐ
    LcdWriteCmd(0xC0);
    }
    void main()
    {
    unsigned char key;
    static char time_flag = 0;
    unsigned int time = 0;
    P3_3 = 0;//µÆ²»ÁÁ
    InitLcd1602();//³õʼ»¯LCD160
    LcdShowStr(0,0,str1);//password£º ****** µÚÒ»ÐеÚÒ»ÁÐ
    LcdWriteCmd(0xC0);
    // LcdShowStr(1,0,'A');
    // LcdShowStr(3,0,'P');
    // LcdWriteDat('A');
    while(1)
    {
    key=KeyDriver();
    if(key){
    KeyAction(key-1);
    //if(pw_flag==1){
    if(key == 12){
    Passwordsetup();
    //pw_flag=0;
    }
    //}
    if(key == 11){
    time_flag = 1;
    }
    }
    if(time_flag==1){
    time++;
    if(time > 3000){ //1miao hou zi dong guan suo
    time = 0;
    time_flag = 0;
    mms_init();
    }
    }
    delay(100);
    }
    }
    unsigned char KeyDriver()//Åжϰ´¼üÊÇ·ñ°´ÏÂ
    {
    unsigned char button,temp,n,m,key;
    unsigned char i,u;
    P0=0x0F;//0000 1111
    P2=0xF0; //1111 0000
    button = P0;
    if(button!=0x0F)
    {
    delay(1200); //ÑÓʱÏû¶¶
    button = P2; //ÔٴζÁÈ¡
    if(button!=0x0F)
    {
    for(i=0;i<4;i++)//Ñ»·ÁÐ
    {
    u=0x01;//0001 0000 0010 0000 0100 0000 1000 0000
    P2=~(u<<=i);// 1110 1111 1101 1111 1011 1111 0111 1111
    temp=P0;
    temp&=0x0F;
    if(temp!=0x0F)
    {
    n=i;
    switch(temp)
    {
    case 0x0E: m=0;key=m*4+n;break;//0000 1110
    case 0x0D:m=1;key=m*4+n;break;//0000 1101
    case 0x0B:m=2;key=m*4+n;break;//0000 1011
    case 0x07:m=3;key=m*4+n;break;//0000 0111
    default:break;
    }
    while(P0!=0x0F);
    return key+1;
    }
    }
    }
    }
    return 0;
    }
    void KeyAction(unsigned char x)//°´¼ü¶¯×÷
    {
    unsigned char i;
    if(x>=0&&x<=9)
    {
    str2[count] =x;
    //LcdShowStr(1,1,str2);
    LcdWriteDat(x+0x30);//ASCII 0+0x30 ='0' //LcdWritedat(ÊäÈë16½øÖÆ)
    count++;//5++ = 6
    //while(P0!=0x0F);//Åжϰ´¼üÊÇ·ñËÉ¿ª
    }
    // else if(x==11)
    // {
    // LcdWriteDat('A');
    // }
    else if(x==10)//°´ÏÂÈ·Èϼþ µÚÒ»¸öÊǸöÊýÊÇ·ñ·ûºÏ ÃÜÂëÊÇ·ñÏàͬ
    {
    pw_flag = 1;
    if(count!=6)//²»Âú×ã¸öÊý //Ö±½Ó°´Ò²»ácount£¡=6 pw_flag
    {
    pw_flag = 0;
    }
    else//Âú×ã¸öÊý str2 Óë str3±È½Ï
    {
    for(i=0;i<6;i++)
    {
    if(str2[i]!=str3[i])//ÊäÈëÃÜÂëºÍ³õʼ»¯ÃÜÂë±È½Ï
    {
    pw_flag = 0;//ÃÜÂë´íÎó
    break;
    }
    }
    }
    //while(P0!=0x0F); //ÅжÏ10ÊÇ·ñËÉ¿ª
    if(pw_flag==0)//ÃÜÂë²»ÕýÈ· pw_flag = 0
    {
    LcdWriteCmd(0x01);
    // LcdWriteCmd(0xC0);
    LcdShowStr(4,0,"error");//ÏÔʾÃÜÂë´íÎó
    P3_3 = 0;//µÆ²»ÁÁ
    }
    if(pw_flag==1)//ÃÜÂëÕýÈ· pw_flag =1
    {
    // LcdWriteCmd(0x8A);
    // InitLcd1602();
    LcdWriteCmd(0x01);
    LcdShowStr(4,0,"pass");
    // LcdWriteDat("pass");
    P3_3=1;//µÆÁÁ
    //x=KeyDriver();
    //if(x==11)//Ö»ÓÐÃÜÂëÊäÈëÕýÈ· ²ÅÄÜ°´ÏÂÖØÉèÃÜÂë°´¼ü
    //{
    //LcdWriteDat('A');
    //while(P0!=0x0F);//Åжϰ´¼üÊÇ·ñËÉ¿ª
    //}
    }
    }
    }
    char enter_pre_passworld(char key){
    char i;
    if(key>=0&&key<=9)
    {
    str2[count] =key;
    //LcdShowStr(1,1,str2);
    LcdWriteDat(key+0x30);//ASCII 0+0x30 ='0' //LcdWritedat(ÊäÈë16½øÖÆ)
    count++;//5++ = 6
    if(count >= 6){
    pw_flag = 1;
    for(i=0;i<6;i++)
    {
    if(str2[i]!=str3[i])//ÊäÈëÃÜÂëºÍ³õʼ»¯ÃÜÂë±È½Ï
    {
    pw_flag = 0;//ÃÜÂë´íÎó
    return 2;
    break;
    }
    }
    }
    }
    return pw_flag;
    }
    char new_passworld1[6] = 0;
    char new_passworld2[6] = 0;
    char enter_new_passworld1(char key){
    if(key>=0&&key<=9)
    {
    new_passworld1[count] =key;
    //LcdShowStr(1,1,str2);
    LcdWriteDat(key+0x30);//ASCII 0+0x30 ='0' //LcdWritedat(ÊäÈë16½øÖÆ)
    count++;//5++ = 6
    if(count >= 6){
    return 1;
    }
    }
    return 0;
    }
    char enter_new_passworld2(char key){
    char i = 0;
    if(key>=0&&key<=9)
    {
    new_passworld2[count] =key;
    //LcdShowStr(1,1,str2);
    LcdWriteDat(key+0x30);//ASCII 0+0x30 ='0' //LcdWritedat(ÊäÈë16½øÖÆ)
    count++;//5++ = 6
    if(count >= 6){
    for(i=0; i < 6; i++){
    if(new_passworld2[i] != new_passworld1[i]){
    return 2;
    }
    }
    for(i=0; i < 6; i++){
    str3[i] = new_passworld1[i];
    }
    return 1;
    }
    }
    return 0;
    }
    void Passwordsetup()//ÖØÉèÃÜÂë ¸ü¸Ä³õʼֵ str3[]
    {
    unsigned char key;
    unsigned char str4[6]="";
    char flag = 0,enter_flag = 0;
    count=0;
    LcdWriteCmd(0x01);//ÇåÆÁ
    LcdShowStr(0,0, "password setup");//µÚÒ»ÐеÚÒ»ÁÐ
    LcdShowStr(0,1,"Pre:");
    pw_flag = 0;
    while(1)//Ñ»·ÊäÈë
    {
    key=KeyDriver();
    if(key){
    switch(enter_flag){
    case 0:
    flag = enter_pre_passworld(key-1);
    if(flag == 1){
    enter_flag = 1;
    count=0;
    LcdShowStr(0,1,"new: ");
    LcdShowStr(0,1,"new:");
    }
    if(flag == 2){
    mms_init();
    return;
    }
    break;
    case 1:
    flag = enter_new_passworld1(key-1);
    if(flag){
    enter_flag = 2;
    count=0;
    LcdShowStr(0,1,"new2: ");
    LcdShowStr(0,1,"new2:");
    }
    break;
    case 2:
    flag = enter_new_passworld2(key-1);
    if(flag == 1){
    LcdShowStr(0,1,"set OK");
    enter_flag = 3;
    }else if(flag == 2){
    LcdShowStr(0,1,"set err");
    enter_flag = 3;
    }
    break;
    case 3:
    if(key == 12){
    enter_flag = 0;
    mms_init();
    return;
    }
    break;
    }
    if(key == 12){
    mms_init();
    return;
    }
    }
    }
    }


    IP属地:河北2楼2022-06-04 18:01
    回复