[技术问答] 怎样设置同一个触摸键成为总控制开关

[复制链接]
1353|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有触发模式和非触发模式,比如按一下,进入触发模式,再按一下退出触发模式。
玛尼玛尼哄 发表于 2020-2-22 21:01 | 显示全部楼层
比如我用3个按键控制一个时钟的调整时间,假设K1是设置,K2是增加,K3是减小。
那么我可以K1按一下,设置小时,再按一下,进入设置分钟,再按一下进入设置秒,再按一下退出设置。
玛尼玛尼哄 发表于 2020-2-22 21:01 | 显示全部楼层
总之这是个软件过程
玛尼玛尼哄 发表于 2020-2-22 21:04 | 显示全部楼层
  1. #include <AT89X52.h>
  2. sbit KEY_SET        =P1^5;
  3. sbit KEY_UP                =P1^6;
  4. sbit KEY_DOWN        =P1^7;
  5. unsigned char key_state=0;
  6. //消除抖动
  7. void key_delay(void)
  8. {
  9.         unsigned char i=30;
  10.         while(i--);
  11. }

  12. void key_delay500ms(void)
  13. {
  14.         unsigned char i=100,j=250;       
  15.         while(i--)
  16.                 while(j--);
  17. }

  18. void key(void)
  19. {
  20.         char time_temp[7];


  21.         if(KEY_SET==0)
  22.         {
  23.                 key_delay();
  24.                 if(KEY_SET==0)
  25.                 {
  26.                         while(KEY_SET==0);
  27.                         key_state++;                //非零状态表示调节年、月、日、周、时、分、秒
  28.                         if(key_state>7) key_state=0;
  29.                 }
  30.         }
  31.        

  32.        
  33.         if(key_state!=0)
  34.                 switch(key_state)
  35.                 {
  36.                         case 1:
  37.                                 {
  38.                                         LCD1602Disp1(0x82,'0'+DS12887read(DS12887_Year_Addr)/10);
  39.                                         LCD1602Disp1(0x83,'0'+DS12887read(DS12887_Year_Addr)%10);
  40.                                         key_delay500ms();
  41.                                         LCD1602Disp1(0x82,0);                                       
  42.                                         LCD1602Disp1(0x83,0);
  43.                                         key_delay500ms();                                       
  44.                                 } break;
  45.                         case 2:
  46.                                 {
  47.                                         LCD1602Disp1(0x85,'0'+DS12887read(DS12887_Month_Addr)/10);
  48.                                         LCD1602Disp1(0x86,'0'+DS12887read(DS12887_Month_Addr)%10);
  49.                                         key_delay500ms();
  50.                                         LCD1602Disp1(0x85,0);                                       
  51.                                         LCD1602Disp1(0x86,0);
  52.                                         key_delay500ms();                                       
  53.                                 } break;
  54.                         case 3:
  55.                                 {
  56.                                         LCD1602Disp1(0x88,'0'+DS12887read(DS12887_Day_Addr)/10);
  57.                                         LCD1602Disp1(0x89,'0'+DS12887read(DS12887_Day_Addr)%10);
  58.                                         key_delay500ms();
  59.                                         LCD1602Disp1(0x88,0);                                       
  60.                                         LCD1602Disp1(0x89,0);
  61.                                         key_delay500ms();                                       
  62.                                 } break;       
  63.                         case 4:
  64.                                 {
  65.                                         LCD1602Disp1(0x8E,'0'+DS12887read(DS12887_Week_Addr));
  66.                                         key_delay500ms();
  67.                                         LCD1602Disp1(0x8E,0);                                       
  68.                                         key_delay500ms();                                       
  69.                                 } break;
  70.                         case 5:
  71.                                 {
  72.                                         LCD1602Disp1(0xC0,'0'+DS12887read(DS12887_Hour_Addr)/10);
  73.                                         LCD1602Disp1(0xC1,'0'+DS12887read(DS12887_Hour_Addr)%10);       
  74.                                         key_delay500ms();
  75.                                         LCD1602Disp1(0xC0,0);                                       
  76.                                         LCD1602Disp1(0xC1,0);
  77.                                         key_delay500ms();                                       
  78.                                 } break;       
  79.                         case 6:
  80.                                 {
  81.                                         LCD1602Disp1(0xC3,'0'+DS12887read(DS12887_Min_Addr)/10);
  82.                                         LCD1602Disp1(0xC4,'0'+DS12887read(DS12887_Min_Addr)%10);
  83.                                         key_delay500ms();
  84.                                         LCD1602Disp1(0xC3,0);                                       
  85.                                         LCD1602Disp1(0xC4,0);
  86.                                         key_delay500ms();                                       
  87.                                 } break;       
  88.                         case 7:
  89.                                 {
  90.                                         LCD1602Disp1(0xC6,'0'+DS12887read(DS12887_Sec_Addr)/10);
  91.                                         LCD1602Disp1(0xC7,'0'+DS12887read(DS12887_Sec_Addr)%10);
  92.                                         key_delay500ms();
  93.                                         LCD1602Disp1(0xC6,0);                                       
  94.                                         LCD1602Disp1(0xC7,0);
  95.                                         key_delay500ms();                                       
  96.                                 } break;                               
  97.                 }
  98.        
  99.        
  100.   if(key_state!=0)
  101.         {
  102. //读出当前时间,然后准备调整,升级建议:可以将年月日读取地址放到数组里,方便循环读写。
  103.                 time_temp[0]=DS12887read(DS12887_Year_Addr);
  104.                 time_temp[1]=DS12887read(DS12887_Month_Addr);
  105.                 time_temp[2]=DS12887read(DS12887_Day_Addr);
  106.                 time_temp[3]=DS12887read(DS12887_Week_Addr);
  107.                 time_temp[4]=DS12887read(DS12887_Hour_Addr);
  108.                 time_temp[5]=DS12887read(DS12887_Min_Addr);
  109.                 time_temp[6]=DS12887read(DS12887_Sec_Addr);       
  110. //增加,减小按键判断
  111.                 if(KEY_UP==0)
  112.                 {
  113.                         key_delay();
  114.                         if(KEY_UP==0)
  115.                         {
  116.                                 while(KEY_UP==0);
  117.                                 time_temp[key_state-1]++;
  118.                         }
  119.                 }       
  120.                
  121.                 if(KEY_DOWN==0)
  122.                 {
  123.                         key_delay();
  124.                         if(KEY_DOWN==0)
  125.                         {
  126.                                 while(KEY_DOWN==0);
  127.                                 time_temp[key_state-1]--;
  128.                         }
  129.                 }               

  130.                 /*调整时间范围限定*/
  131.                 if(time_temp[0]>99) time_temp[0]=0;
  132.                 if(time_temp[0]<0)         time_temp[0]=99;
  133.                
  134.                 if(time_temp[1]>12) time_temp[1]=1;
  135.                 if(time_temp[1]<1)         time_temp[1]=12;               
  136.                 //先不考虑不同月份不同天数               
  137.                 if(time_temp[2]>31) time_temp[2]=1;
  138.                 if(time_temp[2]<1)         time_temp[2]=31;       
  139.                
  140.                 if(time_temp[3]>7) time_temp[3]=1;
  141.                 if(time_temp[3]<1) time_temp[3]=7;

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

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

  146.                 if(time_temp[6]>59) time_temp[6]=0;
  147.                 if(time_temp[6]<0)         time_temp[6]=59;       
  148.                
  149.                 DS12887write(0x0a,0x00);     //开始调时,DS12CR887关闭时钟振荡器
  150.                 DS12887write(DS12887_Sec_Addr,        time_temp[6]);         
  151.                 DS12887write(DS12887_Min_Addr,        time_temp[5]);
  152.                 DS12887write(DS12887_Hour_Addr,        time_temp[4]);
  153.                 DS12887write(DS12887_Week_Addr,        time_temp[3]);       
  154.                 DS12887write(DS12887_Day_Addr,        time_temp[2]);  
  155.                 DS12887write(DS12887_Month_Addr,time_temp[1]);
  156.                 DS12887write(DS12887_Year_Addr,        time_temp[0]);
  157. /*显示调整后的时间*/               
  158.                 LCD1602Disp1(0x80,'0'+2);
  159.                 LCD1602Disp1(0x81,'0'+0);       
  160.                 LCD1602Disp1(0x82,'0'+DS12887read(DS12887_Year_Addr)/10);
  161.                 LCD1602Disp1(0x83,'0'+DS12887read(DS12887_Year_Addr)%10);       
  162.                 LCD1602Disp1(0x84,'-');       
  163.                 LCD1602Disp1(0x85,'0'+DS12887read(DS12887_Month_Addr)/10);
  164.                 LCD1602Disp1(0x86,'0'+DS12887read(DS12887_Month_Addr)%10);       
  165.                 LCD1602Disp1(0x87,'-');       
  166.                 LCD1602Disp1(0x88,'0'+DS12887read(DS12887_Day_Addr)/10);
  167.                 LCD1602Disp1(0x89,'0'+DS12887read(DS12887_Day_Addr)%10);
  168.                 LCD1602Disp1(0x8D,'-');       
  169.                 LCD1602Disp1(0x8E,'0'+DS12887read(DS12887_Week_Addr));
  170.                 LCD1602Disp1(0x8F,'-');       
  171.                
  172.                 LCD1602Disp1(0xC0,'0'+DS12887read(DS12887_Hour_Addr)/10);
  173.                 LCD1602Disp1(0xC1,'0'+DS12887read(DS12887_Hour_Addr)%10);       
  174.                 LCD1602Disp1(0xC2,':');       
  175.                 LCD1602Disp1(0xC3,'0'+DS12887read(DS12887_Min_Addr)/10);
  176.                 LCD1602Disp1(0xC4,'0'+DS12887read(DS12887_Min_Addr)%10);       
  177.                 LCD1602Disp1(0xC5,':');       
  178.                 LCD1602Disp1(0xC6,'0'+DS12887read(DS12887_Sec_Addr)/10);
  179.                 LCD1602Disp1(0xC7,'0'+DS12887read(DS12887_Sec_Addr)%10);               
  180.         }

  181.        
  182.        
  183. }
玛尼玛尼哄 发表于 2020-2-22 21:05 | 显示全部楼层
这是我在Proteus上仿真的项目的部分文件,你可以看看。
杨寅辉 发表于 2020-2-23 16:03 | 显示全部楼层
取决于你程序框架的设计,和哪个单片机,哪个触摸没有关系的。
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

粉丝
快速回复 在线客服 返回列表 返回顶部