0

GPIO 割り込みに関連する問題に直面しました。タスクはシンプルな UI インターフェイスを作成することなので、3 つのボタンを使用する必要があります。問題は、さまざまなピンに GPIO 割り込みを使用する方法を理解できず、すべてのボタンが同じように機能することです。

コードは次のとおりです。

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int value; // the actual value which is used in the module
    char string[16]; // string that is printed in LCD for user
} UI_ELEMENT;

#define FIRST_LEVEL 3
#define SECOND_LEVEL 3

#define PWM 0
#define PGA 1
#define ADC 2

#define PWM_STATE 0
#define PWM_PERIOD 1
#define PWM_WIDTH 2

#define PWM_STATE_OFF 0
#define PWM_STATE_ON 1

volatile int buttonRightPressed = 0;

#pragma interrupt_handler buttonRightInt
void buttonRightInt(void){
    // disable button interrupt
    M8C_DisableIntMask(INT_MSK0, INT_MSK0_GPIO);
    buttonRightPressed = 1;
}

void initialize_LCD(void){
    LCD_Position(0,0);
    LCD_PrCString("PWM");
    LCD_Position(1,0);
    LCD_PrCString("<    select    >");
}

void update_LCD(int* lvl1){
    if (*lvl1 == PWM || *lvl1 == 3){
        LCD_Position(0,0);
        LCD_PrCString("PWM");
        *lvl1 = 0;
    }
    else if (*lvl1 == PGA){
        LCD_Position(0,0);
        LCD_PrCString("PGA");
    }
    else if (*lvl1 == ADC){
        LCD_Position(0,0);
        LCD_PrCString("ADC");
    }
}

void main(void)
{
    UI_ELEMENT userInterface[FIRST_LEVEL][SECOND_LEVEL];
    int level_1_steper = PWM;
    int i;

    M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
    PWM8_EnableInt();
    LCD_Start();
    M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);

    initialize_LCD(); // set 'PWM' for upper row, '< select >' for lower row 

    while (1){
        if (buttonRightPressed == 1){
            for ( i = 0; i < 350; i++);
            level_1_steper++;
            update_LCD(&level_1_steper);
            buttonRightPressed = 0;
            // enable button interrupt again
            M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
        }

    }
}
4

1 に答える 1

0

問題解決!通常、解決策は非常に簡単です。GPIO 割り込みを使用しますが、どのボタンが押されたかをテストします。GPIO 割り込み:

void buttonInt(void){ // disable button interrupt 
     M8C_DisableIntMask(INT_MSK0, INT_MSK0_GPIO);
     if (Right_Data_ADDR & Right_MASK) buttonRightPressed = 1;
     if (Left_Data_ADDR & Left_MASK) buttonLeftPressed = 1;
     if (Select_Data_ADDR & Select_MASK) buttonSelectPressed = 1;
}
于 2014-12-29T08:28:21.043 に答える