9201|3

2

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

按钮SW2长按3秒,单片机实现清零 [复制链接]

工作原理:单片机控制DC9V电机工作,电机通过减速箱后带动一个机械机构转动,挤压洗手液流出,每旋转一圈挤压一次洗手液,限位开关给系统输入一个信号,LED显示挤压洗手液的次数。SW4为电路板安装盒子前盖开关,当前盖闭合时,红灯亮2秒,红外光控间隙工作(比如工作1毫秒,停止499毫秒,一直这样循环工作)。当有东西挡住红外光控时,接收端接收到信号,绿灯亮,电机通电工作,行程开关计数。1、SW1可以用拨码开关,用来切换减速箱输出轴旋转圈数是1圈和2圈,旋转1圈限位开关输入一个信号。                                                                                                                       
2、SW2用来清零,长按3秒,显示器清零。                                                                                                                       
3、SW3:暂停工作。                                                                                                                       
4、SW4:用来检测按装电路板的盒子前盖是否打开,前盖打开触发SW4,停止工作,前盖合上时正常工作。                                                                                                                       
5、LED段码显示减速箱输出轴旋转的圈数,最多可以显示9999次,另外一个用来显示工作时行程开关的工作次数是1还是2.                                                                                                                       
6、显示灯一个红色一个绿色。工作时绿灯亮,电池没电的时候红灯闪烁(电压小于6V),红外光控一直工作时绿灯闪烁。                                                                                                                       
7、电位器用来调整红外感应距离。                                                                                                                       
        分配给我的是长按3秒按钮SW2实现单片机情侣功能,该怎么实现,谢谢大家帮忙

clip_image001.gif (293 Bytes, 下载次数: 27)

clip_image001.gif
此帖出自51单片机论坛

最新回复

说了那么多自己写个按键驱动不就得了. 这个是我的支持消抖和长按键给你参考: /********************************************************key.h***********************************/ extern uint8  Press_Key_ID;        //按键值 extern int8 Press_Key_Time;//持续按键时间 #define KEY_PORTX                P3                //按键io口 //键盘扫描码,此数值等于此按键按抬起时port口上的数值(抬起高电平,按下拉低) #define KEY_1 C_Bit7 #define KEY_2 C_Bit6 #define KEY_3 C_Bit5 #define KEY_4 C_Bit4 #define KEY_5 C_Bit3 #define KEY_6 C_Bit2 #define KEY_CODE        (KEY_1+KEY_2+KEY_3+KEY_4+KEY_5+KEY_6) //说明:以下定义的所指时间均以Key_Scan调用的时间间隔为单位 //按键去抖时间和长按键计时单位 此数值不能大于128 #define KEY_DEJITTER_TIME         100        //长按连发时间功能使用 #define PRESS_KEY_LONGTIME_MESSAGE        //如果不用注释掉本行即可 //长按键时,按下按键每超过一次(下值*按建消抖时间)时就返回一个带长按标记的Key_ID值 //长按键计时以消抖以后开始计算         #define PRESS_KEY_LONGTIME_VALUE        16                        //必须为2的n次整数         #define PRESS_KEY_LONGTIME_FLAG                ~KEY_CODE        //所有其它未使用的按键位均为标记    extern void  Key_Scan(void); extern uint8 Key_Get(void); /***********************************************key.c********************************/ #include "51.h" #include "key.h" #ifdef PRESS_KEY_LONGTIME_MESSAGE uint8 KeyTimeBase; #endif //unsigned char code Key_Table[6]={'U','D','-','+','S','T'}; uint8  Press_Key_ID=0;        //按键扫描码 int8 Press_Key_Time=-KEY_DEJITTER_TIME; //键盘扫描 void Key_Scan(void) {         uint8 tmp=0; #ifdef PRESS_KEY_LONGTIME_MESSAGE         KeyTimeBase++; #endif         //非消抖时间键盘扫描,置建值         if (Press_Key_Time==-KEY_DEJITTER_TIME || Press_Key_Time>=0)         {                 tmp = ~KEY_PORTX & KEY_CODE;                 if (tmp==0)                 {//无键按下                         Press_Key_ID=0;                         Press_Key_Time=-KEY_DEJITTER_TIME;                 }                 else                 //有键按下                          if (Press_Key_ID != tmp)  //按键状态有改变                         {                                 Press_Key_ID = tmp;                                    Press_Key_Time=-KEY_DEJITTER_TIME+1;        //进入消抖期                         }                 //常有状态保持不变Press_Key_Time=0待取         }         // 消抖期键码不变 keytime++         else                 Press_Key_Time++; } //获取键值,如果有返回键码或长按返回-1 uint8 Key_Get(void) {         uint8 ret=0;         if (Press_Key_ID && Press_Key_Time>=0)                 if (Press_Key_Time==0)        //有待取按键                 {                         ret=Press_Key_ID;                         Press_Key_Time++; #ifdef PRESS_KEY_LONGTIME_MESSAGE                         KeyTimeBase=0;                 }                 else        //>0 有长按键                 {                 //每个消抖时间Press_Key_Time+1                         if (KeyTimeBase >= KEY_DEJITTER_TIME)                         {                                 KeyTimeBase=0;                                 Press_Key_Time++;                                 //长按                                 if ((Press_Key_Time & (PRESS_KEY_LONGTIME_VALUE-1)) ==0)                                         ret=Press_Key_ID|PRESS_KEY_LONGTIME_FLAG;                         } #endif                 }         return ret; }  详情 回复 发表于 2011-10-24 13:08
点赞 关注
 

回复
举报

315

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

个人想法是,按键SW2接INT0(下降沿触法),按下SW2,计数初值(设定3s)复位,开启T0,3s后检测下P3.2是否为低电平,如果为高电平则关T0,如果为低电平,则显示器清零。

[ 本帖最后由 孤獨の快樂 于 2011-10-24 12:09 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 

回复 楼主 zhiwan 的帖子

说了那么多自己写个按键驱动不就得了.
这个是我的支持消抖和长按键给你参考:
/********************************************************key.h***********************************/

extern uint8  Press_Key_ID;        //按键值
extern int8 Press_Key_Time;//持续按键时间

#define KEY_PORTX                P3                //按键io口
//键盘扫描码,此数值等于此按键按抬起时port口上的数值(抬起高电平,按下拉低)
#define KEY_1 C_Bit7
#define KEY_2 C_Bit6
#define KEY_3 C_Bit5
#define KEY_4 C_Bit4
#define KEY_5 C_Bit3
#define KEY_6 C_Bit2
#define KEY_CODE        (KEY_1+KEY_2+KEY_3+KEY_4+KEY_5+KEY_6)

//说明:以下定义的所指时间均以Key_Scan调用的时间间隔为单位
//按键去抖时间和长按键计时单位 此数值不能大于128
#define KEY_DEJITTER_TIME         100       
//长按连发时间功能使用
#define PRESS_KEY_LONGTIME_MESSAGE        //如果不用注释掉本行即可
//长按键时,按下按键每超过一次(下值*按建消抖时间)时就返回一个带长按标记的Key_ID值
//长按键计时以消抖以后开始计算
        #define PRESS_KEY_LONGTIME_VALUE        16                        //必须为2的n次整数
        #define PRESS_KEY_LONGTIME_FLAG                ~KEY_CODE        //所有其它未使用的按键位均为标记
  
extern void  Key_Scan(void);
extern uint8 Key_Get(void);

/***********************************************key.c********************************/
#include "51.h"
#include "key.h"
#ifdef PRESS_KEY_LONGTIME_MESSAGE
uint8 KeyTimeBase;
#endif
//unsigned char code Key_Table[6]={'U','D','-','+','S','T'};
uint8  Press_Key_ID=0;        //按键扫描码
int8 Press_Key_Time=-KEY_DEJITTER_TIME;

//键盘扫描
void Key_Scan(void)
{
        uint8 tmp=0;
#ifdef PRESS_KEY_LONGTIME_MESSAGE
        KeyTimeBase++;
#endif
        //非消抖时间键盘扫描,置建值
        if (Press_Key_Time==-KEY_DEJITTER_TIME || Press_Key_Time>=0)
        {
                tmp = ~KEY_PORTX & KEY_CODE;
                if (tmp==0)
                {//无键按下
                        Press_Key_ID=0;
                        Press_Key_Time=-KEY_DEJITTER_TIME;
                }
                else
                //有键按下
                         if (Press_Key_ID != tmp)  //按键状态有改变
                        {
                                Press_Key_ID = tmp;
                                   Press_Key_Time=-KEY_DEJITTER_TIME+1;        //进入消抖期
                        }
                //常有状态保持不变Press_Key_Time=0待取
        }
        // 消抖期键码不变 keytime++
        else
                Press_Key_Time++;
}
//获取键值,如果有返回键码或长按返回-1
uint8 Key_Get(void)
{
        uint8 ret=0;
        if (Press_Key_ID && Press_Key_Time>=0)
                if (Press_Key_Time==0)        //有待取按键
                {
                        ret=Press_Key_ID;
                        Press_Key_Time++;
#ifdef PRESS_KEY_LONGTIME_MESSAGE
                        KeyTimeBase=0;
                }
                else        //>0 有长按键
                {
                //每个消抖时间Press_Key_Time+1
                        if (KeyTimeBase >= KEY_DEJITTER_TIME)
                        {
                                KeyTimeBase=0;
                                Press_Key_Time++;
                                //长按
                                if ((Press_Key_Time & (PRESS_KEY_LONGTIME_VALUE-1)) ==0)
                                        ret=Press_Key_ID|PRESS_KEY_LONGTIME_FLAG;
                        }
#endif
                }

        return ret;
}
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 huo_hu 的帖子

实在是太初学了,以上的程序可以用到我的那个实验里吗,是全部还是长按键的那部分,谢谢你!
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表