完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
unsigned char funIndex = 0;
KEY_TABLE table[9] = { {0, 0, 1, 0, 2, (*menu11)}, {1, 0, 1, 1, 4, (*menu12)}, {2, 2, 3, 0, 5, (*menu21)}, {3, 2, 3, 0, 7, (*menu22)}, {4, 4, 4, 1, 4, (*menu23)}, {5, 5, 6, 2, 5, (*menu31)}, {6, 5, 6, 2, 6, (*menu32)}, {7, 7, 8, 3, 7, (*menu33)}, {8, 7, 8, 3, 8, (*menu34)}, }; unsigned char keyScan(void) { static unsigned char keyUp = 1; valueX = analogRead(pinX); valueY = analogRead(pinY); if (keyUp && ((valueX <= 10) || (valueX >= 1010) || (valueY <= 10) || (valueY >= 1010))) { delay(10); keyUp = 0; if (valueX <= 10)return 1; else if (valueX >= 1010)return 2; else if (valueY <= 10)return 3; else if (valueY >= 1010)return 4; } else if ((valueX > 10) && (valueX < 1010) && (valueY > 10) && (valueY < 1010))keyUp = 1; return 0; } void loop() { keyValue = keyScan(); if (keyValue != 0) //每发生一次有效按键就根据按键功能获取对应函数并执行 { switch (keyValue)//获取按键对应序号 { case 1: funIndex = table[funIndex].right; break; case 2: funIndex = table[funIndex].left; break; case 3: funIndex = table[funIndex].down; break; case 4: funIndex = table[funIndex].up; break; } current = table[funIndex].operation;//根据需要获取对应需要执行的函数 (*current)();//执行获取到的函数 } } 以上是截取的部分代码内容,也是我当初看不明白的地方。上下左右4个键,返回的键值keyValue也是1-4,但是funIndex的值是从0-8,怎么匹配的上呢。 现在解释一下,首先funIndex的初始值是0,假设说现在按下的是右键得到的是2,显示的是menu21这个界面 在这个新界面再次按下右键,funIndex就是5,显示的是menu31这个界面 现在回想起来还是没有静下心来看代码,我觉得这个代码写的很“高级”,决心一定要搞懂,如果有朋友碰到同样的困惑可以看看。感谢原博主的文章写的很好。 今天我实际测试了一下代码,发现了一些问题,比如上键和左键有效,下键和右键没有响应。检查发现用我的摇杆来控制时,analogRead得到的最大值是978,是无法超过1010的,所以需要修改原代码里面的值。 KEY_TABLE table[9] = { {0, 0, 1, 0, 2, (*menu11)}, {1, 0, 1, 1, 4, (*menu12)}, {2, 2, 3, 0, 5, (*menu21)}, {3, 2, 3, 0, 7, (*menu22)}, {4, 4, 4, 1, 4, (*menu23)}, {5, 5, 6, 2, 5, (*menu31)}, {6, 5, 6, 2, 6, (*menu32)}, {7, 7, 8, 3, 7, (*menu33)}, {8, 7, 8, 3, 8, (*menu34)}, }; 以上代码可以精简为: KEY_TABLE table[9] = { {0, 0, 1, 0, 2, menu11}, {1, 0, 1, 1, 4, menu12}, {2, 2, 3, 0, 5, menu21}, {3, 2, 3, 0, 7, menu22}, {4, 4, 4, 1, 4, menu23}, {5, 5, 6, 2, 5, menu31}, {6, 5, 6, 2, 6, menu32}, {7, 7, 8, 3, 7, menu33}, {8, 7, 8, 3, 8, menu34}, }; 这两行代码可以精简为: table[funIndex].operation(); |
|
|
|
只有小组成员才能发言,加入小组>>
3254 浏览 9 评论
2937 浏览 16 评论
3439 浏览 1 评论
8941 浏览 16 评论
4030 浏览 18 评论
1068浏览 3评论
555浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
549浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2284浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1842浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 01:50 , Processed in 0.619545 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号