|
楼主
查看: 7774回复: 1
发表于 2021-4-15 20:11:32
只看该作者
本帖最后由 陈思潼 于 2021-4-15 20:18 编辑
简要:
使用4*4矩阵键盘,通过定时器1ms中断控制键盘扫描,通过串口发送按下键盘的数据
一、硬件图片
二、电路图/引脚连接
KeyIn1->P6.0 KeyOut1->P6.4
KeyIn2->P6.1 KeyOut2->P7.0
KeyIn3->P6.2 KeyOut3->P3.6
KeyIn4->P6.3 KeyOut4->P3.5
P3.3 UART-TX引脚 连接到板载调试器处的TXD靠调试器一侧
三、代码简述- /* 按键扫描函数,需在定时中断中调用,推荐调用间隔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_H(); KEY_OUT_1_L(); break;
- case 1: KEY_OUT_1_H(); KEY_OUT_2_L(); break;
- case 2: KEY_OUT_2_H(); KEY_OUT_3_L(); break;
- case 3: KEY_OUT_3_H(); KEY_OUT_4_L(); break;
- default: break;
- }
- }
复制代码
代码较多,此处仅贴关键代码。从注释可以看出,每次进入中断,执行按键扫描时,仅扫描一行,每行需要重复4次。当4次都是按下状态时,将KeySta数组对应位置置1。
fistMSPProjTest.zip
(69.38 KB, 下载次数: 48)
碎碎念吐槽:上传附件竟然只要.zip,不能7z
|
|