打印

想破脑袋了

[复制链接]
3309|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序会不会|  楼主 | 2011-10-8 19:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了矩阵键盘的程序(扫描法) 可是按0~3按键就是不显示,4~F显示正常,想了一天了  没找出原因 有空的帮忙看看 代码如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void delay1ms(uchar i);
void delay1ms(uchar i)            
{ uchar x,y;
for(;i<0;i--)
    {
     for(x=0;x<10;x++)
         { for(y=0;y<50;y++);}
}
}
uchar quzhi();
void main()
{uchar a;
  a=quzhi();    //调用取键码函数
  switch(a)
   {
    case 0xee: P1=0xc0; break;
    case 0xde: P1=0xf9; break;
case 0xbe: P1=0xa4; break;
case 0x7e: P1=0xb0; break;
case 0xed: P1=0x99; break;
case 0xdd: P1=0x92; break;
case 0xbd: P1=0x82; break;
case 0x7d: P1=0xf8; break;
case 0xeb: P1=0x80; break;
case 0xdb: P1=0x90; break;
case 0xbb: P1=0x88; break;
case 0x7b: P1=0x83; break;
case 0xe7: P1=0xc6; break;
case 0xd7: P1=0xa1; break;
case 0xb7: P1=0x86; break;
case 0x77: P1=0x8e; break;
   }
   }
uchar quzhi()
{
uchar a,b=0xfe,c;
P2=0x0f;
while((P2&0x0f)!=0x0f)
  {delay1ms(10);        //延时去抖动
   if((P2&0x0f)!=0x0f)
      {a=P2&0xf0;    //屏蔽低四位
       P2=b;   //将扫描初值送给P2
       while((P2&0xf0)!=0xf0)
        { c=P2&0x0f;
          a=a+c;
          return (a);
         }
   P2=b;
    P2<<=0x01;
      P2=P2|0x01;
    b=P2;
      }
  }
  return(0);
}

相关帖子

沙发
相信哥咯| | 2011-10-8 20:31 | 只看该作者
a=quzhi();    //调用取键码函数
给a赋值0xee看看会不会显示0;

用串口输出a=quzhi();,很快就能找出问题了。。

使用特权

评论回复
板凳
airwill| | 2011-10-8 20:37 | 只看该作者
P2=b;
    P2<<=0x01;
      P2=P2|0x01;
    b=P2;

是不是这样改比较好:
b = b*2 +1;
P2 = b;

原因是 P2 不能当成变量看,因为读回的值会受外界的影响

使用特权

评论回复
地板
NE5532| | 2011-10-8 20:46 | 只看该作者
那就先看看是按键的问题还是显示的问题三。

使用特权

评论回复
5
程序会不会|  楼主 | 2011-10-8 21:05 | 只看该作者
我用的是仿真 4# NE5532

使用特权

评论回复
6
程序会不会|  楼主 | 2011-10-8 21:09 | 只看该作者
我试过 是可以的 2# 相信哥咯

使用特权

评论回复
7
NE5532| | 2011-10-8 21:48 | 只看该作者
我用的是仿真  4# NE5532
程序会不会 发表于 2011-10-8 21:05


我管你用什么,程序的基本调试技巧是一样的。

使用特权

评论回复
8
相信哥咯| | 2011-10-8 22:36 | 只看该作者
6# 程序会不会

那说明你按键1的时候,取键函数读回的不是0xee;

用串口输出键码a=quzhi();,很快就能找出问题了。。

使用特权

评论回复
9
hificwc| | 2011-10-8 22:41 | 只看该作者
我用的是仿真  4# NE5532
程序会不会 发表于 2011-10-8 21:05

仿真的话可以单步或断点执行来看变量啊

使用特权

评论回复
10
sysdriver| | 2011-10-9 10:22 | 只看该作者
既然你想破脑袋了。。。就来看看你的程序,看是不是有资格让你想破脑袋

for(;i<0;i--);   怎么看都觉得不可能延时1ms,参数10传递进来,不能满足<0,结果只是延时几us的事情,先汗一个。。。即使是软仿真,跳进去看看也知道结果。

主函数都没有while(1)结构。。。这个也能想破脑袋。。。

显示程序更绝,竟然没有间隔时间等等。。。
按键扫描的思路混乱就不说了。。。
变量和函数的命名。。。剩下的就不说了


PS:回答LZ问题的各位,估计都没有瞄下程序吧,特别是“相信哥咯”。。。
本人没有打击LZ的意思,虽然看看郭天祥的视频教程不能学到高深的思想,但是入门是绝对的,比你现在好很多

使用特权

评论回复
11
huang1shan| | 2011-10-9 10:58 | 只看该作者
10楼高手啊!!!你怎么知道他是看郭天祥视频的,我最近也在看呢,哈哈
想和10楼交个朋友呢,我是新人:handshake 10# sysdriver

使用特权

评论回复
12
mayduan| | 2011-10-10 13:53 | 只看该作者
10楼正解……

使用特权

评论回复
13
vv123456| | 2011-10-10 21:23 | 只看该作者
看看

使用特权

评论回复
14
程序会不会|  楼主 | 2011-10-10 21:25 | 只看该作者
问题已经解决了 哈哈  刚开始学C 却是很头疼 谢谢大家的帮忙

使用特权

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

本版积分规则

46

主题

443

帖子

5

粉丝