如何使用字符数组更改我的函数输入
How can I change my function inputs with chracter array
大家好,我正在使用 Keil MicroVision IDE 在 STM32Fxx 微处理器上编写嵌入式 C 代码。在我的项目中,我使用了 8 个继电器。我用以下代码示例清除了每个继电器。
#define DO9_Pin GPIO_PIN_14
#define DO9_GPIO_Port GPIOC
#define DO8_Pin GPIO_PIN_15
#define DO8_GPIO_Port GPIOC
#define DO7_Pin GPIO_PIN_1
#define DO7_GPIO_Port GPIOA
#define DO6_Pin GPIO_PIN_0
#define DO6_GPIO_Port GPIOA
#define DO5_Pin GPIO_PIN_7
#define DO5_GPIO_Port GPIOB
#define DO4_Pin GPIO_PIN_6
#define DO4_GPIO_Port GPIOB
#define DO3_Pin GPIO_PIN_5
#define DO3_GPIO_Port GPIOB
#define DO2_Pin GPIO_PIN_1
#define DO2_GPIO_Port GPIOB
#define DO1_Pin GPIO_PIN_4
#define DO1_GPIO_Port GPIOA
#define DO0_Pin GPIO_PIN_3
#define DO0_GPIO_Port GPIOA`
之后我调整了 Relay status("GPIO PIN STATUS") 与 HAL Functions 众所周知。例如,在每个循环中,我正在使用微控制器引脚设置我的 9 个继电器的状态,为此我正在使用此代码块`
void prsSetResetRelays(unsigned char coilNo,char status){
if(coilNo==0){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO0_GPIO_Port,DO0_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO0_GPIO_Port,DO0_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==1){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO1_GPIO_Port,DO1_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO1_GPIO_Port,DO1_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==2){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO2_GPIO_Port,DO2_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO2_GPIO_Port,DO2_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==3){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO3_GPIO_Port,DO3_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO3_GPIO_Port,DO3_Pin,GPIO_PIN_RESET);
}
}else if(coilNo==4){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO4_GPIO_Port,DO4_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO4_GPIO_Port,DO4_Pin,GPIO_PIN_RESET);
}
}else if(coilNo==5){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO5_GPIO_Port,DO5_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO5_GPIO_Port,DO5_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==6){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO6_GPIO_Port,DO6_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO6_GPIO_Port,DO6_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==7){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO7_GPIO_Port,DO7_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO7_GPIO_Port,DO7_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==8){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO8_GPIO_Port,DO8_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO8_GPIO_Port,DO8_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==9){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO9_GPIO_Port,DO9_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO9_GPIO_Port,DO9_Pin,GPIO_PIN_RESET);
}
}
}
我的问题是这样的。我有什么办法可以以更短的形式减少这段代码。我可以使用 for 循环,而不是这个 all 语句吗?例如我想写这样的代码:`
for(int i=0;i<10;i++){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO[i]_GPIO_Port,DO[i]_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO[i]_GPIO_Port,DO[i]_Pin,GPIO_PIN_RESET);
}
}
我有什么办法可以用c 编程语言来做这种表示法吗?提前致谢。
您不能索引预处理器名称,不。它们不是运行时变量,它们严格用于在编译器看到代码之前进行文本替换。
正确的解决方案是将继电器阵列建模为阵列:
static const struct {
GPIO_TypeDef *port;
uint16_t pin;
} relays[] = {
{ GPIOC, GPIO_PIN_14 },
{ GPIOC, GPIO_PIN_15 },
... more here ...
};
然后就可以使用数组的索引得到port/pin数据,戳一下:
void prsSetResetRelays(unsigned char coilNo, char status)
{
if(coilNo >= sizeof relays / sizeof *relays)
return;
HAL_GPIO_WritePin(relays[coilNo].port, relays[coilNo].pin,
(status == 's' || status == 'S') ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
大家好,我正在使用 Keil MicroVision IDE 在 STM32Fxx 微处理器上编写嵌入式 C 代码。在我的项目中,我使用了 8 个继电器。我用以下代码示例清除了每个继电器。
#define DO9_Pin GPIO_PIN_14
#define DO9_GPIO_Port GPIOC
#define DO8_Pin GPIO_PIN_15
#define DO8_GPIO_Port GPIOC
#define DO7_Pin GPIO_PIN_1
#define DO7_GPIO_Port GPIOA
#define DO6_Pin GPIO_PIN_0
#define DO6_GPIO_Port GPIOA
#define DO5_Pin GPIO_PIN_7
#define DO5_GPIO_Port GPIOB
#define DO4_Pin GPIO_PIN_6
#define DO4_GPIO_Port GPIOB
#define DO3_Pin GPIO_PIN_5
#define DO3_GPIO_Port GPIOB
#define DO2_Pin GPIO_PIN_1
#define DO2_GPIO_Port GPIOB
#define DO1_Pin GPIO_PIN_4
#define DO1_GPIO_Port GPIOA
#define DO0_Pin GPIO_PIN_3
#define DO0_GPIO_Port GPIOA`
之后我调整了 Relay status("GPIO PIN STATUS") 与 HAL Functions 众所周知。例如,在每个循环中,我正在使用微控制器引脚设置我的 9 个继电器的状态,为此我正在使用此代码块`
void prsSetResetRelays(unsigned char coilNo,char status){
if(coilNo==0){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO0_GPIO_Port,DO0_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO0_GPIO_Port,DO0_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==1){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO1_GPIO_Port,DO1_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO1_GPIO_Port,DO1_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==2){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO2_GPIO_Port,DO2_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO2_GPIO_Port,DO2_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==3){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO3_GPIO_Port,DO3_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO3_GPIO_Port,DO3_Pin,GPIO_PIN_RESET);
}
}else if(coilNo==4){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO4_GPIO_Port,DO4_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO4_GPIO_Port,DO4_Pin,GPIO_PIN_RESET);
}
}else if(coilNo==5){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO5_GPIO_Port,DO5_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO5_GPIO_Port,DO5_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==6){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO6_GPIO_Port,DO6_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO6_GPIO_Port,DO6_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==7){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO7_GPIO_Port,DO7_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO7_GPIO_Port,DO7_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==8){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO8_GPIO_Port,DO8_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO8_GPIO_Port,DO8_Pin,GPIO_PIN_RESET);
}
}
else if(coilNo==9){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO9_GPIO_Port,DO9_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO9_GPIO_Port,DO9_Pin,GPIO_PIN_RESET);
}
}
}
我的问题是这样的。我有什么办法可以以更短的形式减少这段代码。我可以使用 for 循环,而不是这个 all 语句吗?例如我想写这样的代码:`
for(int i=0;i<10;i++){
if(status=='s' || status=='S'){
HAL_GPIO_WritePin(DO[i]_GPIO_Port,DO[i]_Pin,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(DO[i]_GPIO_Port,DO[i]_Pin,GPIO_PIN_RESET);
}
}
我有什么办法可以用c 编程语言来做这种表示法吗?提前致谢。
您不能索引预处理器名称,不。它们不是运行时变量,它们严格用于在编译器看到代码之前进行文本替换。
正确的解决方案是将继电器阵列建模为阵列:
static const struct {
GPIO_TypeDef *port;
uint16_t pin;
} relays[] = {
{ GPIOC, GPIO_PIN_14 },
{ GPIOC, GPIO_PIN_15 },
... more here ...
};
然后就可以使用数组的索引得到port/pin数据,戳一下:
void prsSetResetRelays(unsigned char coilNo, char status)
{
if(coilNo >= sizeof relays / sizeof *relays)
return;
HAL_GPIO_WritePin(relays[coilNo].port, relays[coilNo].pin,
(status == 's' || status == 'S') ? GPIO_PIN_SET : GPIO_PIN_RESET);
}