完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
花了一个星期写出来的,四个按键的独立键盘扫描程序。可以区别长击和短击,同时采用计数方式来消抖。按下键一定时间内,松手后返回对应值;按下键超过一定时间,返回对应值。短击的返回值是在松手后才产生,长击则是超过时间就产生,长击松手后不会返回短击的值。
u8 Key_Scan(void) { u8 key_ret = 0; static u8 key_num = 0,del_count,tim_count; static bit key_flag = 0; if((!SET)||(!KUP)||(!KDN)||(!KOK)){/*判断是否有键按下*/ if(++del_count==5){/*计数消抖*/ del_count = 0; if(++tim_count>4){/*长按识别*/ key_flag = 0;/*短按无效*/ tim_count = 4;/*锁定长按*/ switch(key_num){ case 1:key_ret = 5;break; case 2:key_ret = 6;break; case 3:key_ret = 7;break; case 4:key_ret = 8;break; } } else{/*短按有效*/ key_flag = 1;/*短按标志位*/ if(!SET)key_num = 1;/*一下用于识别按键*/ if(!KUP)key_num = 2; if(!KDN)key_num = 3; if(!KOK)key_num = 4; } } }else{/*松手之后*/ tim_count = 0; if(key_flag){/*松手*/ key_flag = 0; switch(key_num){ case 1:key_ret = 1;break; case 2:key_ret = 2;break; case 3:key_ret = 3;break; case 4:key_ret = 4;break; } } } return key_ret; } 不过感觉程序还有地方可以改进。贴出来跟大家一起讨论。 |
|
相关推荐
10个回答
|
|
谢谢分享
|
|
|
|
原子哥,指点一下啊
|
|
|
|
不错不错,收藏了
|
|
|
|
早就在做这个实验了,就是总出问题,用楼主的试试哈,
|
|
|
|
用实验板的例程就可以改了哈,我就调试成功了4*3(也就是手机键盘),带松手检测,带滑动检测等。。
|
|
|
|
楼主好厉害
|
|
|
|
回去测试一下看看
|
|
|
|
嗯,看起来不错,有没有写过矩形键盘的呢,我谢了个2行5个按键的键盘,还望赐教;
另外问一下松手检测是什么意思,是松手后再执行函数吗? #include ***it led_1 = P2^0;***it led_2 = P2^1;***it led_0 = P2^2; ***it line1 = P3^3;***it line2 = P3^4; uchar table_key[2][3]={{0xF6,0xF5,0xF3},{0xEE,0xED}};//按键码 void keyscan(void){#define f_longkey 30000 uchar i=0;uint key_time=0;//=================Line1=======================================line2 = 1;line1 = 0;for(i=0;i<3;i++){if((P3 |table_key[0])==table_key[0]){delayms(10);if((P3 |table_key[0])==table_key[0]) {while(((P3 |table_key[0])==table_key[0]) && (++key_time }}}//===============line2===================================================== line2 = 0;line1 = 1;key_time = 0; for(i=0;i<2;i++){ if((P3 |table_key[1])==table_key[1]){delayms(10);if((P3 |table_key[1])==table_key[1]){while(((P3 |table_key[1])==table_key[1]) && (++key_time } void main(){init_delay();while(1){keyscan();} } |
|
|
|
留个记号,明天白天测试一下,正需要这个程序
|
|
|
|
你这个是要按钮抬起后才能退出程序吧?那样的话效率会不会太低了,别的啥都干不了了
|
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2954 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4046 浏览 18 评论
1097浏览 3评论
567浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
564浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2299浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1855浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 00:35 , Processed in 1.224307 second(s), Total 98, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号