裸机程序开发之按键程序
在开发板中实现按键检测有2种方式,一种是轮询,另一种是中断,本章节将介绍中断方式。
CPU中的中断控制器可接收60种中断源,提供中断源的外设有:DMA控制器,UART,IIC,EINTn。本章节使用的中断是EINTn。以下是源码:
1 #include "def.h"
2 #include "option.h"
3 #include "2440addr.h"
4 #include "2440lib.h"
5 #include "2440slib.h"
6 #include "mmu.h"
7
8 void Delay(int time);
9 void Isr_Init(void);
10 void HaltUndef(void);
11 void HaltSwi(void);
12 void HaltPabort(void);
13 void HaltDabort(void);
14 U8 Key_Scan(void);
15 void __irq Key_ISR(void);
16 void KeyTest(void);
17
18 void Delay(int time)
19 {
20 U32 val = (PCLK>>3)/1000-1;
21
22 rTCFG0 &= ~(0xff<<8);
23 rTCFG0 |= 3<<8; //prescaler = 3+1
24 rTCFG1 &= ~(0xf<<12);
25 rTCFG1 |= 0<<12; //mux = 1/2
26 rTCNTB3 = val;
27 rTCMPB3 = val>>1; // 50%
28 rTCON &= ~(0xf<<16);
29 rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
30 rTCON &= ~(2<<16); //clear manual update bit
31 while(time--) {
32 while(rTCNTO3>=val>>1);
33 while(rTCNTO3<val>>1);
33 };
34 }
35
36 U8 Key_Scan( void )
37 {
38 Delay( 80 ) ;
39 if( (rGPGDAT&(1<< 0)) == 0 )
40 return 1 ;
41 else if( (rGPGDAT&(1<< 3)) == 0 )
42 return 2;
43 else if( (rGPGDAT&(1<< 5)) == 0 )
44 return 3 ;
45 else if( (rGPGDAT&(1<< 6)) == 0