微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用实验板TX-1C 实现矩阵键盘输入 但第一行总是采不到

用实验板TX-1C 实现矩阵键盘输入 但第一行总是采不到

时间:10-02 整理:3721RD 点击:

我用的是TX-1C的实验板 在做书上的习题 题目如下:实验板上电后 按顺序按下矩阵键盘后 在数码管上依次显示0~F,也就是说 4×4的键盘 与16个数 一对一对应 并且最终显示在数码管上。-----------  我自己写的程序 2,3,4横排的键盘显示正常 但只有第一横排的四个按键 按下去没有任何反应。求哪位高手帮我解解惑  谢谢!  程序如下:

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit h1=P3^0;   //h1是第一横排
sbit h2=P3^1;   
sbit h3=P3^2;   
sbit h4=P3^3;   
sbit l1=P3^4;   //l1是第一竖列
sbit l2=P3^5;  
sbit l3=P3^6;   
sbit l4=P3^7;
sbit wela=P2^7;
sbit dula=P2^6;
uchar num,aa;
uchar code table[]={  //  0~F的数组
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void main()
{
  TMOD=0x11;
  TH0=(65536-600)/256;
  TL0=(65536-600)%256;
  TH1=(65536-600)/256;
  TL1=(65536-600)%256;
  EA=1;
  ET0=1;
  ET1=1;
  TR0=1;
  TR1=1;
  aa=0;
     P0=0xff;      
     wela=1;
     P0=0x00;    //开启数码管的位选
     wela=0;
     P0=0x00;    //清零
  while(1)
   {
     dula=1;
     P0=table[num];   // 数码管显示
     dula=0;
    }
}
void T0_timer() interrupt 3
{
  TH1=(65536-600)/256;
  TL1=(65536-600)%256;   
   aa++;
   if(aa==1)            //第一次中断时 给第一横排 一个低电平 其它横排为高电平
    {                 
     h1=0;
     h2=1;
     h3=1;
     h4=1;
    }
   if(aa==2)            //第二次中断时 给第二横排 一个低电平 其它横排为高电平
    {
     h1=1;
     h2=0;
     h3=1;
     h4=1;
    }
   if(aa==3)             //第三次中断时 给第三横排 一个低电平 其它横排为高电平
    {
     h1=1;
     h2=1;
     h3=0;
     h4=1;
     }
   if(aa==4)             //第四次中断时 给第四横排 一个低电平 其它横排为高电平
    {
     h1=1;
     h2=1;
     h3=1;
     h4=0;
     aa=0;                //aa清零 一边下一次中断来临时 从第一排开始
    }
}
void T1_timer() interrupt 1
{
  TH0=(65536-600)/256;
  TL0=(65536-600)%256;
   if(l1==0)                         //当中断连临时 检测第一竖列 有无低电平
     {                           //若有低电平 则继续判断 是哪一横排有低电平      
      if(h1==0)                     //从而确定是哪个按键
        {num=0;while(!l1);}
      if(h2==0)
        {num=4;while(!l1);}
      if(h3==0)
        {num=8;while(!l1);}
      if(h4==0)
        {num=12;while(!l1);}       //之后的3个if语句 都是跟第一句 同样的思路   
     }
   if(l2==0)
     {
      if(h1==0)
        {num=1;while(!l2);}
      if(h2==0)
        {num=5;while(!l2);}
      if(h3==0)
        {num=9;while(!l2);}
      if(h4==0)
        {num=13;while(!l2);}      
     }
   if(l3==0)
     {
      if(h1==0)
        {num=2;while(!l3);}
      if(h2==0)
        {num=6;while(!l3);}
      if(h3==0)
        {num=10;while(!l3);}
      if(h4==0)
        {num=14;while(!l3);}      
     }
   if(l4==0)
     {
      if(h1==0)
        {num=3;while(!l4);}
      if(h2==0)
        {num=7;while(!l4);}
      if(h3==0)
        {num=11;while(!l4);}
      if(h4==0)
        {num=15;while(!l4);}      
     }
}

来自小组: 电路分析设计

不用看,程序应该没有问题,问题再你没有好好看说明书。
矩阵键盘与下载usb接口共用IO
所以第一排按键不好使

果然是高手!我刚试了一下 还是这个程序 我把usb下在线 拔掉了之后再上电 果然问题没有了 呵呵 这个问题我折腾多半天了   不过我还有个小问题 想请教 : 出现这种问题 是因为我程序的问题吗 是不是换个方法写 就能避免呢 还是说所有的 有关键盘的程序 都得拔掉usb下载线 才能正常使用呢? 谢谢!

还有个问题 我的这个程序 在我按第四列的四个按键时 旁边的8个发光二极管中有几个 总是会亮起 可是我的程序里没有对P1口 操作什么啊..求解惑  呵呵(TX-1C板子上 8个发光二极管 是接在P1口上的)

    wela=1;
     P0=0x00;    //开启数码管的位选
     wela=0;
改为  
    wela=1;
     P0=0xc0;    //开启数码管的位选
     wela=0;
即解决LED灯亮的问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top