3592|8

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

按键扫描程序取密码的问题 [复制链接]

for循环取6次Key_scan()的返回值
  1. for(i=0;i<6;i++)
  2. {
  3.         secret[i]=Key_scan();
  4.         delayms(200);
  5. }/code]

  6. 矩阵键盘扫描函数
  7. [code]uchar Key_scan()
  8. {
  9.         unsigned int temp,key;
  10.     while(1)
  11.     {
  12. //////////////////第一行///////////////////////////
  13.         P3=0xfe;
  14.         temp=P3;
  15.         temp=temp&0xf0;
  16.         if(temp!=0xf0)
  17.         {
  18.             delayms(10);
  19.             if(temp!=0xf0)
  20.             {
  21.                 temp=P3;
  22.                 switch(temp)
  23.                 {
  24.                     case 0xee:
  25.                         key=0;
  26.                                                 return 0x00;
  27.                                                 //
  28.                         break;
  29.                     case 0xde:
  30.                         key=1;
  31.                                                 return 0x01;
  32.                         //
  33.                         break;
  34.                     case 0xbe:
  35.                         key=2;
  36.                                                 return 0x02;
  37.                         //
  38.                         break;
  39.                     case 0x7e:
  40.                         key=3;
  41.                                                 return 0x03;
  42.                         //
  43.                         break;
  44.                 }
  45.                 while(temp!=0xf0)
  46.                 {
  47.                     temp=P3;
  48.                     temp=temp&0xf0;
  49.                     //
  50.                 }
  51.                 //////////////
  52.             }
  53.         }
  54. //////第二行//////
  55.         P3=0xfd;
  56.         temp=P3;
  57.         temp=temp&0xf0;
  58.         if(temp!=0xf0)
  59.         {
  60.             delayms(10);
  61.             if(temp!=0xf0)
  62.             {
  63.                 temp=P3;
  64.                 switch(temp)
  65.                 {
  66.                     case 0xed:
  67.                         key=4;
  68.                                                 return 0x04;
  69.                         //
  70.                         break;
  71.                     case 0xdd:
  72.                         key=5;
  73.                                                 return 0x05;
  74.                         //
  75.                         break;
  76.                     case 0xbd:
  77.                         key=6;
  78.                                                 return 0x06;
  79.                         //
  80.                         break;
  81.                     case 0x7d:
  82.                         key=7;
  83.                                                 return 0x07;

  84.                         //
  85.                         break;
  86.                 }
  87.                 while(temp!=0xf0)
  88.                 {
  89.                     temp=P3;
  90.                     temp=temp&0xf0;
  91.                     //
  92.                 }
  93.                 ///////
  94.             }
  95.         }
  96. //////////////////////第三行////////////////////
  97.         P3=0xfb;
  98.         temp=P3;
  99.         temp=temp&0xf0;
  100.         if(temp!=0xf0)
  101.         {
  102.             delayms(10);
  103.             if(temp!=0xf0)
  104.             {
  105.                 temp=P3;
  106.                 switch(temp)
  107.                 {
  108.                     case 0xeb:
  109.                         key=8;
  110.                                                 return 0x08;
  111.                         //
  112.                         break;
  113.                     case 0xdb:
  114.                         key=9;
  115.                                                 return 0x09;
  116.                         //
  117.                         break;
  118.                     case 0xbb:
  119.                         key=10;
  120.                                                 return 0x0A;
  121.                         //
  122.                         break;
  123.                     case 0x7b:
  124.                         key=11;
  125.                                                 return 0x0B;
  126.                         //
  127.                         break;
  128.                 }
  129.                 while(temp!=0xf0)
  130.                 {
  131.                     temp=P3;
  132.                     temp=temp&0xf0;
  133.                     //
  134.                 }
  135.                 ///////
  136.             }
  137.         }
  138. /////////////////////////第四行////////////////////
  139.         P3=0xf7;
  140.         temp=P3;
  141.         temp=temp&0xf0;
  142.         if(temp!=0xf0)
  143.         {
  144.             delayms(10);
  145.             if(temp!=0xf0)
  146.             {
  147.                 temp=P3;
  148.                 switch(temp)
  149.                 {
  150.                     case 0xe7:
  151.                         key=12;
  152.                                                 return 0x0C;
  153.                         //
  154.                         break;
  155.                     case 0xd7:
  156.                         key=13;
  157.                                                 return 0x0D;
  158.                         //
  159.                         break;
  160.                     case 0xb7:
  161.                         key=14;
  162.                                                 return 0x0E;
  163.                         //
  164.                         break;
  165.                     case 0x77:
  166.                         key=15;
  167.                                                 return 0x0F;
  168.                         //
  169.                         break;
  170.                 }
  171.                 while(temp!=0xf0)
  172.                 {
  173.                     temp=P3;
  174.                     temp=temp&0xf0;
  175.                     //
  176.                 }
  177.                 ///////
  178.             }
  179.         }
  180.     }

  181. }
复制代码

本意是用for循环6次取得Key_scan()的返回值,然后赋值给数组secret

现在假如i=0的时候,你按下按键,secret[0]得到了Key_scan()的返回值,但如果长时间不按按键,secret=Key_scan();中的i并不会一直等于1。也就是说,secret[1]或者secret[2]并没有正确得到Key_scan()的返回值(很可能是个随机值)

这样使用for循环想正确取6次Key_scan()的返回值的功能就不可以实现,请问如何才能6次正确取得Key_scan()的返回值

上面的问题或许可以这样说
当没有按键按下的时候,这句Key_scan()并没有返回值,secret=Key_scan();这句也就没有执行完成,i也就应该一直等于1(假如按了一次按键),然后停在这里(因为扫描函数里也有while(1)),等待有按键按下,但事实是没有这样,请教为什么

最新回复

用条件语句控制取键值可以实现!  详情 回复 发表于 2010-5-5 14:03
点赞 关注

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这段程序貌似没什么问题,不过楼主可以尝试一下,把

        P3=0xf7;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            delayms(10);
            if(temp!=0xf0)
            {
                temp=P3;
                switch(temp)
                {
                    case 0xe7:
                        key=12;
                        return 0x0C;
                        //
                        break;
                    case 0xd7:
                        key=13;
                        return 0x0D;
                        //
                        break;
                    case 0xb7:
                        key=14;
                        return 0x0E;
                        //
                        break;
                    case 0x77:
                        key=15;
                        return 0x0F;
                        //
                        break;
                }
                while(temp!=0xf0)
                {
                    temp=P3;
                    temp=temp&0xf0;
                    //
                }
                ///////

            }
        }
里的红字部分,替换成能够表现出现象的代码,例如亮灯。四个扫描都替换掉,最好是一行对应一个灯。然后跑起来看看效果怎么样。当然,如果能在线执行设置断点的话,就更方便了
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
以前用51做过这样的程序,挺好玩的!!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
可以在按键扫描函数里面,按键扫描的后面,将键值赋给数组,那么就肯定不会出错。

顺便说说,假如你真的要在mian里的for中赋值,那么你的按键扫描函数不应该有个while死循环,而这个循环应该在main中,mian中的死循环,每次做的事,就是按键扫描,假如有按键,立标志,保存键值,然后清标志,再循环回去,重新扫描按键,,,,,,

至于为什么你现在的代码实现不了这个功能,我就没有细看,因为你的程序架构有问题。查问题比较吃力。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
帮你顶
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 
我都是这样的,
用SCAN_KEY只读取键值,
用old_key 和now_key做当前值和过去值,
如果两个值不相等,则计数清零,old_key=now_key;
如果相等则计数加一,到了6次(根据灵敏度调节)判断键值为何,然后动作!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
void main(void)//主函数
{
       
        unsigned char key, j ,k, s;
        wei1=0;
        wei2=0;
        wei3=0;
        wei4=0;
        wei5=0;
        wei6=0; //初始化位选,只让最后一位数码管显示

        while(1)
          {
                   if(key_certain()== 1)                //确定键被按下后,扫描是那个键被按下
                   {   
                    P1=0xfe;                                //送第一行为低电平
                        k=0xfe;                                        //保留这次扫描数值,备移位用
                    for(j=0;j<4;j++)                //四次扫描处理
                    {       
              s=P1&0xf0;                        //屏蔽低四位,取高四位,根据s数值确定那一列,根据扫描的j行确定行数,
                          switch(s)
                                {
                                        case 0xe0: key=4*j+0; break;        //第1列
                                            case 0xd0: key=4*j+1; break;        //第2列
                                         case 0xb0: key=4*j+2; break;        //第3列
                                         case 0x70: key=4*j+3; break;        //第4列
                                         default:        break;
                                }
                          k=(k<<1)|0x01;                //循环扫描,
                          P1=k;                                        //每次仅向一行送0扫描
             }//for
                   }//
               
          P0=tab[key];                                //数据送数码管显示数据口
                wei1=1;                                                        //选中片选

                delay(10);
        }//while
}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
观膜
回复内容太短了!
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

9
 
用条件语句控制取键值可以实现!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表