自写单片机按键松手检测思路

发布者:vettykatty最新更新时间:2015-02-11 来源: diangon关键字:单片机  按键松手  检测思路 手机看文章 扫描二维码
随时随地手机看文章

一直以来,单片机松手检测用的都是while(key==0);  这样,不但浪费CPU 资源,还。。。所以,用松手检测 是非常好的,很时髦的。
下面是我晚上做了个小车总结出来的,可以单独的按键,不影响其他按键,几通道都可以。 贴上程序,最后分析整个程序意思。。
 /*----------------------------------------------------------------
 * 文 件 名:KEY.C
 * 芯    片:STC12C5A60S2
 * 晶    振:11.0592MHz
 * 创 建 者:小强
 * 创建日期:2012.3.23
 * 修 改 者:
 * 修改日期:
 * 联系作者:lyg407@126.com   QQ:5163-806-35
 * 功能描述:按键扫描
-------------------------------------------------------------*/
//按键扫描
uchar key_scan()
{
 //前进后退左转右转 按键
 if(key_up&&(key1==0||key2==0||key3==0||key4==0))   //第一次 key_up=1 那么如果其它按键有按下,则为真 执行下面程序
 {
  delay_10ms();         //延时去抖
  if(key_up&&(key1==0||key2==0||key3==0||key4==0))   //再次判断
  {
   key_up=0;  //松手标志为0 那么下次在检测, if 结果就为0 则不会则行这里语句
 
   key_down=1;  //按键被按下标志。    最后如果 按键松手 那么还应该发送一个数据过去,执行关闭
 
   if(key1==0)  //如果按键1 按下
    return 1;
   if(key2==0)
    return 2;
   if(key3==0)
    return 3;
   if(key4==0)
    return 4;
  } 
 }
 else
 if(key1==1&&key2==1&&key3==1&&key4==1)   //如果所有按键都没有按下。。注意 所有按键都没按下
 {
  key_up=1;  //必须所有按键 没有按下  松手标志 初始化
     if(key_down==1)   //这里判断 是否按键 按下过, 按下过 就发送一个数据过去, 关闭之前输出的。
  {
   key_down=0;   //初始化
   return 99;    //返回值  随意更改
  }
 }
 //第二个 独立按键
 if(flag2_up&&(key5==0))    //意思同上 
 {
  delay_10ms();     //延时去抖
  if(flag2_up&&(key5==0))    //在判断
  {
   flag2_up=0;
   flag2_down=1;   //意思同上
 
   if(key5==0)
   {
    return 5; 
   }
  }
 }
 else
 if(key5==1)
 {
  flag2_up=1;  //必须所有按键为1 没有按下  松手标志为1
     if(flag2_down==1)
  {
   flag2_down=0;
   return 95;
  }
 }
 //第3个独立 按键
 if(flag3_up&&(key6==0))     //意思同上
 {
  delay_10ms();
  if(flag3_up&&(key6==0))
  {
   flag3_up=0;
   flag3_down=1;   //意思同上
 
   if(key6==0)
   {
    return 6; 
   }
  }
 }
 else
 if(key6==1)
 {
  flag3_up=1;  //必须所有按键为1 没有按下  松手标志为1
     if(flag3_down==1)
  {
   flag3_down=0;  //意思同上
   return 96;
  }
 }
 return 0;
}
// 返回的按键 做的处理,执行什么功能。。串口输出数据
 key_num=key_scan();  //读取 按键扫描返回值
  switch(key_num) //判断
  {
   case 1:
   UART1_Send_Byte(0x11);  //前进
   break;
   case 2:
   UART1_Send_Byte(0x22);  //后退
   break;
   case 3:
   UART1_Send_Byte(0x33); //左转
   break;
   case 4:
   UART1_Send_Byte(0x44);  //右转
   break;
   case 5:
   UART1_Send_Byte(0x55);  //按键5  控制输出1
   break;
   case 6:
   UART1_Send_Byte(0x66);  //按键6  控制输出2
   break;
   case 95:
   UART1_Send_Byte(0x95);  //按键5  松手后 发送一个数据过去
   break;
   case 96:
   UART1_Send_Byte(0x96);  //按键6  松手后 发送一个数据过去
   break;
   case 99:
   UART1_Send_Byte(0x99);   // 小车 前进后退 左转 右转  按键松手后 发送一个停止信号   。。。
   break;
  }
//上面是整个发送部分,有按键扫描  判断 发送数据
 
//下面是接收解码部分
 
value=SBUF; //value等于串口接收的字节;
 
switch(value)  //判断接收到的数据
  {
   case 0x11:  //执行前进
   go();
   break;
   case 0x22: //执行后退
   back();
   break;
   case 0x33:  //执行左转函数
   left();
   break;
   case 0x44:  //执行右转函数
   right();
   break;
   case 0x99: //执行 停止 函数
   stop();
   break;
   case 0x55:  //输出 控制1  打开
   out1=0;
   break;
   case 0x95: // 控制1 关闭
   out1=1;
   break;
   case 0x66: //输出控制2 打开
   out2=0;
   break;
   case 0x96:  //控制2 关闭
   out2=1;
   break;
  }
  
 
OK, 下面整个程序意思分析: 遥控检测按键 是否有按键 按下,如果有按键按下,发送一个前进 0x11过去,接收机 接收到了11 执行前进函数。 那么此时 前进按键 一直按着 则后 左 右 按键 按不起作用,因为这几个共用一个按键按下标志, 但是 按键5 按键 6 是在单独一个松手检测程序里,所以,此时 按键5 按键6 随意触发的。 当前进 按键松手后, 松手down=1 则执行一次 返回99, 这个时候串口又发送一个 99  停止函数过去,小车停止。 。 不知道这样是不是有点繁琐,但是目前没有其它的好思路,解决这样的几个独立按键,按下,松手检测。 这样好处是,每次只发送一次数据过去,通讯不是那么频繁,响应能快一些。 这个就是整个思路,如果有什么问题可以提问哦~   ^_^    又忘记要早点睡觉了。。

关键字:单片机  按键松手  检测思路 引用地址:自写单片机按键松手检测思路

上一篇:基于单片机的直流电机转速测量设计
下一篇:机构复位(子程序)

推荐阅读最新更新时间:2024-03-16 13:53

第18节:加法运算的溢出
从业十年,教你单片机入门 第18讲: 我前面介绍的三种数据类型unsigned char ,unsigned int ,unsigned long,都是有最大范围限制的,它们最大范围分别是255,65535,4294967295,如果加法运算的结果超过了参与运算的变量本身,会出现什么结果,有什么规律,这就是本节要讲解的溢出问题。 (1)何谓溢出?比如以下例子: unsigned char a; a=0x8536; 分析: 因为a是unsigned char变量,位数是8位,也就是1个字节,而0x8536是16位,2个字节,这种情况下,把0x8536赋值给单字节变量a,变量a只能接收到最低位的一个字节0x36,而高位字节的0
[单片机]
基于SC95F8616单片机的中文菜单MP3点歌器 (2)
3. 按键识别 由于按键识别相应扫描的低电平,故将 P07 设置为输出低电平。 1 )按图 16 所示完成程序流程修改,并进行相应的配置修改。 图 16 程序流程 图 17 修改配置 2 )点击 “ 生成工程源代码 ” , 以生成工程代码,则其主程序如图 18 所示。 图 18 生成的主程序 3 )编译并下载程序后,依次按下 K1~K4 键,则输出结果如图 19 所示。 图 19 按键值输出 4.MP3 音频模块控制 MP3 音频模块是一款通过串行通讯进行控制的功能模块,它与按键相配合即可实现选择和控制的目的。 控制 MP3 的主要指令有:播放指令、停
[单片机]
基于SC95F8616<font color='red'>单片机</font>的中文菜单MP3点歌器 (2)
基于ISP下载的89S51单片机实验平台设计及应用
0 引言 单片机课程是电子电气类专业及机电类专业必修的专业课,该课程既要学习单片机的硬件结构知识,又要学习软件知识,往往使学生不知从何学起,感觉入门很困难。而目前多数职业学校学习课时较短,实验条件较差,实验工位也不足,学生动手的机会少,造成了学生对学科不感兴趣,难以取得好的教学效果。基于ISP下载的89S51单片机实验平台具有电路简单、价格低廉、适合学生自主动手制作,不需要复杂的外部设备,就能完成数十个基本实验,几乎覆盖了本课程中大部分实验内容。通过自制简单实用的实验平台进行实验,增加了学生动手实践的时间,解决了学习课时少及实验设备不足的难题,培养了学生自主学习、自主探索的意识,提高了学生独立分析问题及解决问题的能力,取得较好
[单片机]
基于ISP下载的89S51<font color='red'>单片机</font>实验平台设计及应用
单片机C环境下位操作的实现方法
  C语言既有高级语言的各种特点,又可对硬件进行操作,并对进行结构化程序设计,用C语言编写的程序较容易移植,它们可生成简洁可靠的目标代码,在代码效率和代码执行速度上完全可以和汇编媲美。采用C语言进行单片机编程是嵌入式程序设计的发展趋势。但是,在嵌入式控制等领域,经常需要控制某一个二进制位,然而除了Keil C51等C环境外,很多单片机C环境都没有扩充对位变量定义的关键字,甚至单片机本身的硬件上也没有对单个位操作的汇编指令,这使得已习惯MCS-51内核单片机Keil C51编程的用户都为其C环境不能对位变量进行位操作而烦恼。 1 用“读-修改-写”方法实现对单个位的位操作 ANSIC中,一般采用“读-修改-写”的方法实现单个
[单片机]
基于51单片机的数字秒表的设计
近年来随着科学技术的发展,单片机的应用正在不断走下面还深入。本文简单阐述了基于单片机的数字秒表的的设计。本设计的主要特点是计时精度达到0.01秒,是各种体育竞赛的必要设备之一。 本设计的数字秒表采用AT89S52单片机为主要器件,利用其定时器的原理,结合显示电路、LED数码管以及外部外部中断电路来设计计时器。将软硬件结合起来,使得系统能实现0~99.99秒的计时,计时精度位0.01秒。硬件系统利用proteus仿真,在仿真中就能观察到系统的实际运行情. 一 硬件设计 1、1 总体方案的设计 数字秒表具有显示直观、读取方便、精度高等优点,在计时中广泛应用。本设计中用单片机和数码管组成数字秒,
[单片机]
单片机定时器/计数器工作方式
 (1)工作方式0   C/T -定时 / 计数功能选择位。   C/T = 0 ,对片内机器周期进行计数,作定时器用;   C/T = 1 ,对片外从 T0 ( P3.4 )、 T1 ( P3.5 )引脚输入 的外部脉冲信号进行计数 , 作计数器用。   GATE -门控位。   GATE=0 ,允许软件控制位 TR0 或 TR1 启动定时器;   GATE=1 ,允许外中断引脚 INT0( 或 INT1) 为高电电平,且由软件使 TR0( 或 TR1) 置 1 时,才能启动定时器工作。   当 GATE=0 时,封锁或门输出恒为 1 ,使外部中断输入引脚 INT0 信号失效,同时又打开与门,由 TR0 控制定时器
[单片机]
<font color='red'>单片机</font>定时器/计数器工作方式
51单片机内部E2ROM
/*main.c源程序*/ #include reg52.h #include E2ROM.c #include key.c sfr WDT_CONTR = 0xE1;//定义STC单片机中新加入的看门狗寄存器 code uchar seven_seg = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//共阳数码管0--9(0时为有效断) code uchar scan_bit = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf}; //数码管位选 6 5 4 3 2 1 uchar
[单片机]
基于单片机的TM卡水表控制系统设计
  1 引言   随着社会科学技术的高速发展,资源短缺现象日益严重,尤其是与人类生存息息相关的水资源。随着我国信息产业的飞速发展,实现自来水收费管理的电子化、信息化及网络化已成为可能。水表系统的智能化可以大大提高供水管理部门的工作效率,节约费用,用以改善供水设施,提高居民饮用水质量。本文以一种智能卡式水表控制系统为研究对象,它结合了控制技术、计算机技术等多方面技术,是一种跨专业的电子信息化系统。   2 智能水表控制系统的总体结构   智能水表控制系统具体实现水表的自动计量水流量、读写TM卡、控制阀门、显示报警等功能。控制系统电路由低功耗单片机、流量计、E2PROM存储电路、TM卡读写电路、LCD显示控制电路、阀门控制检测电
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved