各位大佬好,在使用STM8的時候遇到一個問題,想用比較簡便的方法解決:
/* 目標:想使用一個撥碼開關來控制所有的按鍵鎖定:
1.在任何時候,只要【撥碼開關】置“0”,按鍵輸入就無效;
2.在任何時候,只有【撥碼開關】置“1”,按鍵輸入才有效。
(個人想法:能不能在 #define 一個名詞(Ka)的時候,讓它先判斷【撥碼開關 BM1 】的狀態,符合條件再對【按鍵 K1 】讀取。)
然后再使用這個名詞,在函數里完成【按鍵 K1 】的狀態讀取,按照這種思路,我目前的寫法,編譯時報錯。
請教各位大佬,有沒有比較簡便的方法來實現這種功能,不局限于STM8,STM32也可以。謝謝!*/
//以下基于STM8。使用的軟件是 IAR
#include <stm8s.h>
#include <stm8s_gpio.h>
//【按鍵】說明K1為:讀取PC1口 輸入數據(為0或者不為0)
#define K1 (GPIO_ReadInputData(GPIOC)&GPIO_PIN_1)
//【燈】燈L1亮_滅,PB3口高電平時控制三極管導通燈亮,低電平時三極管關斷燈滅
#define ON 1
#define OFF 0
#define L1(ON_OFF) if(ON_OFF==ON)GPIO_WriteHigh(GPIOB, GPIO_PIN_3);\
else GPIO_WriteLow(GPIOB, GPIO_PIN_3)
//【撥碼開關】 說明BM1為:讀取PB6口 輸入數據(為0或者不為0)
#define BM1 (GPIO_ReadInputData(GPIOB)&GPIO_PIN_6)
//用【撥碼開關】作為按鍵鎖定:當BM1不為0(撥碼開關置“1”)時,讀取【按鍵 K1 】輸入。
#define Ka if(BM1!=0)GPIO_ReadInputData(GPIOC)&GPIO_PIN_1
//IO口初始化
void GPIO_Config()
{
/燈L1初始化:PB3低電平輸出
GPIO_Init(GPIOB, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
//按鍵初始化:PC1無中斷無浮點上拉輸入
GPIO_Init(GPIOC, GPIO_PIN_1, GPIO_MODE_IN_PU_NO_IT);
//撥碼開關初始化:PB6無中斷無浮點上拉輸入
GPIO_Init(GPIOB, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT);
}
//主函數
int main(void)
{
GPIO_Config(); //IO口初始化
while(1)
{
if(K1==0) //檢測【按鍵 K1 】狀態,按下時為“0”,松開時不為“0”
{
L1(OFF); //【燈 L1】滅
}
if(Ka!=0)
{
L1(ON);
}
}
}
//STM8解決u8/u32定義報錯問題
#ifdef USE_FULL_ASSERT
void assert_failed(u8* file, u32 line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
/*********************************************************************************************************/
報錯信息如下:
屏幕截圖(59).png (68.55 KB, 下載次數: 77)
下載附件
2021-5-14 18:26 上傳
|