关于单片机矩阵键盘扫描的问题

偶做人间客 2018-12-17 06:24:06
我想实现led灯循环点亮,每个亮一秒,当按下矩阵键盘中任意一个按键,led灯熄灭,在按任意一个键,恢复循环,要求用查询法,我这个程序下到板子上按键识别并不灵敏,按键按下去有时有用有时没用,我想问一下能怎么改,是程序的问题还是其他问题?

#include<reg51.h>
char led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
char key_scan[]={0xef,0xdf,0xbf,0x7f};
char s=0;
char t=0;
char cnt=0;

void delay(unsigned int a)
{unsigned int j=0;
for(;a>0;a--)
for(j=0;j<100;j++);
}


void initial()
{TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{t=0;s++;}
}


void getkey()
{
char i=0;
for(;i<4;i++)
{
P3=key_scan[i];
if((P3&0x0f)!=0x0f)
{ delay(20);
if((P3&0x0f)!=0x0f)
{ delay(20);
if((P3&0x0f)==0x0f)
{cnt++; TR0=~TR0;}
}
}
}
}

main()
{ initial();
while(1)
{
getkey();
if(cnt%2==0)
P1=led[s%8];
else
P1=0xff;
}
}

...全文
105 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
偶做人间客 2018-12-17
  • 打赏
  • 举报
回复
void getkey()
{
char i=0;
for(;i<4;i++)
{
P3=key_scan[i];
if((P3&0x0f)!=0x0f)
{delay(10);
if((P3&0x0f)!=0x0f)
{while(1)
{if((P3&0x0f)==0x0f)
{cnt++; TR0=~TR0;break;}
}
}
}
}
}

改完了,总算可以了。
偶做人间客 2018-12-17
  • 打赏
  • 举报
回复
不对,好像 按键判断函数是有问题,超过40ms的确会有问题,我先改改
偶做人间客 2018-12-17
  • 打赏
  • 举报
回复
消抖延时可能长了一点,但是改成10ms延时之后,按键还是有时候按下去状态不改变,而且我上面那个按键判断函数是只要大于20ms松开就算按下一次了,逻辑上应该没错吧。。。
dceacho 2018-12-17
  • 打赏
  • 举报
回复
你这样写肯定有问题啊 假设你一个delay(1)是1ms 按住10ms放开没效 按住25ms放开有效 按住45ms放开没效 这键盘对人的要求太高了,必须大于20ms小于40ms,没几个人能把时间控制的这么好

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧