长短摁键
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
长短摁键2011年11月16日
修改历史
1.创建修改时间:2011年11月16日
2.漆彦清添加流程图修改时间:2011年12月7日
长短摁键
1.前言
经过独立摁键(一)的学习和操作,相信你已经学会了简单的摁键操作。
想不想更进一步学习和利用摁键呢?现在我们一起来看看,怎么样让摁键有长短。
2.长短摁键原理
所谓长短摁键,就是单片机能通过你摁键时间的长短知道你摁的是长键还是短键。
举个例子吧~比如手机上的关机键,你可以用它来挂电话、回桌面甚至关机,那么这个普通的摁键,是如何做到这一点的呢?其实,就是通过对长短摁键的控制,来满足你不同的需求的。
长短摁键的关键,其实就在长短的界定与扫描。
长短有相对。
首先你得设定一个时间。
假设你设定个时间为1s,那么,你可以让单片机去扫描摁键。
如果发现摁键摁下时间长于或等于1s的,即判断其为长摁键;时间短于1s的则判断其为短摁键。
这样一来,就可以只用一个摁键,而去实现不同的功能了。
3.摁键抖动与消抖
我们实现长短摁键的时候,仍然要对其进行消抖,这里就不再赘述了。
详情可以参见独立摁键(一)。
4.关键代码
#include <reg52.h> //输入输出头文件
#define uchar unsigned char //把已有的类型换名,定义成方便自#define uint unsigned int //己使用的类型名,便与记忆与使用
sbit Key_S5=P3^4; //为端口P3_4改名为Key_S5
sbit Led_R=P1^0; //为端口P1_0改名为Led_R,表示红灯sbit Led_G=P1^1; //为端口P1_1改名为Led_G,表示绿灯 //sbit为位定义关键字,用来定义端口中的某一位
void delay_50us(uint t)
//这是在晶振为11.0592HZ情况下的延时50us倍数的函数。
{ //比如t=20,可以延时20*50us=1000us=1ms。
uchar j;
for(;t>0;t--) //参数t可以表示50us的倍数。
for(j=18;j>0;j--); //双层循环,达到延时50us倍数的目的。
}
void delay_50ms(unsigned int t)
//这是在晶振为11.0592HZ情况下的延时50ms倍数的函数。
{ //比如t=20,可以延时20*50ms=1000ms=1s。
unsigned int j;
for(;t>0;t--) //参数t可以表示50ms的倍数。
for(j=5706;j>0;j--); //双层循环,达到延时50us倍数的目的。
}
void main()
{
while(1) //while(1)是嵌入式中特有的操作{ //我们不能让嵌入式处理器空闲不工作
//所以需要让他一直循环执行大括号中操作P3=0xff; //P3端口初始化为1
if(Key_S5==0)
//检测是否有摁键摁下,Key_S5==0表示有摁键摁下
{
delay_50us(100);
//摁键的时候容易产生抖动,延时5ms用于消抖
if(Key_S5==0) //消抖后再次检测是否有摁键摁下
{
Led_G=0;
//在发现有键摁下的时候,首先视其为短摁键,绿灯亮
delay_50ms(10);
//进行延时0.5s,方便后面判断其是否为长摁键
/****************长摁键的代码*************************/
if(Key_S5==0) //如果仍然检测到键摁下,则为长摁键{
L ed_R=0; //发现是长摁键摁下,则亮红灯示意
Led_G=1; //同时灭绿灯
delay_50ms(10); //让红灯持续亮0.5s
while(!Key_S5); //如果松手,则退出摁键扫描 }
if(Key_S5==1) //进行松手扫描,判断是否真的松手
{
delay_50us(100); //进行短暂的延时
if(Key_S5==1)
{
Led_R=1; //确定已经松手,则关闭红灯
}
}
/******************************************************/
while(!Key_S5);
//短摁键下,如果松手,则退出摁键扫描
}
if(Key_S5==1) //进行松手扫描,判断是否真的松手
{
delay_50us(100); //进行短暂的延时
if(Key_S5==1)
{
L ed_G=1; //确定已经松手,则关闭绿灯 }
}
}
}
}
5.流程图
6.总结
学会了长短摁键,我们可以用它来做些什么呢?其实生活中有很多长短摁键的实例呢!比如开始说的手机,还有闹钟,还有很多控制类的开关等。
小小一个摁键,还可以做什么用途呢?发挥你的智慧,去想一想,做一做吧~。