1/********************************************************************
2 * enable bit cleaning for PIO-key-INT
3 *
4 * when any of the 4 key is down,interrupt will occured,and check the
5 * edge-capture-register to determine which key is down
6 *
7 * during INT register initial, bit clean should be done once.
8 * During ISR,bit clean should NOT be done(Line 48);INT disable/enable is useless(Line 41/72).
9 *
10 *
11 * 2012-4-16 Lefroy Guo
12 *
13********************************************************************/1415 #include <stdio.h>
16 #include "../inc/sopc.h"17 #include <system.h>
18 #include <unistd.h>
1920//*******************************************************************
212223// comment this line because there is no need to store key pressed imformation
24//unsigned int key_flag = 0x0; // 4bit for 4 key. 0->UP, 1->DOWN2526void blink(unsigned int times)
27{
28 unsigned int i;
29for(i=0;i<times;i++)
30 {
31 LED->DATA = 0xf;
32 usleep(50000);
33 LED->DATA = 0x0;
34 usleep(50000);
35 }
36}
3738void ISR_KEY(void *context,unsigned long id)
39{
40 unsigned int i;
41 KEY->INTERRUPT_MASK = 0x0; // disable INT42 usleep(20000); // delay 20ms43for(i=0;i<4;i++)
44 {
45if(((KEY->EDGE_CAPTURE>>(3-i))&1) == 1)
46 {
47// (3-i)bit of key 's INT is occur,without knowing posedge or negedge!
48// KEY->EDGE_CAPTURE |= 1<<(3-i); // Should NOT be done 49if(((KEY->DATA>>(3-i))&1) == 0)
50 {
51// (3-i)bit of key is down
52// ((key_flag>>(3-i))&1) |= 1;
53// mark key_flag (3-i) bit to 1, meaning this bit(3-i) of key is down54 LED->DATA |= 1<<(3-i);
55// set corresponding bit of led to high56 }
57else58 {
59// (3-i)bit of key is down
60// ((key_flag>>(3-i))&1) &= 0;
61// mark key_flag (3-i) bit to 0, meaning this bit(3-i) of key is up62 LED->DATA &= ~(1<<(3-i));
63// set corresponding bit of led to low64 }
65 }
66// else
67// {
68//// (3-i)bit of key 's INT is NOT occur, nothing happend to this bit key
69// }7071 }
72 KEY->INTERRUPT_MASK = 0xF; // enable INT73}
7475int init_KEY(void) // Declaration the KEY_INT's ISR76{
77 KEY->INTERRUPT_MASK = 0xF; // enable INT78 KEY->EDGE_CAPTURE = 0xF; // clear all pending bit79return alt_irq_register(PIO_KEY_IRQ,NULL,ISR_KEY);
80}
8182void main()
83{
84 printf("*************************************************\n");
85 blink(3);
86 init_KEY();
87 usleep(1000000);
88 blink(3);
8990while(1);
91 reture(0);
92 }