打印
[技术问答]

怎样设置同一个触摸键成为总控制开关

[复制链接]
952|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qwe123zxc|  楼主 | 2020-2-19 12:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
设置有4个触摸键,K1,K2,K3,K4,怎样用K1键设置成总开关,长按一下K1,开启K2K3K4键,就能运行各个键的功能程序。在短按一下K1键,就关闭K2K3K4键,怎么按,都没有反应。(使用的是92F8463B)

使用特权

评论回复

相关帖子

沙发
hjl2832| | 2020-2-20 08:40 | 只看该作者
本帖最后由 hjl2832 于 2020-2-20 08:43 编辑

用状态控制,可以设置一个标志位,在长按K1时置位标志,这样在按下K2K3K4时,先检测标志位的状态,如果状态置位了(K1长按了以后),才执行K2K3K4相应的代码,否则不执行。

使用特权

评论回复
板凳
knk| | 2020-2-20 21:24 | 只看该作者
如果是4个机械按键,你的程序会怎样写?
触摸库只能告诉你触摸按键的状态,按下还是松手,程序具体实现的功能是要你来写的。

使用特权

评论回复
地板
玛尼玛尼哄| | 2020-2-22 21:00 | 只看该作者
肯定要编程的,K1有触发模式和非触发模式,比如按一下,进入触发模式,再按一下退出触发模式。

使用特权

评论回复
5
玛尼玛尼哄| | 2020-2-22 21:01 | 只看该作者
比如我用3个按键控制一个时钟的调整时间,假设K1是设置,K2是增加,K3是减小。
那么我可以K1按一下,设置小时,再按一下,进入设置分钟,再按一下进入设置秒,再按一下退出设置。

使用特权

评论回复
6
玛尼玛尼哄| | 2020-2-22 21:01 | 只看该作者
总之这是个软件过程

使用特权

评论回复
7
玛尼玛尼哄| | 2020-2-22 21:04 | 只看该作者
#include <AT89X52.h>
sbit KEY_SET        =P1^5;
sbit KEY_UP                =P1^6;
sbit KEY_DOWN        =P1^7;
unsigned char key_state=0;
//消除抖动
void key_delay(void)
{
        unsigned char i=30;
        while(i--);
}

void key_delay500ms(void)
{
        unsigned char i=100,j=250;       
        while(i--)
                while(j--);
}

void key(void)
{
        char time_temp[7];


        if(KEY_SET==0)
        {
                key_delay();
                if(KEY_SET==0)
                {
                        while(KEY_SET==0);
                        key_state++;                //非零状态表示调节年、月、日、周、时、分、秒
                        if(key_state>7) key_state=0;
                }
        }
       

       
        if(key_state!=0)
                switch(key_state)
                {
                        case 1:
                                {
                                        LCD1602Disp1(0x82,'0'+DS12887read(DS12887_Year_Addr)/10);
                                        LCD1602Disp1(0x83,'0'+DS12887read(DS12887_Year_Addr)%10);
                                        key_delay500ms();
                                        LCD1602Disp1(0x82,0);                                       
                                        LCD1602Disp1(0x83,0);
                                        key_delay500ms();                                       
                                } break;
                        case 2:
                                {
                                        LCD1602Disp1(0x85,'0'+DS12887read(DS12887_Month_Addr)/10);
                                        LCD1602Disp1(0x86,'0'+DS12887read(DS12887_Month_Addr)%10);
                                        key_delay500ms();
                                        LCD1602Disp1(0x85,0);                                       
                                        LCD1602Disp1(0x86,0);
                                        key_delay500ms();                                       
                                } break;
                        case 3:
                                {
                                        LCD1602Disp1(0x88,'0'+DS12887read(DS12887_Day_Addr)/10);
                                        LCD1602Disp1(0x89,'0'+DS12887read(DS12887_Day_Addr)%10);
                                        key_delay500ms();
                                        LCD1602Disp1(0x88,0);                                       
                                        LCD1602Disp1(0x89,0);
                                        key_delay500ms();                                       
                                } break;       
                        case 4:
                                {
                                        LCD1602Disp1(0x8E,'0'+DS12887read(DS12887_Week_Addr));
                                        key_delay500ms();
                                        LCD1602Disp1(0x8E,0);                                       
                                        key_delay500ms();                                       
                                } break;
                        case 5:
                                {
                                        LCD1602Disp1(0xC0,'0'+DS12887read(DS12887_Hour_Addr)/10);
                                        LCD1602Disp1(0xC1,'0'+DS12887read(DS12887_Hour_Addr)%10);       
                                        key_delay500ms();
                                        LCD1602Disp1(0xC0,0);                                       
                                        LCD1602Disp1(0xC1,0);
                                        key_delay500ms();                                       
                                } break;       
                        case 6:
                                {
                                        LCD1602Disp1(0xC3,'0'+DS12887read(DS12887_Min_Addr)/10);
                                        LCD1602Disp1(0xC4,'0'+DS12887read(DS12887_Min_Addr)%10);
                                        key_delay500ms();
                                        LCD1602Disp1(0xC3,0);                                       
                                        LCD1602Disp1(0xC4,0);
                                        key_delay500ms();                                       
                                } break;       
                        case 7:
                                {
                                        LCD1602Disp1(0xC6,'0'+DS12887read(DS12887_Sec_Addr)/10);
                                        LCD1602Disp1(0xC7,'0'+DS12887read(DS12887_Sec_Addr)%10);
                                        key_delay500ms();
                                        LCD1602Disp1(0xC6,0);                                       
                                        LCD1602Disp1(0xC7,0);
                                        key_delay500ms();                                       
                                } break;                               
                }
       
       
  if(key_state!=0)
        {
//读出当前时间,然后准备调整,升级建议:可以将年月日读取地址放到数组里,方便循环读写。
                time_temp[0]=DS12887read(DS12887_Year_Addr);
                time_temp[1]=DS12887read(DS12887_Month_Addr);
                time_temp[2]=DS12887read(DS12887_Day_Addr);
                time_temp[3]=DS12887read(DS12887_Week_Addr);
                time_temp[4]=DS12887read(DS12887_Hour_Addr);
                time_temp[5]=DS12887read(DS12887_Min_Addr);
                time_temp[6]=DS12887read(DS12887_Sec_Addr);       
//增加,减小按键判断
                if(KEY_UP==0)
                {
                        key_delay();
                        if(KEY_UP==0)
                        {
                                while(KEY_UP==0);
                                time_temp[key_state-1]++;
                        }
                }       
               
                if(KEY_DOWN==0)
                {
                        key_delay();
                        if(KEY_DOWN==0)
                        {
                                while(KEY_DOWN==0);
                                time_temp[key_state-1]--;
                        }
                }               

                /*调整时间范围限定*/
                if(time_temp[0]>99) time_temp[0]=0;
                if(time_temp[0]<0)         time_temp[0]=99;
               
                if(time_temp[1]>12) time_temp[1]=1;
                if(time_temp[1]<1)         time_temp[1]=12;               
                //先不考虑不同月份不同天数               
                if(time_temp[2]>31) time_temp[2]=1;
                if(time_temp[2]<1)         time_temp[2]=31;       
               
                if(time_temp[3]>7) time_temp[3]=1;
                if(time_temp[3]<1) time_temp[3]=7;

                if(time_temp[4]>23) time_temp[4]=0;
                if(time_temp[4]<0)         time_temp[4]=23;       

                if(time_temp[5]>59) time_temp[5]=0;
                if(time_temp[5]<0)         time_temp[5]=59;                       

                if(time_temp[6]>59) time_temp[6]=0;
                if(time_temp[6]<0)         time_temp[6]=59;       
               
                DS12887write(0x0a,0x00);     //开始调时,DS12CR887关闭时钟振荡器
                DS12887write(DS12887_Sec_Addr,        time_temp[6]);         
                DS12887write(DS12887_Min_Addr,        time_temp[5]);
                DS12887write(DS12887_Hour_Addr,        time_temp[4]);
                DS12887write(DS12887_Week_Addr,        time_temp[3]);       
                DS12887write(DS12887_Day_Addr,        time_temp[2]);  
                DS12887write(DS12887_Month_Addr,time_temp[1]);
                DS12887write(DS12887_Year_Addr,        time_temp[0]);
/*显示调整后的时间*/               
                LCD1602Disp1(0x80,'0'+2);
                LCD1602Disp1(0x81,'0'+0);       
                LCD1602Disp1(0x82,'0'+DS12887read(DS12887_Year_Addr)/10);
                LCD1602Disp1(0x83,'0'+DS12887read(DS12887_Year_Addr)%10);       
                LCD1602Disp1(0x84,'-');       
                LCD1602Disp1(0x85,'0'+DS12887read(DS12887_Month_Addr)/10);
                LCD1602Disp1(0x86,'0'+DS12887read(DS12887_Month_Addr)%10);       
                LCD1602Disp1(0x87,'-');       
                LCD1602Disp1(0x88,'0'+DS12887read(DS12887_Day_Addr)/10);
                LCD1602Disp1(0x89,'0'+DS12887read(DS12887_Day_Addr)%10);
                LCD1602Disp1(0x8D,'-');       
                LCD1602Disp1(0x8E,'0'+DS12887read(DS12887_Week_Addr));
                LCD1602Disp1(0x8F,'-');       
               
                LCD1602Disp1(0xC0,'0'+DS12887read(DS12887_Hour_Addr)/10);
                LCD1602Disp1(0xC1,'0'+DS12887read(DS12887_Hour_Addr)%10);       
                LCD1602Disp1(0xC2,':');       
                LCD1602Disp1(0xC3,'0'+DS12887read(DS12887_Min_Addr)/10);
                LCD1602Disp1(0xC4,'0'+DS12887read(DS12887_Min_Addr)%10);       
                LCD1602Disp1(0xC5,':');       
                LCD1602Disp1(0xC6,'0'+DS12887read(DS12887_Sec_Addr)/10);
                LCD1602Disp1(0xC7,'0'+DS12887read(DS12887_Sec_Addr)%10);               
        }

       
       
}

使用特权

评论回复
8
玛尼玛尼哄| | 2020-2-22 21:05 | 只看该作者
这是我在Proteus上仿真的项目的部分文件,你可以看看。

使用特权

评论回复
9
杨寅辉| | 2020-2-23 16:03 | 只看该作者
取决于你程序框架的设计,和哪个单片机,哪个触摸没有关系的。

使用特权

评论回复
10
itcs| | 2020-3-13 11:38 | 只看该作者
先:
uchar on=1;  // 状态开
判断:
K1按下:if(on==1){运行K1代码;on=0}
K2按下:if(on==0){运行K2代码;}
K3按下:if(on==0){运行K3代码;}

K2,K3在运行时,判断on是否等于0,等于就执行,不等于就无效果;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

103

帖子

0

粉丝