打印

请大家帮我看一个单片机键盘扫描程序

[复制链接]
1513|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
manking|  楼主 | 2010-12-7 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[img]https://bbs.21ic.com/[/img]

我用逐行扫描法为什么不行呢?这里只列出第一行,请指出其中的问题
#include<reg52.h>
#define unint unsigned int
#define unchar unsigned char
unchar code led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, //0,1,2,3,4,5,6
  0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF,0xff};
unchar temp,num;
void delay(unint z);
void main()
{
  P2=0xff;
  P0=0xff;
  while(1)
  {  
       P1=0xef;
    temp=P1;
    temp=temp&0x0f;
    if (temp!=0x0f)
        {   
       delay(5);
     temp=P1;
     temp=temp&0x0f;
        if (temp!=0x0f)
             {
        temp=P1;
        switch (temp)
        {
       case 0xee: num=0; break;
       case 0xed: num=1; break;
       case 0xeb: num=2; break;
       case 0xe7: num=3; break;

     }
          while(temp!=0x0f);
      delay(5);
      while(temp!=0x0f);
     
     
               }
      P2=0x00;
         P0=led[num];
            }
  
}
}
void delay(unint z)
{
  unint x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}

相关帖子

沙发
suking1982| | 2010-12-8 00:28 | 只看该作者
楼主你程序有些问题。
1.主函数while(1)语句中
      P1=0xef;
    temp=P1;
    temp=temp&0x0f;
这3句执行下来temp的值一直为0x0f,下面的if函数根本没办法执行,所以无法进行按键检测;建议增加一个中间变量(在a=P1这个指令期间可以对P1进行是否有按键按下进行检测)
   P1=0xef;
    a=P1;
    temp=a&0x0f;
2.判断按键检测的过程还有一些bug,下面程序是我在自己的单片机上调试出来的(我的单片机用的是P3口检测按键;另外我们硬件线路的接法也不相同,所以程序也会不一样。)

3。楼主可以试一下keil 软件进行一下debug,观察一下各个IO口及关键参数的变化情况,一般就能找出问题所在了


  while(1)
          {  
        P3=0xef;
            delay(5);
            a=P3;
            temp=a&0x0f;
            if (temp!=0x0f)
                {   
                delay(5);
                   a=P3;
                temp=a&0x0f;
                if (temp!=0x0f)
                         {
                        switch (temp)
                                {
                                 case 0x0e: num=0; break;
                                 case 0x0d: num=1; break;
                                 case 0x0b: num=2; break;
                                       case 0x07: num=3; break;
                         
                                }
                }
                  while(P3!=0xef);
                      delay(5);
                      while(P3!=0xef);
                      P2=0x00;
                      P0=led[num];
                }
  
        }

使用特权

评论回复
板凳
suking1982| | 2010-12-8 00:29 | 只看该作者
备注,我也是新手,如果不对的地方请不要见怪。

使用特权

评论回复
地板
manking|  楼主 | 2010-12-8 07:43 | 只看该作者
2# suking1982

先感谢一下,我也是新手

P1=0xef;
    temp=P1;
    temp=temp&0x0f;
这3句执行下来temp的值一直为0x0f,(如果有键值按下,返回值就不是0x0f)下面的if函数是可以执行,建议增加一个中间变量(在a=P1这个指令期间可以对P1进行是否有按键按下进行检测)
   P1=0xef;
    a=P1;
    temp=a&0x0f;

这个和我的一样啊  还是感谢一下,我再调试一下

使用特权

评论回复
5
wangyy608| | 2010-12-8 13:57 | 只看该作者
读之前 P1 |= 0X0F;

使用特权

评论回复
6
liuxingyude| | 2010-12-13 18:03 | 只看该作者
不好

使用特权

评论回复
7
liang7143| | 2010-12-13 18:35 | 只看该作者
switch (temp)
        {
       case 0xee: num=0; break;
       case 0xed: num=1; break;
       case 0xeb: num=2; break;
       case 0xe7: num=3; break;
     }
这里有问题,前面已经进行了temp=temp&0x0f;,那么temp的高四位始终是0 的
改成下面的试试

      switch (temp)
        {
       case 0x0e: num=0; break;
       case 0x0d: num=1; break;
       case 0x0b: num=2; break;
       case 0x07: num=3; break;
     }

使用特权

评论回复
8
rxly| | 2010-12-13 18:35 | 只看该作者
是最后程序停这里了,while(temp!=0x0f);
所以第一次检测键盘能检测到,后面就不行了。。
呵呵……
改成while(temp!=0x0f)
{
      temp=P1;
      temp&=0x0f;
};

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

24

帖子

0

粉丝