#include "s3c24xx.h"
#include "key_int.h"
#include "uart.h"
typedef void(*irq_func) (unsigned int);
irq_func irq_array[32];
void register_irq(int irq, irq_func fp){
irq_array[irq] = fp;
INTMSK &= ~(1<<irq);
}
void irq_solve(unsigned int val){
unsigned int bit = EINTPEND;
if(val == 0){ //外部中断0
if(GPFDAT & (1<<0)){ //松开
GPFDAT |= 1<<4;
}
else {
GPFDAT &= ~(1<<4);
}
}
if(val == 2){ //外部中断2
if(GPFDAT & (1<<2)){ //松开
GPFDAT |= 1<<5;
}
else GPFDAT &= ~(1<<5);
}
if(val == 5){ //外部中断11 或19
if(bit & 1<<11){ //中断11
if(GPGDAT & (1<<3)){ //松开
GPFDAT |= 1<<6;
}
else GPFDAT &= ~(1<<6);
}
else{
if(GPGDAT & (1<<11)){ //松开
GPFDAT |= 1<<4;
GPFDAT |= 1<<5;
GPFDAT |= 1<<6;
}
else{
GPFDAT &= ~(1<<4);
GPFDAT &= ~(1<<5);
GPFDAT &= ~(1<<6);
}
}
}
EINTPEND = bit;
}
void key_int_init(void){
GPFCON &= ~((3<<0) | (3<<4));
GPFCON |= ((2<<0) | (2<<4));
GPGCON &= ~((3<<6) | (3<<22));
GPGCON |= ((2<<6) | (2<<22));
EXTINT0 |= ((7<<0) | (7<<8)); //双边缘触发
EXTINT1 |= (7<<12);
EXTINT2 |= (7<<12);
EINTMASK &= ~((1<<11) | (1<<19));
register_irq(0,irq_solve);
register_irq(2,irq_solve);
register_irq(5,irq_solve);
}
void irq_handle_c(void){
unsigned int val = INTOFFSET;
irq_array[val](val);
SRCPND = 1<<val;
INTPND = 1<<val;
}