sinat_30112721 2016-04-09 14:43 采纳率: 50%
浏览 1749
已采纳

STC51单片机密码锁程序 为什么我的按键值存不进数组???main函数里的case后面得不出结果;

#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit light=P2^5;
uchar originalword[6]={1,2,3,4,5,6};
uchar currentword[6];
uchar newword[6];

bit pwflag;
uchar count=0;
bit entryflag;
uchar key,n=0;
//定义变量
void delay(uint i) //延时函数
{
while(i--);
}
void keyscan()//键盘扫描函数,使用行列反转扫描法 反转法的原理:
// 反转法就是通过给单片机的端口赋值两次,最后得出所按键的值的一种算法。
{
uchar l,h; //定义局部变量,用l得出低4位的值,用h得出高4位的值
P0=0x0f; //给P1赋值00001111
l=P0&0x0f;
if(l!=0x0f)
{
delay(10);
if(l!=0x0f)
l=P0&0x0f; //若有键按下,得出低四位的值
P0=l|0xf0;
h=P0&0xf0;
// while((P0&0x0f)!=0x0f);
}
key=l+h; //高4位的值与低4位的值相加
}

uchar coding(){

uint keynum;
keyscan();
switch(key)
{
case(0xee): keynum=1;break;
case(0xde): keynum=2;break;
case(0xbe): keynum=3;break;
case(0x7e): keynum='A';break;
case(0xed): keynum=4;break;
case(0xdd): keynum=5;break;
case(0xbd): keynum=6;break;
case(0x7d): keynum='B';break;
case(0xeb): keynum=7;break;
case(0xdb): keynum=8;break;
case(0xbb): keynum=9;break;
case(0x7b): keynum='C';break;
case(0xe7): keynum='*';break;
case(0xd7): keynum=0;break;
case(0xb7): keynum='#';break;
case(0x77): keynum='S';break;
}
return(keynum);
}

void main()
{
uchar k;
light=0;
k=coding();
while(k>0){
switch(k){
case 1: if(count<6){
currentword[count]=1;
count++;
}
break;
case 2: if(count<6){
currentword[count]=2;
count++;
}
break;
case 3: if(count<6){
currentword[count]=3;
count++;
}
break;
case 4: if(count<6){
currentword[count]=4;
count++;
}
break;
case 5: if(count<6){
currentword[count]=5;
count++;
}
; break;
case 6: if(count<6){
currentword[count]=6;
count++;
}
break;
case 7: if(count<6){
currentword[count]=7;
count++;
}
break;
case 8: if(count<6){
currentword[count]=8;
count++;
}
break;
case 9: if(count<6){
currentword[count]=9;
count++;
}
break;
case 0: if(count<6){
currentword[count]=0;
count++;
}
break;
case 'A': light=1; break;
case 'B': light=1; break;
case 'C': light=1; break;
case 'D': light=1; break;
case 'S': light=1; break;
case '*': light=1; break;
case '#': light=1; break;
}
if(count==6){
while(1){
light=1;
count=0;
}
}
}
}

  • 写回答

6条回答

  • zl199203 2016-04-12 12:43
    关注

    main函数结构错误:
    k=coding();这句应该包含进一个死循环中,你这样写一上电没等你操作就过去了,以下仅供参考:

    void main()
    {
        uchar k;
        light=0;
        while(1){
            k=coding();
            while(k>0){
            switch(k){
                case 1: 
                                    if(count<6){
                                                currentword[count]=1;
                                                count++;
                                    }
                                    break;
                case 2:
                                    if(count<6){
                                                currentword[count]=2;
                                                count++;
                                    }
                                    break;
                case 3:
                                if(count<6){
                                                currentword[count]=3;
                                                count++;
                                    }
                                    break;
                case 4: if(count<6){        //剩下的格式自己改。。。
                currentword[count]=4;
                count++;
                }
                break;
                case 5: if(count<6){
                currentword[count]=5;
                count++;
                }
                ; break;
                case 6: if(count<6){
                currentword[count]=6;
                count++;
                }
                break;
                case 7: if(count<6){
                currentword[count]=7;
                count++;
                }
                break;
                case 8: if(count<6){
                currentword[count]=8;
                count++;
                }
                break;
                case 9: if(count<6){
                currentword[count]=9;
                count++;
                }
                break;
                case 0: if(count<6){
                currentword[count]=0;
                count++;
                }
                break;
                case 'A': light=1; break;
                case 'B': light=1; break;
                case 'C': light=1; break;
                case 'D': light=1; break;
                case 'S': light=1; break;
                case '*': light=1; break;
                case '#': light=1; break;
                }
    
                if(count==6){  //已经输入了6个密码了,你想要干啥呢?如果是密码锁,是不是该确认一下密码对不对,对了怎么办,不对又怎么办
                //做个循环,判断密码
                //前面再定义个标志变量,这个你自己加到开头:  bool flag = 0 ;
                for(i=0;i<6;i++)
                {
                            if(currentword[i]!=originalword[i]) //只要有一位密码不对
                            {
                                count=0;//清空计数
                                flag = 0;
                                break;//跳出
                            }
                            flag = 1; //6位验证都通过设为1
                }
                if(flag == 1)
                {//这里,密码都对了,该怎么做你自己改
                        flag =0 ;
                        light=1;
                        count=0;
                    }
                }
            }
        }
    } 
    

    PS:格式!格式!格式!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP