標(biāo)題:
STM32F103多種組合按鍵隊列 源程序 控制PWM輸出 外接485通訊 ADC采集
[打印本頁]
作者:
WANGRUIQI
時間:
2021-1-25 16:26
標(biāo)題:
STM32F103多種組合按鍵隊列 源程序 控制PWM輸出 外接485通訊 ADC采集
/*申明一下部分代碼是來自于網(wǎng)絡(luò)的整合 我自己做了一些修改 更加完善 取之于網(wǎng)絡(luò)用之于網(wǎng)絡(luò) */
/*按鍵隊列執(zhí)行函數(shù)*/
void task_run_key(void)
{
KeyValue_Info KeyValueInfo;
unsigned char len = 0;
if(Read_RingStrEx(&Key_Value,(unsigned char *)&KeyValueInfo,&len) == 0)
{
if(len != sizeof(KeyValue_Info))
{
return;
}
if(KeyValueInfo.KeyGpNum < KeyGPCnt && KeyGpInfo[KeyValueInfo.KeyGpNum].KeyGPRun != NULL)
{
KeyGpInfo[KeyValueInfo.KeyGpNum].KeyGPRun();
}
else if(KeyValueInfo.KeyNum < KeyCnt)
{
if(KeyValueInfo.KeyStatus == SP && KeyInfo[KeyValueInfo.KeyNum].KeySPRun != NULL)
{
KeyInfo[KeyValueInfo.KeyNum].KeySPRun();
}
else if(KeyValueInfo.KeyStatus == LP && KeyInfo[KeyValueInfo.KeyNum].KeyLPRun != NULL)
{
KeyInfo[KeyValueInfo.KeyNum].KeyLPRun();
}
else if(KeyValueInfo.KeyStatus == LOOP && KeyInfo[KeyValueInfo.KeyNum].KeyLOOPRun != NULL)
{
KeyInfo[KeyValueInfo.KeyNum].KeyLOOPRun();
}
}
}
}
//監(jiān)聽函數(shù) --放在1ms循環(huán)里面執(zhí)行
void task_listen_key(void)
{
unsigned char i;
KeyValue_Info KeyValueInfo;
//單鍵檢測
for(i = 0; i < KeyCnt;i++)
{
if(KeyInfo[i].useFlg == KEY_USE)
{
CheckKey((Key_Num)i,KeyInfo[i].mode);
}
if(Get_keyValueX[i] == KEY_ON && Get_keyValue[i] == KEY_OFF && KeyGPFlag[i] == 0)
{
if(KeyInfo[i].mode == KEY_CLOCK)
{
#if DEBUG_PRINTF
//printf("非連發(fā)模式:key%d按鍵已松開,鍵入時間為%dMs\r\n",(unsigned char)i+1,Get_keyChooseTimeCnt[i]);
#endif
//短按
if((Get_keyChooseTimeCnt[i] != 0) && (Get_keyChooseTimeCnt[i] < LP_TIME) && (Get_keyChooseTimeCnt[i] >= SP_TIME))
{
KeyValueInfo.KeyNum = (Key_Num)i;
KeyValueInfo.KeyGpNum = (KeyGroup_Num)KeyGPCnt;
KeyValueInfo.KeyStatus = SP;
Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValueInfo));
}
//長按
else if((Get_keyChooseTimeCnt[i] != 0) && (Get_keyChooseTimeCnt[i] >= LP_TIME))
{
KeyValueInfo.KeyNum = (Key_Num)i;
KeyValueInfo.KeyGpNum = (KeyGroup_Num)KeyGPCnt;
KeyValueInfo.KeyStatus = LP;
Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValue_Info));
}
}
else if (KeyInfo[i].mode == KEY_NOCLOCK)
{
#if DEBUG_PRINTF
//printf("連發(fā)模式:key%d按鍵鍵入時間為%dMs 自動連發(fā)時間:%dMs\r\n",(unsigned char)i+1,Get_keyChooseTimeCnt[i],KeyInfo[i].AutoTime);
#endif
if(Get_keyChooseTimeCnt[i] != 0)
{
KeyValueInfo.KeyNum = (Key_Num)i;
KeyValueInfo.KeyGpNum = (KeyGroup_Num)KeyGPCnt;
KeyValueInfo.KeyStatus = LOOP;
Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValue_Info));
}
}
Get_keyChooseTimeCnt[i] = 0;
}
Get_keyValueX[i] = Get_keyValue[i];
}
//組合檢測
for(i = 0; i < KeyGPCnt;i++)
{
if(KeyGpInfo[i].useFlg == KEYGP_USE)
{
if(KeyGpInfo[i].GetKeyNumStrict == KEYSTRICT_OFF)
CheckKeyGP_NoStrict((KeyGroup_Num)i,KeyGpInfo[i]);
else if(KeyGpInfo[i].GetKeyNumStrict == KEYSTRICT_ON)
CheckKeyGP_Strict((KeyGroup_Num)i,KeyGpInfo[i]);
}
if(Get_keyGPStatusX[i] == KEYGP_OFF && Get_keyGPStatus[i] == KEYGP_ON)
{
#if DEBUG_PRINTF
//printf("組合 %d已觸發(fā)\r\n",(unsigned char)i+1);
#endif
KeyValueInfo.KeyNum = (Key_Num)KeyCnt;
KeyValueInfo.KeyGpNum = (KeyGroup_Num)i;
KeyValueInfo.KeyStatus = 0xFF;
Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValue_Info));
//完成一次組合,重置鍵值。
KeyGPStatusValueNow[i] = 0;
}
Get_keyGPStatusX[i] = Get_keyGPStatus[i];
}
}
/* TIM1 init PWM function */
void MX_TIM1_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 60-1;
htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED2;
htim1.Init.Period = 1000;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_MspPostInit(&htim1);
}
復(fù)制代碼
全部代碼51hei下載地址:
STM32F103C8T6.7z
(205.19 KB, 下載次數(shù): 107)
2021-1-25 18:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
ccnnzz315
時間:
2021-1-26 11:20
樓主,能上個原理圖嗎?還有,這個軟件,keil下,能用嗎?對于32位機,我是菜鳥,希望能多指教
作者:
WANGRUIQI
時間:
2021-1-28 16:32
ccnnzz315 發(fā)表于 2021-1-26 11:20
樓主,能上個原理圖嗎?還有,這個軟件,keil下,能用嗎?對于32位機,我是菜鳥,希望能多指教
不需要原理圖 你只要有單片機板子 在程序里更改IO口即可使用 程序經(jīng)過驗證是沒有問題的
作者:
WANGRUIQI
時間:
2021-1-28 16:32
ccnnzz315 發(fā)表于 2021-1-26 11:20
樓主,能上個原理圖嗎?還有,這個軟件,keil下,能用嗎?對于32位機,我是菜鳥,希望能多指教
就是基于KEIL的
作者:
850741536
時間:
2021-5-16 21:42
下載了,學(xué)習(xí)一下組合按鍵。
作者:
耿曉峰
時間:
2022-11-22 11:02
剛接觸STM32,誰給注釋下
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1