各位大佬好,在使用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
/*********************************************************************************************************/
报错信息如下:
|