久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32F103多種組合按鍵隊列 源程序 控制PWM輸出 外接485通訊 ADC采集

[復制鏈接]
跳轉到指定樓層
樓主
ID:403544 發表于 2021-1-25 16:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*申明一下部分代碼是來自于網絡的整合 我自己做了一些修改 更加完善 取之于網絡用之于網絡  */
  2. /*按鍵隊列執行函數*/
  3. void task_run_key(void)
  4. {
  5.         KeyValue_Info KeyValueInfo;
  6.         unsigned char len = 0;
  7.         
  8.         if(Read_RingStrEx(&Key_Value,(unsigned char *)&KeyValueInfo,&len) == 0)
  9.         {
  10.                 if(len != sizeof(KeyValue_Info))
  11.                 {
  12.                         return;
  13.                 }
  14.                
  15.                 if(KeyValueInfo.KeyGpNum < KeyGPCnt && KeyGpInfo[KeyValueInfo.KeyGpNum].KeyGPRun != NULL)
  16.                 {
  17.                         
  18.                         KeyGpInfo[KeyValueInfo.KeyGpNum].KeyGPRun();
  19.                         
  20.                 }
  21.                 else if(KeyValueInfo.KeyNum < KeyCnt)
  22.                 {
  23.                         if(KeyValueInfo.KeyStatus == SP && KeyInfo[KeyValueInfo.KeyNum].KeySPRun != NULL)
  24.                         {
  25.                                 
  26.                                 KeyInfo[KeyValueInfo.KeyNum].KeySPRun();
  27.                                 
  28.                         }
  29.                         else if(KeyValueInfo.KeyStatus == LP && KeyInfo[KeyValueInfo.KeyNum].KeyLPRun != NULL)
  30.                         {
  31.                                 
  32.                                 KeyInfo[KeyValueInfo.KeyNum].KeyLPRun();
  33.                                 
  34.                         }
  35.                         else if(KeyValueInfo.KeyStatus == LOOP && KeyInfo[KeyValueInfo.KeyNum].KeyLOOPRun != NULL)
  36.                         {
  37.                                 
  38.                                 KeyInfo[KeyValueInfo.KeyNum].KeyLOOPRun();
  39.                                 
  40.                         }        
  41.                 }
  42.         }
  43. }
  44. //監聽函數 --放在1ms循環里面執行
  45. void task_listen_key(void)
  46. {
  47.         unsigned char i;
  48.         KeyValue_Info KeyValueInfo;
  49.         
  50.         //單鍵檢測
  51.         for(i = 0; i < KeyCnt;i++)
  52.         {
  53.                 if(KeyInfo[i].useFlg == KEY_USE)
  54.                 {
  55.                         CheckKey((Key_Num)i,KeyInfo[i].mode);
  56.                 }               
  57.                 if(Get_keyValueX[i] == KEY_ON && Get_keyValue[i] == KEY_OFF && KeyGPFlag[i] == 0)
  58.                 {               
  59.                         if(KeyInfo[i].mode ==        KEY_CLOCK)
  60.                         {
  61. #if DEBUG_PRINTF
  62.                                 //printf("非連發模式:key%d按鍵已松開,鍵入時間為%dMs\r\n",(unsigned char)i+1,Get_keyChooseTimeCnt[i]);
  63. #endif
  64.                                 //短按
  65.                                 if((Get_keyChooseTimeCnt[i] != 0) && (Get_keyChooseTimeCnt[i] < LP_TIME) && (Get_keyChooseTimeCnt[i] >= SP_TIME))
  66.                                 {
  67.                                         KeyValueInfo.KeyNum = (Key_Num)i;
  68.                                         KeyValueInfo.KeyGpNum = (KeyGroup_Num)KeyGPCnt;
  69.                                         KeyValueInfo.KeyStatus = SP;
  70.                                         Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValueInfo));

  71.                                 }               
  72.                                 //長按
  73.                                 else if((Get_keyChooseTimeCnt[i] != 0) && (Get_keyChooseTimeCnt[i] >= LP_TIME))
  74.                                 {
  75.                                         KeyValueInfo.KeyNum = (Key_Num)i;
  76.                                         KeyValueInfo.KeyGpNum = (KeyGroup_Num)KeyGPCnt;
  77.                                         KeyValueInfo.KeyStatus = LP;
  78.                                         Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValue_Info));                                       
  79.                                 }                                       
  80.                         }
  81.                         
  82.                         else if (KeyInfo[i].mode ==        KEY_NOCLOCK)
  83.                         {
  84. #if DEBUG_PRINTF
  85.                                 //printf("連發模式:key%d按鍵鍵入時間為%dMs 自動連發時間:%dMs\r\n",(unsigned char)i+1,Get_keyChooseTimeCnt[i],KeyInfo[i].AutoTime);
  86. #endif
  87.                                 if(Get_keyChooseTimeCnt[i] != 0)
  88.                                 {
  89.                                         KeyValueInfo.KeyNum = (Key_Num)i;
  90.                                         KeyValueInfo.KeyGpNum = (KeyGroup_Num)KeyGPCnt;
  91.                                         KeyValueInfo.KeyStatus = LOOP;
  92.                                         Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValue_Info));                                                
  93.                                 }        
  94.                         }
  95.                         
  96.                         Get_keyChooseTimeCnt[i] = 0;
  97.                 }        
  98.                 Get_keyValueX[i] = Get_keyValue[i];
  99.         }
  100.         
  101.         //組合檢測
  102.         for(i = 0; i < KeyGPCnt;i++)
  103.         {
  104.                 if(KeyGpInfo[i].useFlg == KEYGP_USE)
  105.                 {
  106.                         if(KeyGpInfo[i].GetKeyNumStrict == KEYSTRICT_OFF)
  107.                                 CheckKeyGP_NoStrict((KeyGroup_Num)i,KeyGpInfo[i]);
  108.                         else if(KeyGpInfo[i].GetKeyNumStrict == KEYSTRICT_ON)
  109.                                 CheckKeyGP_Strict((KeyGroup_Num)i,KeyGpInfo[i]);
  110.                 }
  111.                 if(Get_keyGPStatusX[i] == KEYGP_OFF && Get_keyGPStatus[i] == KEYGP_ON)
  112.                 {        
  113. #if DEBUG_PRINTF
  114.                                 //printf("組合 %d已觸發\r\n",(unsigned char)i+1);
  115. #endif
  116.                                 KeyValueInfo.KeyNum = (Key_Num)KeyCnt;
  117.                                 KeyValueInfo.KeyGpNum = (KeyGroup_Num)i;
  118.                                 KeyValueInfo.KeyStatus = 0xFF;
  119.                                 Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValue_Info));

  120.                                 //完成一次組合,重置鍵值。
  121.                                 KeyGPStatusValueNow[i] = 0;

  122.                 }
  123.                 Get_keyGPStatusX[i] = Get_keyGPStatus[i];               
  124.         }
  125. }

  126. /* TIM1 init  PWM  function */
  127. void MX_TIM1_Init(void)
  128. {
  129.   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  130.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  131.   TIM_OC_InitTypeDef sConfigOC = {0};
  132.   TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  133.   htim1.Instance = TIM1;
  134.   htim1.Init.Prescaler = 60-1;
  135.   htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED2;
  136.   htim1.Init.Period = 1000;
  137.   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  138.   htim1.Init.RepetitionCounter = 0;
  139.   htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  140.   if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  141.   {
  142.     Error_Handler();
  143.   }
  144.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  145.   if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  146.   {
  147.     Error_Handler();
  148.   }
  149.   if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  150.   {
  151.     Error_Handler();
  152.   }
  153.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  154.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  155.   if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  156.   {
  157.     Error_Handler();
  158.   }
  159.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  160.   sConfigOC.Pulse = 500;
  161.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  162.   sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  163.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  164.   sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  165.   sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  166.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  167.   {
  168.     Error_Handler();
  169.   }
  170.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  171.   {
  172.     Error_Handler();
  173.   }
  174.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  175.   {
  176.     Error_Handler();
  177.   }
  178.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  179.   {
  180.     Error_Handler();
  181.   }
  182.   sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  183.   sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  184.   sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  185.   sBreakDeadTimeConfig.DeadTime = 0;
  186.   sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  187.   sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  188.   sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  189.   if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  190.   {
  191.     Error_Handler();
  192.   }
  193.   HAL_TIM_MspPostInit(&htim1);

  194. }
復制代碼
全部代碼51hei下載地址:
STM32F103C8T6.7z (205.19 KB, 下載次數: 107)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:853896 發表于 2021-1-26 11:20 | 只看該作者
樓主,能上個原理圖嗎?還有,這個軟件,keil下,能用嗎?對于32位機,我是菜鳥,希望能多指教
回復

使用道具 舉報

板凳
ID:403544 發表于 2021-1-28 16:32 | 只看該作者
ccnnzz315 發表于 2021-1-26 11:20
樓主,能上個原理圖嗎?還有,這個軟件,keil下,能用嗎?對于32位機,我是菜鳥,希望能多指教

不需要原理圖  你只要有單片機板子 在程序里更改IO口即可使用 程序經過驗證是沒有問題的
回復

使用道具 舉報

地板
ID:403544 發表于 2021-1-28 16:32 | 只看該作者
ccnnzz315 發表于 2021-1-26 11:20
樓主,能上個原理圖嗎?還有,這個軟件,keil下,能用嗎?對于32位機,我是菜鳥,希望能多指教

就是基于KEIL的
回復

使用道具 舉報

5#
ID:717605 發表于 2021-5-16 21:42 | 只看該作者
下載了,學習一下組合按鍵。
回復

使用道具 舉報

6#
ID:528966 發表于 2022-11-22 11:02 | 只看該作者
剛接觸STM32,誰給注釋下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九国产| 久久久久久久国产 | av乱码| 久久久久国产 | 亚洲国产精品久久 | 久久中文字幕一区 | 精品在线播放 | 国内精品久久久久久久 | 精品久久免费 | 视频一区二区在线观看 | 特黄色毛片| 久久国产精品视频 | 亚洲在线视频 | 亚洲五码久久 | 超碰在线播 | av电影一区 | 亚洲欧美日韩精品久久亚洲区 | 欧美日韩在线观看一区 | 一区二区成人 | 视频一区中文字幕 | 欧美一区二区久久 | 欧美在线视频二区 | 污视频免费在线观看 | 91精品国产综合久久久久久丝袜 | 国产精品一区在线观看你懂的 | 亚洲精美视频 | 欧美视频网 | 国产美女一区 | 九九热九九 | 亚洲欧美日韩精品久久亚洲区 | 久久精品一级 | 久久丝袜| 欧美午夜激情在线 | 久久一二 | 国产免费让你躁在线视频 | 在线视频成人 | 成人欧美一区二区三区黑人孕妇 | 国产精品综合色区在线观看 | 亚洲国产电影 | 久草热线 | 欧美国产日韩在线观看 |