📄 interrupt.c
字号:
#include "printf.h"
#include "interrupt.h"
int key_scan(void) {
int i;
for(i = 0; i < 1000 ;i++) ;
GPGDAT = (GPGDAT &(~((1<<6)|(1<<2)))) | (1<<6) | (0<<2) ; //GPG6,2 output 0
GPEDAT = (GPEDAT &(~((1<<13)|(1<<11)))) | (1<<13) | (1<<11) ; //GPE13,11 output 0
if( (GPFDAT&(1<< 0)) == 0 ) return 16 ;
else if( (GPFDAT&(1<< 2)) == 0 ) return 15 ;
else if( (GPGDAT&(1<< 3)) == 0 ) return 14 ;
else if( (GPGDAT&(1<<11)) == 0 ) return 13 ;
GPGDAT = (GPGDAT &(~((1<<6)|(1<<2)))) | (0<<6) | (1<<2) ; //GPG6,2 output 0
GPEDAT = (GPEDAT & (~((1<<13)|(1<<11)))) | (1<<13) | (1<<11) ; //GPE13,11 output 0
if( (GPFDAT&(1<< 0)) == 0 ) return 11 ;
else if( (GPFDAT&(1<< 2)) == 0 ) return 8 ;
else if( (GPGDAT&(1<< 3)) == 0 ) return 5 ;
else if( (GPGDAT&(1<<11)) == 0 ) return 2 ;
GPGDAT = (GPGDAT & (~((1<<6)|(1<<2)))) | (1<<6) | (1<<2) ; //GPG6,2 output 0
GPEDAT = (GPEDAT & (~((1<<13)|(1<<11)))) | (1<<13) | (0<<11) ; //GPE13,11 output 0
if( (GPFDAT&(1<< 0)) == 0 ) return 10 ;
else if( (GPFDAT&(1<< 2)) == 0 ) return 7 ;
else if( (GPGDAT&(1<< 3)) == 0 ) return 4 ;
else if( (GPGDAT&(1<<11)) == 0 ) return 1 ;
GPGDAT = (GPGDAT & (~((1<<6)|(1<<2)))) | (1<<6) | (1<<2) ; //GPG6,2 output 0
GPEDAT = (GPEDAT & (~((1<<13)|(1<<11)))) | (0<<13) | (1<<11) ; //GPE13,11 output 0
if( (GPFDAT&(1<< 0)) == 0 ) return 12 ;
else if( (GPFDAT&(1<< 2)) == 0 ) return 9 ;
else if( (GPGDAT&(1<< 3)) == 0 ) return 6 ;
else if( (GPGDAT&(1<<11)) == 0 ) return 3 ;
else return 0xff ;
}
void timer0_handler(void) {
//convert the status of the led
GPFDAT = ~(GPFDAT & (0xf << 4));
CLEAR_PENDING_REG(BIT_TIMER0);
return;
}
void key_handler(void) {
int key ;
GPGCON = (GPGCON & (~((3<<22)|(3<<6)))) | ((0<<22)|(0<<6)) ; // GPG11,3 set input
GPFCON = (GPFCON & (~((3<<4)|(3<<0)))) | ((0<<4)|(0<<0)) ; // GPF2,0 set input
key = key_scan();
if (key != 0xff) {
uart_printf( "K%d is pressed!\n", key ) ;
GPFDAT = ~(key << 4);
}
switch (INTPND) {
// Process k4~k6, k14; k1~k3, k13 interrupt
case BIT_EINT8_23:
/* Clear EINTPEND reg*/
if (EINTPEND & (1 << 11))
EINTPEND |= 1 << 11;
else if(EINTPEND & ( 1<<19 ))
EINTPEND |= 1 << 19;
/* Clear pending reg*/
CLEAR_PENDING_REG(BIT_EINT8_23);
break;
// Process k10~k12, k16 interrupt
case BIT_EINT0:
CLEAR_PENDING_REG(BIT_EINT0);
break;
// Process k7~k9, k15 interrupt
case BIT_EINT2:
CLEAR_PENDING_REG(BIT_EINT2);
break;
}
INIT_KEYBOARD_REG();
}
void init_irq(void) {
INIT_TIMER0(1);
// Set the led 9-12 output
SET_LED_REG_MODE(BIT_GPFCON8 | BIT_GPFCON10 | BIT_GPFCON12 | BIT_GPFCON14);
INIT_KEYBOARD_REG();
// Clear eint 11,19
CLEAR_EINTPEND_REG(BIT_EINTPEND_11 | BIT_EINTPEND_19);
// Enable EINT11,19
ENABLE_EINTMASK_REG(BIT_EINTMASK_11 | BIT_EINTMASK_19);
CLEAR_PENDING_REG(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);
ENABLE_INTMSK_REG(BIT_TIMER0 | BIT_EINT0 | BIT_EINT2 | BIT_EINT8_23);
//init the interrupt handler table
INT_EINT0 = INT_EINT2 = INT_EINT8_23 = (unsigned long) key_handler;
INT_TIMER0 = (unsigned long) timer0_handler;
return;
}
// void EINT_Handle( void ) {
// switch (INTPND) {
// // Process k4~k6, k14; k1~k3, k13 interrupt
// case BIT_EINT8_23:
// key_handler();
// /* Clear EINTPEND reg*/
// if (EINTPEND & (1 << 11))
// EINTPEND |= 1 << 11;
// else if(EINTPEND & ( 1<<19 ))
// EINTPEND |= 1 << 19;
// /* Clear pending reg*/
// CLEAR_PENDING_REG(BIT_EINT8_23);
// return ;
// // Process k10~k12, k16 interrupt
// case BIT_EINT0:
// key_handler();
// CLEAR_PENDING_REG(BIT_EINT0);
// return ;
// // Process k7~k9, k15 interrupt
// case BIT_EINT2:
// key_handler();
// CLEAR_PENDING_REG(BIT_EINT2);
// return ;
// // Process timer 0 interrupt
// // case BIT_TIMER0:
// // timer0_handler();
// // CLEAR_PENDING_REG(BIT_TIMER0);
// // return ;
// }
// }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -