完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
请教下矩阵键盘程序加了去抖程序哪里错误。
个人用的反转法,发现不加去抖程序的时候运行正常。加了去抖反而检测不出按键了,求教。 程序如下,“//”后面的内容加了为去抖的。 uchar scan() { // P1=0xf0; // temp=P1; // if(temp!=0xf0) // { // delay(5); // temp=P1; // if(temp!=0xf0) // { P1=0xf0; delay(5); temp=P1&0xF0; temp=~((temp>>4)|0xf0); switch(temp) { case 8:key=1;break; case 4:key=2;break; case 2:key=3;break; case 1:key=4;break; default:key=17; } P1=0x0f; //低四位输入 delay(5); temp=P1&0x0f; temp=~(temp|0xF0); switch(temp) { case 8:key=key+0;break; case 4:key=key+4;break; case 2:key=key+8;break; case 1:key=key+12;break; default:key=17; } // }} return key; } |
|
相关推荐
9个回答
|
|
这个不太懂……
|
|
|
|
继续求解..~~~~~~
|
|
|
|
本帖最后由 olive2003 于 2014-5-20 23:06 编辑
今天试了下在scan()前独立出一个keydown()检测程序,只要一加,就又不行了。 还是把整个程序贴出来吧(LED灯的目的我只是用来检测按键1~8) #include #define uchar unsigned char #define uint unsigned int uchar temp,key; uchar scan(); void delay(uint c) { uint x,y; for(x=0;x } void keydown() { P1=0xf0; temp=P1; if(temp!=0xf0) { delay(5); temp=P1; if(temp!=0xf0) key=scan(); } } uchar scan() { // P1=0xf0; // temp=P1; // if(temp!=0xf0) // { // delay(5); // temp=P1; // if(temp!=0xf0) // { P1=0xf0; delay(5); temp=P1&0xF0; temp=~((temp>>4)|0xf0); switch(temp) { case 8:key=1;break; case 4:key=2;break; case 2:key=3;break; case 1:key=4;break; default:key=17; } P1=0x0f; //低四位输入 delay(5); temp=P1&0x0f; temp=~(temp|0xF0); switch(temp) { case 8:key=key+0;break; case 4:key=key+4;break; case 2:key=key+8;break; case 1:key=key+12;break; default:key=17; } // }} return key; } void main() { keydown(); //这里如果我换成key=scan();,即跳过keydown直接scan就没问题 switch(key) { // case 0: // P2=0xee; // delay(2000); // P2=0xff; // break; case 1: P2=0xfe; delay(2000); P2=0xff; break; case 2: P21=0; delay(2000); P21=1; break; case 3: P22=0; delay(2000); P22=1; break; case 4: P23=0; delay(2000); P23=1; break; case 5: P24=0; delay(2000); P24=1; break; case 6: P25=0; delay(2000); P25=1; break; case 7: P26=0; delay(2000); P26=1; break; case 8: P27=0; delay(2000); P27=1; break; default: P2=0x00; break; } } |
|
|
|
你直接用扫描法吧,那个简单点吧:
具体是 令一行为0; 检测一列是否为0; 若是; 则延时抖动; 在检测这列是0不; 再写按键中要执行的程序; 最后让行变1,就可以了,参考下思路吧 |
|
|
|
请教下矩阵键盘程序加了去抖程序哪里错误。
个人用的反转法,发现不加去抖程序的时候运行正常。加了去抖反而检测不出按键了,求教。 程序如下,“//”后面的内容加了为去抖的。 uchar scan() { P1=0xf0; //P1输出0xf0 temp=P1; //读出P1端口的值赋给变量temp if(temp!=0xf0) //如果有按键按下 { delay(5); //延时 temp=P1; //再次读取P1的值 if(temp!=0xf0) //确实有按键按下 { // P1=0xf0; //问题应该出在这里,将这条语句去掉。把0xf0赋给p1后, delay(5); temp=P1&0xF0; //P1&0xf0永远等于0xf0 temp=~((temp>>4)|0xf0); //~((temp>>4)|0xf0)永远等于0x00 switch(temp) { case 8:key=1;break; case 4:key=2;break; case 2:key=3;break; case 1:key=4;break; default:key=17; } P1=0x0f; //低四位输入 delay(5); temp=P1&0x0f; temp=~(temp|0xF0); switch(temp) { case 8:key=key+0;break; case 4:key=key+4;break; case 2:key=key+8;break; case 1:key=key+12;break; default:key=17; } // }} return key; } |
|
|
|
uchar scan()
{ P1=0xf0; //P1输出0xf0 temp=P1; //读出P1端口的值赋给变量temp if(temp!=0xf0) //如果有按键按下 { delay(5); //延时 temp=P1; //再次读取P1的值 if(temp!=0xf0) //确实有按键按下 { // P1=0xf0; //问题应该出在这里,将这条语句去掉。把0xf0赋给p1后, delay(5); temp=P1&0xF0; //P1&0xf0永远等于0xf0 temp=~((temp>>4)|0xf0); //~((temp>>4)|0xf0)永远等于0x00,后面的自己分析吧 switch(temp) { case 8:key=1;break; case 4:key=2;break; case 2:key=3;break; case 1:key=4;break; default:key=17; } P1=0x0f; //低四位输入 delay(5); temp=P1&0x0f; temp=~(temp|0xF0); switch(temp) { case 8:key=key+0;break; case 4:key=key+4;break; case 2:key=key+8;break; case 1:key=key+12;break; default:key=17; } // }} return key; } |
|
|
|
{:1:}{:1:}{:1:}{:1:}
|
|
|
|
嗯,我最先接触的是扫描法,不过觉得程序太长了。就试着换成这种了。 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
277 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
368 浏览 0 评论
766 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
592 浏览 0 评论
879 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12035 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 00:58 , Processed in 0.668072 second(s), Total 57, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号