[英]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`
之后,我以HAL功能眾所周知的方式調整了繼電器狀態(“ GPIO PIN STATUS”)。 例如,在每個缸中,我使用微控制器引腳設置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循環代替所有這些語句嗎? 例如,我想編寫如下代碼:
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 ...
};
然后,您可以使用數組中的索引來獲取端口/引腳數據,並對其進行戳戳:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.