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

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条回答
何觅仙缘
1楼-- · 2019-07-16 04:36
那个hang数组程序里是有的,hang[i],但是在这里被吞了,显示不出来
xlfwl
2楼-- · 2019-07-16 09:35
好久没玩单片机了,粗看下,好象少了按键去抖的程序了吧?
小猪崽
3楼-- · 2019-07-16 14:40
  1. /********************************************************************
  2. * 文件名  : 矩阵键盘.c
  3. * 描述    :  该文件实现了 4 * 4 键盘的试验。通过数码管的最后一位来显示
  4.                          当前的按键值。                 
  5. * 创建人  : 东流,2009年4月10日
  6. * 版本号  : 2.0
  7. *********************************************************************/
  8. #include<reg51.h>
  9. #include<intrins.h>

  10. #define uint unsigned int
  11. #define uchar unsigned char

  12. uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  13. /********************************************************************
  14. * 名称 : Delay_1ms()
  15. * 功能 : 延时子程序,延时时间为 1ms * x
  16. * 输入 : x (延时一毫秒的个数)
  17. * 输出 : 无
  18. ***********************************************************************/
  19. void Delay_1ms(uint i)//1ms延时
  20. {
  21.         uchar x,j;
  22.         for(j=0;j<i;j++)
  23.         for(x=0;x<=148;x++);       
  24. }


  25. /********************************************************************
  26. * 名称 : Keyscan()
  27. * 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
  28. * 输入 : 无
  29. * 输出 : 按键值
  30. ***********************************************************************/
  31. uchar Keyscan(void)
  32. {
  33.         uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};                        //让矩阵键盘的每行分别为低电平
  34.         for(j=0; j<4; j++)
  35.         {
  36.                 P1 = Buffer[j];
  37.                 temp = 0x10;                                                                                                                                                                    
  38.                 for(i=0; i<4; i++)
  39.                 {
  40.                         if(!(P1 & temp))                 //判断P1口高4位某一行为低电平
  41.                         {
  42.                                 return (i+j*4);                //返回键码
  43.                         }
  44.                         temp <<= 1;
  45.                 }       
  46.         }
  47. }

  48. /********************************************************************
  49. * 名称 : Main()
  50. * 功能 : 主函数
  51. * 输入 : 无
  52. * 输出 : 无
  53. ***********************************************************************/
  54. void Main(void)
  55. {
  56.         uchar Key_Value;  //读出的键值
  57.         while(1)
  58.         {
  59.                 P1 = 0xf0;                               
  60.                 if(P1 != 0xf0)                        //判断有无按键按下
  61.                 {
  62.                         Delay_1ms(20);                //按键消抖
  63.                         if(P1 != 0xf0)                //第二次判断有无按键按下
  64.                         {
  65.                                 Delay_1ms(20);  //按键消抖
  66.                                 if(P1 != 0xf0)        //第三次判断有无按键按下
  67.                                 {
  68.                                         Key_Value = Keyscan();               
  69.                                 }
  70.                         }
  71.                 }
  72.                 P0 = table[Key_Value];
  73.                 P2 = 0x07;       
  74.         }
  75. }
复制代码
何觅仙缘
4楼-- · 2019-07-16 15:51
xlfwl 发表于 2013-2-14 10:01
好久没玩单片机了,粗看下,好象少了按键去抖的程序了吧?

里面有个delay去抖,不过你记性不错哦,还记得这些
何觅仙缘
5楼-- · 2019-07-16 16:08
 精彩回答 2  元偷偷看……
tancw_f
6楼-- · 2019-07-16 20:26
粗略看了下,好像你的for()循环里的hang没有[i ]。。。。
我也是刚学没多久,希望能帮上忙

一周热门 更多>