入力ピンを最大化するために8-1 multiplexer
withを使用しようとしているので、プログラムを作成して のすべてのアドレスをスキャンし、割り込みが発生した場合はプログラムがこの時点で送信されたアドレスをチェックしてから LCD に文字列を出力するようにしました。 (そしてスイッチケースで管理) ...mega16
multiplexer
interrupt
問題は:: 割り込みが発生すると、スイッチケースに入り、開始したケースの下のすべてのケースを実行します
例: 最初のボタン (最初のアドレス) を押すと、すべてのケースが実行されますが、2 番目のボタンを押すと、そのケースと 3 番目のケースが実行されます。
int main(void)
{
//////////////////////
SETMUSK(MCUCR,ISC01);
/* When(ISC01 =1 and ISC00 =0 )The falling edge of INT0 generates an interrupt request. so we can use Internal PUll UP Resistance*/
CLEARMUSK(MCUCR,ISC00);
///////////////////////
GICR = 0x40;
CLEARMUSK(SFIOR,PUD); //Enabling Pull up resistor
DDRC = 0xFF;
LCD_Init();
DDRC = 0xFF;
DDRA = 0xFF;
DDRD = 0x00;
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
LCD_display_string("Program Starting !!");
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
sei(); // enabling global interrupt musk
while(1)
{
for (PORTA=0x00;PORTA <= 7;PORTA++) ;
//TODO:: Please write your application code
}
}
ISR(INT0_vect)/*sending the ISR address to the vector table using this statement here (INT0_vect)*/
{
switch (PINA)
{
case Addr0 :
{
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
LCD_display_string("First");
_delay_ms(200);
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
break;
}
case Addr1 :
{
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
LCD_display_string("Second");
_delay_ms(200);
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
break;
}
case Addr2 :
{
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
LCD_display_string("Third");
_delay_ms(200);
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
break;
}
case Addr3 :
{
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
LCD_display_string("Fourth");
_delay_ms(250);
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
break;
}
case Addr4 :
{
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
LCD_display_string("FiFth");
_delay_ms(250);
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
break;
}
case Addr5 :
{
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
LCD_display_string("sixth");
_delay_ms(250);
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
break;
}
case Addr6 :
{
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
LCD_display_string("seventh");
_delay_ms(250);
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
break;
}
case Addr7 :
{
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
LCD_display_string("eights");
_delay_ms(250);
LCD_send_command(CLEAR_DISPLAY_AND_RAM);
break;
}
//default:
//break;
}
}
MUX.h
{
#define Addr0 0x00 //00000000
#define Addr1 0x01 //00000001
#define Addr2 0x02 //00000010
#define Addr3 0x03 //00000011
#define Addr4 0x04 //00000100
#define Addr5 0x05 //00000101
#define Addr6 0x06 //00000110
#define Addr7 0x07 //00000111
}