完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

|
本帖最后由 hkxiaoma 于 2015-6-16 10:18 编辑
废话不多说 直接上程序 希望大家积极分享自己的写法 用51举例 向下看 楼下还有的哦
|
|
|
相关推荐
|
|
|
|
|
|
|
|
|
|
|
本帖最后由 hkxiaoma 于 2015-5-20 13:03 编辑
|
|
|
|
|
|
|
|
|
楼主你的第二个思路挺像手把手教程里面的按键程序
#include ***it KEY_IN_1 = P2^4; ***it KEY_IN_2 = P2^5; ***it KEY_IN_3 = P2^6; ***it KEY_IN_4 = P2^7; ***it KEY_OUT_1 = P2^3; ***it KEY_OUT_2 = P2^2; ***it KEY_OUT_3 = P2^1; ***it KEY_OUT_4 = P2^0; unsigned char code KeyCodeMap[4][4] = { //矩阵按键编号到标准键盘键码的映射表 { '1', '2', '3', 0x26 }, //数字键1、数字键2、数字键3、向上键 { '4', '5', '6', 0x25 }, //数字键4、数字键5、数字键6、向左键 { '7', '8', '9', 0x28 }, //数字键7、数字键8、数字键9、向下键 { '0', 0x1B, 0x0D, 0x27 } //数字键0、ESC键、 回车键、 向右键 }; unsigned char pdata KeySta[4][4] = { //全部矩阵按键的当前状态 {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1} }; extern void KeyAction(unsigned char keycode); /* 按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用 */ void KeyDriver() { unsigned char i, j; static unsigned char pdata backup[4][4] = { //按键值备份,保存前一次的值 {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1} }; for (i=0; i<4; i++) //循环检测4*4的矩阵按键 { for (j=0; j<4; j++) { if (backup[i][j] != KeySta[i][j]) //检测按键动作 { if (backup[i][j] != 0) //按键按下时执行动作 { KeyAction(KeyCodeMap[i][j]); //调用按键动作函数 } backup[i][j] = KeySta[i][j]; //刷新前一次的备份值 } } } } /* 按键扫描函数,需在定时中断中调用,推荐调用间隔1ms */ void KeyScan() { unsigned char i; static unsigned char keyout = 0; //矩阵按键扫描输出索引 static unsigned char keybuf[4][4] = { //矩阵按键扫描缓冲区 {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF} }; //将一行的4个按键值移入缓冲区 keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1; keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2; keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3; keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4; //消抖后更新按键状态 for (i=0; i<4; i++) //每行4个按键,所以循环4次 { if ((keybuf[keyout][i] & 0x0F) == 0x00) { //连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下 KeySta[keyout][i] = 0; } else if ((keybuf[keyout][i] & 0x0F) == 0x0F) { //连续4次扫描值为1,即4*4ms内都是弹起状态时,可认为按键已稳定的弹起 KeySta[keyout][i] = 1; } } //执行下一次的扫描输出 keyout++; //输出索引递增 keyout &= 0x03; //索引值加到4即归零 switch (keyout) //根据索引,释放当前输出引脚,拉低下次的输出引脚 { case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; } } |
|
|
|
|
|
|
|
|
没看到有连按的,手写一个
//按住不动时,参数每10ms +1 uchar f;//设置参数 uchar key; while(PINA&0X01) { f++; _delay_ms(10); } |
|
|
|
|
|
|
|
|
感觉乱七八槽的,用状态机实现不是更好!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16899 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:00 , Processed in 1.388157 second(s), Total 108, Slave 88 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖