按键几乎也是每次蓝桥杯单片机设计与开发组竞赛的必考部分,因为这是CT107D开发平台上仅有的输入设备之一,而且按键也是单片机基础开发中常见的器件。
一、独立按键
1、原理分析
用跳帽把J5的引脚2和引脚3接起来,即可使用4个独立按键(如下图):S7,S6,S5,S4。按键的一端接到GND,另一端接到P3口的低四位,所以我们只要检测连接按键的P3口的某一位是否为低电平即可确定某一按键是否被按下。但是,因为存在抖动,所以需要进行消抖处理。总之,独立按键的按键检测基本流程为:检测是否有键按下,延时消抖,再次检测是否有键按下,执行按键按下后的相应操作,松手检测。
2、示例程序
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
//这里以S4为例
if(S4==0) //检测S4是否被按下
{
delay_ms(2); //延时消抖
if(S4==0) //再次检测S4是否被按下
{
//这里执行按键后需要执行的操作
}
while(S4==0); //松手检测
}
二、矩阵键盘
1、原理分析
用跳帽把J5的引脚1和引脚2接起来,即可使用矩阵键盘(如下图)。矩阵键盘的检测常常采用行列扫描法。先进行行扫描,给P3口赋值为0x0f,当有键按下时P3口低四位的某一位的高电平会拉低,通过检测P3口高低电平的变化即可确定是哪一行的按键被按下,然后再给P3口赋值为0xf0,同理,当有键按下时P3口的高四位的某一位的高电平会被拉低,通过检测P3口的电平变化即可确定是哪一列的按键被按下,由行列交叉可以确定唯一的一个按键。
2、示例程序
先确定行来得到键值的临时值,待确定列后将键值的临时值加上列值得到最终的键值。当然,这里的按键编号可以进行合理的自定义,不需要和以下程序完全一样。
#include #define uchar unsigned char #define uint unsigned int #define temp P3 uchar key_value = 0; void keyscan() //按键扫描函数 { temp = 0x0f; if(temp!=0x0f) //扫描行 { delay_ms(10); //延时消抖 switch(temp) { case 0x0e: key_value = 0; break; case 0x0d: key_value = 4; break; case 0x0b: key_value = 8; break; case 0x07: key_value = 12; break; } temp = 0xf0; //扫描列 if(temp == 0x70) key_value + = 0; while(temp == 0x70); //松手检测 if(temp == 0xb0) key_value + = 1; while(temp == 0xb0); //松手检测 if(temp == 0xd0) key_value + = 2; while(temp == 0x0d); //松手检测 if(temp == 0xe0) key_value + = 3; while(temp == 0x0e); //松手检测 } } 因为CT107D单片机开发平台采用IAP15F2K61S2单片机,使用的是转接板,由转接板原理图知矩阵键盘接的是P3口的低6位与P4.2、P4.4口,即用P4.2代替了P3.6,P4.4代替了P3.7,所以需要修改部分代码。 #include #define uchar unsigned char #define uint unsigned int #define temp P3 sfr P4 = 0xc0; sbit P44 = P4^4; sbit P42 = P4^2; uchar key_value = 0; void keyscan() //按键扫描函数 { temp = 0x0f; P42 = 0; P44 = 0; if(temp!=0x0f) //扫描行 { delay_ms(10); //延时消抖 switch(temp) { case 0x0e: key_value = 0; break; case 0x0d: key_value = 4; break; case 0x0b: key_value = 8; break; case 0x07: key_value = 12; break; } temp = 0xf0; P42 = 1; P44 = 1; //扫描列 if(P44 == 0) key_value + = 0; while(P44 == 0); //松手检测 if(P42 == 0) key_value + = 1; while(P42 == 0); //松手检测 if(temp == 0xd0) key_value + = 2; while(temp == 0x0d); //松手检测 if(temp == 0xe0) key_value + = 3; while(temp == 0x0e); //松手检测 } }
上一篇:蓝桥杯单片机设计与开发笔记(二)
下一篇:蓝桥杯单片机设计与开发笔记(三)
推荐阅读最新更新时间:2024-11-17 04:17
设计资源 培训 开发板 精华推荐
- LT3758、12V 输出非隔离式反激电源的典型应用电路
- NCP605 500mA、低 IGND、CMOS LDO 稳压器的典型应用,带/不带使能和针对固定版本的增强型 ESD 保护(1.5 V、1.8 V、2.5 V、2.8 V、3.0 V、3.3 V、5.0 V)
- 【智能小车】物联网FPGA边缘加速图传远程潜伏小车
- 具有手动复位按钮的 LTC1727ES8-5 三路电源监视器的典型应用
- 使用 NXP Semiconductors 的 MC40XS6500EK 的参考设计
- ESP_Gateway
- 具有 400mA 突发模式操作、2.25MHz 同步降压型稳压器的 LTC3621EMS8E-2 5Vout 的典型应用
- 使用 ON Semiconductor 的 NCP1523B 的参考设计
- EVAL-ADE7878AEBZ,ADE7878A电能计量IC评估板
- RP550K001A 1A PWM/VFM 双路降压 DC/DC 转换器的典型应用,带同步整流器
- 3.5\"嵌入式主板给力开团 仅售599元包邮!
- 下载喽:PCIe要了解的10件事和识别协议的BSX系列BERTScope误码率测试仪技术资料
- TI Sensor Menu 助力感应全世界——下载有礼!
- 下载有礼:2017年泰克亚太专家大讲堂第四期: 如何应对新型半导体材料表征测试挑战
- [直播预报名] TI 最新蓝牙技术培训,2017 震撼首发!
- 【摸黑抢楼】赢大礼,关于示波器的狂想曲!正式开抢!!!
- 围观Vishay新出炉超低ESR T55系列“萌宠们”,有惊喜!
- 乐鑫ESP32-Korvo音频开发板免费测评试用
- 下载信息娱乐系统精品文章,赢【米家台灯、小米保温杯、米家蓝牙温湿计】,开启MPS汽车技术进阶之旅!