按钮SW2长按3秒,单片机实现清零

2019-03-24 19:39发布

工作原理:单片机控制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、显示灯一个红 {MOD}一个绿 {MOD}。工作时绿灯亮,电池没电的时候红灯闪烁(电压小于6V),红外光控一直工作时绿灯闪烁。                                                                                                                       
7、电位器用来调整红外感应距离。                                                                                                                       
        分配给我的是长按3秒按钮SW2实现单片机情侣功能,该怎么实现,谢谢大家帮忙 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
孤獨の快樂
1楼-- · 2019-03-25 02:47

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

[ 本帖最后由 孤獨の快樂 于 2011-10-24 12:09 编辑 ]
Li_Lei
2楼-- · 2019-03-25 04:53
说了那么多自己写个按键驱动不就得了.
这个是我的支持消抖和长按键给你参考:
/********************************************************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;
}
zhiwan
3楼-- · 2019-03-25 09:36
 精彩回答 2  元偷偷看……

一周热门 更多>