/*
*File : main.c
*Description : When you press the key,
* the LED will show the key_value of key by the binary
* and produce the buzzer.
*Author : Cong
*Copyright : Cong
*
*
*History
*---------------------
*Rev :0.0
*Date :2011/11/26
*Creat.
*--------------------
*
*
*/
//--------------------Include Files------------------------------------//
#include "2440addr.h"
#include "2440slib.h"
//---------------------Define Valurable-------------------------------//
#define GLOBAL_CLK 1
#define LED1_ON ~(1<<5)
#define LED2_ON ~(1<<6)
#define LED3_ON ~(1<<7)
#define LED4_ON ~(1<<8)
#define LED1_OFF (1<<5)
#define LED2_OFF (1<<6)
#define LED3_OFF (1<<7)
#define LED4_OFF (1<<8)
#define BEEP 0
#define LED1 10
#define LED2 12
#define LED3 14
#define LED4 16
#define KEY1 0
#define KEY2 6
#define KEY3 10
#define KEY4 12
#define KEY5 14
#define KEY6 22
//--------------------Function Prototype------------------------------//
static void LEDKEY_port_init(void);
static void Show_num(int num);
static void Beep_run(void);
static void delay(unsigned int times);
static void __irq key_handler(void);
/*
*
*程序入口
*/
void Main(void)
{
LEDKEY_port_init();
while(1)
{
}
}
/*
*===================Function======================
* Name :Port_init
* Discription :init the GPIO
*=================================================
*/
static void LEDKEY_port_init(void)
{
//初始化LED与BEEP所要用到的IO 用到的这五个端口都配置为输出
rGPBCON &= ~((3<<BEEP)|(3<<LED1)|(3<<LED2)|(3<<LED3)|(3<<LED4));
rGPBCON |= (1<<BEEP)|(1<<LED1)|(1<<LED2)|(1<<LED3)|(1<<LED4);
//初始化KEY所用的IO 所有的KEY端口都初始化为中断方式
rGPGCON &= ~((3<<KEY1)|(3<<KEY2)|(3<<KEY3)|(3<<KEY4)|(3<<KEY5)|(3<<KEY6));
rGPGCON |= (2<<KEY1)|(2<<KEY2)|(2<<KEY3)|(2<<KEY4)|(2<<KEY5)|(2<<KEY6);
//中断初始化EINT8
// rEXTINT1 &=~((0xf)|(0xf<<12)|(0xf<<20)|(0xf<<24)|(0xf<<28)); //设置K1的低电平中断
rEXTINT1 &=~0xfff0f00f;
rEXTINT2 &=~(0xf<<12);
rEINTPEND |=(1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19); //清除K1的中断标志
rEINTMASK = ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //打开EINT8的中断使能
pISR_EINT8_23 = (U32)key_handler;
EnableIrq(BIT_EINT8_23);//外部中断8-23共用的中断位使能,与ClearPending对应
}
/*
*===================Function======================
* Name :Show_num
* Discription :init the GPIO of Key
*=================================================
*/
static void Show_num(int data)
{
if(data & 0x08) rGPBDAT = rGPBDAT&(LED4_ON);
else rGPBDAT = rGPBDAT|(LED4_OFF);
if(data & 0x04) rGPBDAT = rGPBDAT&(LED3_ON);
else rGPBDAT = rGPBDAT|(LED3_OFF);
if(data & 0x02) rGPBDAT = rGPBDAT&(LED2_ON);
else rGPBDAT = rGPBDAT|(LED2_OFF);
if(data & 0x01) rGPBDAT = rGPBDAT&(LED1_ON);
else rGPBDAT = rGPBDAT|(LED1_OFF);
}
/*
*===================Function======================
* Name :Beep_run
* Discription :produce the buzzer
*=================================================
*/
static void Beep_run(void)
{
rGPBDAT |= (0x1<<0);
delay(50);
rGPBDAT &= (0x0<<0);
delay(50);
}
/*
*===================Function======================
* Name :delay
* Discription :produce delay ,the time is times.
*=================================================
*/
static void delay(unsigned int times)
{
unsigned int i;
for(;times>0;times--)
{
for(i=400;i>0;i--);
}
}
/*
*===================Function======================
* Name :key_handler
* Discription :when the key is pressed,
* the IRQ service will be run.
*=================================================
*/
static void __irq key_handler(void)
{
Beep_run();
if(rEINTPEND & (1<<8))
{
rEINTPEND |=1<<8;
Show_num(1);
}
else if(rEINTPEND & (1<<11))
{
rEINTPEND |=1<<11;
Show_num(2);
}
else if(rEINTPEND & (1<<13))
{
rEINTPEND |=1<<13;
Show_num(3);
}
else if(rEINTPEND & (1<<14))
{
rEINTPEND |=1<<14;
Show_num(4);
}
else if(rEINTPEND & (1<<15))
{
rEINTPEND |=1<<15;
Show_num(5);
}
else if(rEINTPEND & (1<<19))
{
rEINTPEND |=1<<19;
Show_num(6);
}
ClearPending(BIT_EINT8_23); //用来清除中断标志位;针对全局的中断
}
实现的功能:当按下mini2440下键盘下的6个按键中的一个时,蜂鸣器发出声音,并且4个发光二极管将以2进制的形式显示出按键的值。其中要比较注意的是EINTPEND的清零是通过置“1”清零的。因为在一些情况下,置一可以1+1=10,可以达到比较高效的目的。
其中以上中断程序是比较有问题的,因为在中断服务程序中还有延时,这样对实时性十分不利,但是在此只是进行ARM裸机程序的简单学习就不深入讨论了,因为我也是才开始学习,只是对一些东西知道,现在也不知道更好的解决方法。