矩阵按键扫描程序的一些疑惑(已解决)

2019-07-16 02:29发布

本帖最后由 何觅仙缘 于 2013-2-18 16:40 编辑

看了郭天祥矩阵键盘的教程,看着程序很冗长,所以就用for语句来实现扫描键盘,程序简洁了不少,但是下载到51后没用! 无论按哪个键都数码管都没有显示(键盘是4x3的),仿真了下,发现所有I0都是高电平,跟没下程序一样。。。。。(经LZ检查板子没问题),检查了很多遍程序也没发现问题,麻烦各位看下

先附程序

误区:在第30行中代码有误,因为优先级的关系,所以程序不正确(C语言基本功要扎实啊!)
改为:for(j=0;t=hang&lie[j],j<4;j++)  //此处不可以直接将hang&lie[j]         
       if(temp==t)                                //与temp比较,因为==优先级高于&
  1. #include  <reg52.h>
  2. #include  <Myspace.h>

  3. uchar lie[4]={0xef,0xdf,0xbf,0x7f};
  4. uchar hang[3]={0xfd,0xfb,0xf7};
  5. uchar temp,key,i,j;

  6. void disp(uchar x)        //显示程序
  7. {
  8.           P0=duan2[x];        
  9.           delay(10);
  10. }

  11. void scanf()
  12. {
  13.          for(i=0;i<3;i++)
  14.                 {
  15.                         P1=hang[i];        //先将某一行置零
  16.                         temp=P1;
  17.                         temp&=0xf0;
  18.                         if(temp!=0xf0)
  19.                                 {
  20.                                         delay(10);
  21.                                         temp=P1;
  22.                                         temp&=0xf0;          //确认有按键按下时,确定哪一列
  23.                                         if(temp!=0xf0)
  24.                                                 {
  25.                                                         temp=P1;
  26.                                                         for(j=0;j<4;j++)
  27.                                                         if(temp==hang[i]&lie[j]){key=4*i+j+1;break;}
  28.                                                         while(temp!=0xf0)          //等待松开按键
  29.                                                                 {
  30.                                                                         disp(key);
  31.                                                                         temp=P1;
  32.                                                                         temp&=0xf0;
  33.                                                                 }
  34.                                                 }
  35.                                 }
  36.                 }
  37. }

  38. main()
  39. {
  40.          P2=0x00; //选中所有数码管
  41.         while(1)
  42.         {        
  43.                 void sacnf();        
  44.         }        
  45. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
tancw_f
1楼-- · 2019-07-17 00:36
用反转扫描会方便很多,不用一行行地扫描
何觅仙缘
2楼-- · 2019-07-17 03:19
tancw_f 发表于 2013-2-14 19:40
粗略看了下,好像你的for()循环里的hang没有。。。。
我也是刚学没多久,希望能帮上忙 ...

源程序里有,发帖的时候被吞了,现在改用代码上传
也在学着,你是用哪本书或者是哪个教程?互勉
酷爱diy
3楼-- · 2019-07-17 09:08
这几天我看完郭老师的矩阵键盘,也在研究矩阵的更好的少秒方式,用反转法的确不错,正在研究
CCCBBBIII
4楼-- · 2019-07-17 12:09
 精彩回答 2  元偷偷看……
CCCBBBIII
5楼-- · 2019-07-17 15:39
哦,是我没看清楚

tancw_f
6楼-- · 2019-07-17 20:26
何觅仙缘 发表于 2013-2-15 10:05
源程序里有,发帖的时候被吞了,现在改用代码上传
也在学着,你是用哪本书或者是哪个教程?互勉 ...

我用的是杨欣的《51单片机应用从零开始》和郭天翔的《新概念51单片机C语言教程》,杨欣那本是用汇编讲的

一周热门 更多>