用实验板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灯亮的问题