找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1360|回復: 0
打印 上一主題 下一主題
收起左側

單片機程序 開關打開時LED燈調至最暗時,怎么判定開關為關呢?

[復制鏈接]
跳轉到指定樓層
樓主
ID:941265 發(fā)表于 2022-5-6 15:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大佬,問個問題,51C,當觸摸開關打開了,長按開關,燈的亮度調為最暗時候,我怎么短按燈調為最亮呢
單片機源程序如下:
  1. #ifndef _MAIN_C_
  2. #define _MAIN_C_
  3. /*********************************************************************************************************************/
  4. #include "ca51f5_config.h"
  5. #include "includes\ca51f5sfr.h"
  6. #include "includes\ca51f5xsfr.h"
  7. #include "includes\gpiodef_f5.h"
  8. /*********************************************************************************************************************/
  9. #include "TS_Lib\Includes\ts_configuration.h"
  10. #include "TS_Lib\Includes\ts_def.h"
  11. #include "TS_Lib\Includes\ts_api.h"
  12. #include "TS_Lib\Includes\ts_service.h"
  13. /*********************************************************************************************************************/
  14. #include "includes\system.h"
  15. #include "Library\includes\uart.h"
  16. #include "Library\includes\system_clock.h"
  17. #include "Library\Includes\tmc.h"       
  18. #include "Library\includes\pwm.h"
  19. #include "Library\includes\delay.h"
  20. #include "function.h"
  21. #include "Library/includes/flash.h"
  22. u16 check_time;
  23. u16 reset_time;
  24. u16 dim_ct;
  25. bit onff_s;
  26. bit CHOOSE;
  27. /*******************************************************************************************************************************************
  28. 說明:
  29. ------------------------------------------------------------------------------------------------------------
  30. 1.ts_configuration.h是觸摸的配置文件,可在配置文件中設置觸摸通道、靈敏度等。詳見ts_configuration.h中的說明。
  31. ------------------------------------------------------------------------------------------------------------
  32. 2.如果需要使用UART來調試,可在ca51f5_config.h中打開宏定義UART0_EN
  33. ------------------------------------------------------------------------------------------------------------
  34. 3.觸摸庫對外的數據接口為KeysFlagSN,用戶可根據KeysFlagSN的值來判斷觸摸鍵是否按下(如果觸摸鍵按下,KeysFlagSN
  35. 的對應位一直為1,觸摸鍵松開,對應位變?yōu)?),TS_Key是根據KeysFlagSN的值生成的按鍵消息,用戶如不使用可忽略。
  36. ------------------------------------------------------------------------------------------------------------
  37. 4.使能了觸摸省電模式后,在無按鍵時,在定義的時間后會進入省電模式,進入省電模式前會關閉TMC中斷和觸摸中斷(注意,總
  38. 中斷仍是開啟的),在觸摸省電模式下,CPU會進入STOP模式,在被觸摸喚醒后,程序在省電函數(TS_EnterSleepMode)的循環(huán)內運行(注意,觸摸省電模式程序不
  39. 會在主循環(huán)內運行),在觸摸省電模式下如果還要響應其他中斷,用戶需在進入觸摸省電模式前自行開啟其他中斷,
  40. 如果需要退出省電模式,用戶只需要在省電函數循環(huán)內加入條件判斷,跳出循環(huán)即可。
  41. 變量TS_SleepEn是控制觸摸省電模式的開關,如果希望程序在某些條件下不進入省電模式,只需在此條件下設置TS_SleepEn = 0;
  42. ------------------------------------------------------------------------------------------------------------
  43. 5.觸摸外掛電容(即TK_CAP引腳連接電容)范圍:6nF~50nF,建議值:20nF(即203)
  44. ------------------------------------------------------------------------------------------------------------
  45. 6.觸摸引腳串聯電阻范圍:0~5K,建議值:1K歐姆,如果有抗對講機等電磁干擾要求, 此電阻至少3K以上。
  46. *******************************************************************************************************************************************/
  47. void main(void)
  48. {
  49.         Delay_ms(50);
  50. #ifdef LVD_RST_ENABLE
  51.         LVDCON = 0xC3;        //設置LVD復位電壓為2.0V
  52. #endif
  53.        
  54. #ifdef UART0_EN
  55.         Uart0_Initial(UART0_BAUTRATE);//波特率函數
  56. #endif
  57.   PADRD =0x3F;//FLASH和程序存儲空間大小
  58.         EA = 1;
  59.   LoadAllPar();//flash讀程序
  60.         PWM_init();
  61.   pwm(3);
  62.         TS_init();       
  63.   onoff=1;//開關關閉
  64.         CHOOSE=1;
  65.         mode=1;
  66.         while(1)
  67.         {                                               
  68.                 TS_Action();//觸摸開關程序
  69.                 if(!onoff)
  70.                 {
  71.                 if(dim<dim_data)
  72.                                 {
  73.            dim_ct++        ;
  74.            if(dim_ct>1000)       
  75.                                          {                                                 
  76.                                           dim++;
  77.                                                  dim_ct=0;
  78.                                          }
  79.                                 }
  80.                         pwm(dim);
  81.                         }
  82.                         else
  83.                         {
  84.                                 if(dim>0)
  85.                                         {
  86.            dim_ct++        ;
  87.            if(dim_ct>500)       
  88.                                          {                                                 
  89.                                           dim--;
  90.                                                  dim_ct=0;
  91.                                          }
  92.                                   }
  93.                                 pwm(dim);
  94.                         }
  95. #if SUPPORT_WHEEL_SLIDER
  96.                 if(WheelSliderPosition != -1)
  97.                 {
  98.                         //當WheelSliderPosition不等于-1時, 表示滑條或圓環(huán)有觸摸事件發(fā)生。WheelSliderPosition的值表示滑條或圓環(huán)的位置。
  99.                 }
  100. #endif
  101. #if SUPPORT_KEY
  102. /*************************************************************************************************
  103. 變量KeysFlagSN是觸摸庫對外的數據接口,KeysFlagSN的每一位對應一個觸摸鍵的狀態(tài),為1表示觸摸鍵觸發(fā)?啥噫I同時觸發(fā)。
  104. *************************************************************************************************/
  105.         if(CHOOSE)
  106.                 {/* long_press是長按的位變量,onff_s是判斷開關的位變量,press_f是存儲亮度下次按鍵或者重啟的位變量*/
  107.    if(long_press&&(!onoff)&&(!onff_s))//進入長按,觸發(fā)亮度調節(jié)子程序onff_s用來判斷開關
  108.                          {
  109.                                  press_f=1;
  110.                                 if(up_flag)//亮度提升
  111.                                  {
  112.                                          if(dim_data<255)
  113.                                           {
  114.                                                          dim_ct++        ;
  115.                                                          if(dim_ct>1200)       
  116.                                                          {                                                                                       
  117.                                                                 dim_data++;
  118.                                                                  dim=dim_data;
  119.                                                                  dim_ct=0;
  120.                                                          }
  121.                                           }
  122.                                            else
  123.                                            {
  124.                                                            dim_data=255;
  125.                                                            dim_ct++        ;
  126.                                                          if(dim_ct>1200)       
  127.                                                           {
  128.                                                                  dim_ct=0;
  129.                                                           }                                                         
  130.                                                  }                                                 
  131.                                  }
  132.                                  else//亮度調暗
  133.                                  {
  134.                                          if(dim_data>10)
  135.                                           {
  136.                                                                 dim_ct++        ;
  137.                                                          if(dim_ct>1200)       
  138.                                                          {                                                         
  139.                                                                  dim_data--;
  140.                                                                  dim=dim_data;
  141.                                                                  dim_ct=0;
  142.                                                          }
  143.                                           }                                                 
  144.                                            else
  145.                                            {
  146.                                                          dim_data=10;
  147.                                                          dim_ct++        ;
  148.                                                          if(dim_ct>1200)       
  149.                                                           {                                                 
  150.                                                                  dim_ct=0;
  151.                                                           }
  152.                                                  }
  153.                                  }
  154.                          }
  155.                  }
  156. /*短按開關*/
  157.                 if(KeysFlagSN != 0)//keypress//按鍵有按下
  158.                 { reset_time=0;
  159.                         check_time=0;
  160.                         switch(KeysFlagSN)
  161.                         {
  162.                                 case 0x0001:                                                   
  163.                                                    press_ct++;//(check_c)觸發(fā)觸摸按鍵,參數自加
  164.                                            if(press_ct>P_level)//參數大于P_level
  165.                                                                            {
  166.                                                                                          long_press=1;//進入長按,觸發(fā)調光
  167.                                                                                          press_ct=P_level;
  168.                                                                            }
  169.                                                                                  if(onoff) //如果燈是關著
  170.                                                                                   {
  171.                                                                                          onoff=0;//開關打開
  172.                                                                                          long_press=0;//退出長按
  173.                                                                                          press_ct=0;
  174.                                                                                         //dim=0;
  175.                                                                                                 onff_s=1;
  176.                                                                                   }
  177.                                         break;
  178.                                 case 0x0002:
  179.                                         break;
  180.                                 case 0x0004:
  181.                                         break;
  182.                                 //......
  183.                                 default:
  184.                                         break;
  185.                         }
  186.                 }
  187.                 else//release
  188.                 {
  189.                         check_time++;//
  190.                 }
  191.                 if(check_time>220)//=i>600
  192.                 {
  193.                         check_time=0;
  194. //                        lianfa=0;//
  195.                         reset_time++;                       
  196.                         if(press_ct>10&&press_ct<P_level&&long_press==0)////觸發(fā)短按,進行燈具開滅
  197.                    {
  198.                                 if(!onff_s)
  199.                                 {
  200.                           onoff=!onoff;//short press
  201.                                  press_f=1;
  202.                                 }                               
  203.                    }
  204.                          onff_s=0;
  205.                          if(long_press)//(lpress_ct)//長按進行亮度調節(jié)翻轉
  206.                          {
  207.                                  up_flag=!up_flag;
  208.                          }                         
  209.                    long_press=0;
  210.                          press_ct=0;
  211.                          if(press_f)//存儲亮度變量,松手或者關機,下次從這個變量觸發(fā)
  212.                          {
  213.                                  press_f=0;
  214.                           SaveAllPar();
  215.                          }
  216.                 }
  217.                 /**/
  218.                 if(reset_time>1000)
  219.                   {
  220.       TS_init();
  221.                         reset_time=0;
  222.                                 //LG=1;
  223.                                 //LB=1;
  224.                                 //Delay_ms(100);
  225.                   }
  226. #endif
  227.                 //#endif
  228.         }
  229. }
  230. #endif
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表