PSoC 1中不同引脚的GPIO中断

时间:2014-04-24 06:38:51

标签: c embedded interrupt gpio psoc

我遇到了与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);
        }

    }
}

1 个答案:

答案 0 :(得分:0)

问题解决了!通常解决方案很简单:使用GPIO中断但测试按下了哪个按钮。 GPIO iterrupt:

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;
}