完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
13个回答
|
|
按下后,你可以直接加一就可以计算了,还是我理解错了呢
|
|
|
|
不是吧,加一之后,键盘扫描是持续的,我按一下,key的键值就一直是一,即使我不按键,它还会一直加一,没法计算,当我不按不同的按键时,键号是不变的,就计算不出来同一个按键被连续按了几次; while(key==1) { i++; } |
|
|
|
不明白后面你想说明什么,好像没描述清楚呢
|
|
|
|
键盘扫描是持续的,可是你的处理按键的程序是唯一的,每次不同的按键按下,你总有一个处理的地方吧!不可以一直会跳进那个地方呀!所以,你只需在那个处理的地方加一就行了,或许我还是没有明白你想要表达的意思 |
|
|
|
每次都安相同的按键呢?以下是键盘扫描函数
uchar scan_key() { uchar hang,lie; P2=0X0F; if(P2!=0X0F) delayms(10); if(P2!=0X0F) { switch(P2&0X0F) { case 0x0e:hang=0;break; case 0x0d:hang=1;break; case 0x0b:hang=2;break; case 0x07:hang=3;break; } P2=0XF0; switch(P2&0XF0) { case 0xe0:lie=0;break; case 0xd0:lie=1;break; case 0xb0:lie=2;break; case 0x70:lie=3;break; } P2=0X0F; while(P2!=0X0F); key=hang*4+lie; } return(key); } 每次扫描完都有一个键值号,比如按下一键。则key一直就是1,在没按其它键的的时候,键值号不变,我如果连续按一键,就是一直按相同的键,键值号就一直是1,那我怎么计算出这同一个键被按了多少次?谢谢你持续的回答! |
|
|
|
uchar scan_key() { uchar hang,lie; P2=0X0F; if(P2!=0X0F) delayms(10); if(P2!=0X0F) { switch(P2&0X0F) { case 0x0e:hang=0;break; case 0x0d:hang=1;break; case 0x0b:hang=2;break; case 0x07:hang=3;break; } P2=0XF0; switch(P2&0XF0) { case 0xe0:lie=0;break; case 0xd0:lie=1;break; case 0xb0:lie=2;break; case 0x70:lie=3;break; } P2=0X0F; while(P2!=0X0F); key=hang*4+lie; } return(key); } 就这样一个矩阵键盘扫描函数,怎么编一个函数判断同一个按键被连续按了多少次 |
|
|
|
不是可以定义变量来计数吗?
如果不支持连按,或者你可以等按键释放以后才加1,这样的实现不难吧…… 另外,真不喜欢这样的按键扫描程序。随便百度搜下按键扫描程序就出来了,不是这样的用delay()。 |
|
|
|
是那种按一下就又弹起来的按键,这个程序是用来判断键号值的,十个按键依次对应0到9 ,你写的“不是这样的用delay()”是什么意思? |
|
|
|
本帖最后由 bj2008wyou 于 2014-5-4 21:34 编辑
平时的按键大多数也是你说的按一下松开就会弹起来啊。你可以在被按下的时候不触发,只有松开的时候才触发按键,这是就可以计数+1,同一个键按多少次就是会加多少啊,你只需要定义好一个时间间隔阈值,明确要按多快才会加1,又在超过多久后计数会清零, 贴个供参考,但注意,该程序是人家的,你可以搜索MS3看,摘自里面,但有经过小部分修改,这只为说明不用delay()的。 对于一些有按下处理和释放处理的按键扫描程序,本程序可能不太适用 void KeyScan(void) { static INT16U keyCounter = 0u; static INT08U keyOldVal = KEY_NONE; static bool isLongKeyPress = FALSE; INT08U keyNewVal; keyNewVal = KeyRead(); if (keyNewVal == KEY_NONE) { if (keyCounter == KEY_LONG_TIME) { isLongKeyPress = FALSE; } else if (keyCounter >= KEY_SHORT_TIME) { keyActionVal = KeyMap(SHORT_KEY_MODE, keyOldVal); } keyCounter = 0u; keyOldVal = keyNewVal; } else { keyCounter++; if (keyCounter <= KEY_DEBOUNCE_TIME) { if (keyOldVal != keyNewVal) { keyOldVal = keyNewVal; keyCounter = 0u; } } else if (keyCounter >= KEY_LONG_TIME) { keyCounter = KEY_LONG_TIME; if (isLongKeyPress == FALSE) { isLongKeyPress = TRUE; keyActionVal = KeyMap(LONG_KEY_MODE, keyOldVal); } } } } |
|
|
|
呵呵楼主的键盘扫描是通过先读行值在读列值 然后在通过算法返回键值的!!至于如何判断按键被按了几次容我再想想!
|
|
|
|
这样吧 麻烦点
unsigned cha A[9]={};//定义一个全局变量记录KEY被按的次数 这里加这个 while(P2!=0X0F); key=hang*4+lie; SWITCH(KEY) { CASE 1://判断KEY值 A[0]=A[0]+1; break; '''''''' '''''''' //写9个 } //要知道哪个键被按了多少次 读数组A[]的元素 |
|
|
|
谢谢你的持续回答,我的前提是要计算出键值号的,函数是有返回值的 |
|
|
|
谢谢,我再研究一下 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12010 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 18:22 , Processed in 0.826105 second(s), Total 97, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号