|
本人从单片机转向arm,现在在学习裸机,希望这个对初学者有用;
/******************************************************************************
*说明:本程序是一个简单的按键中断的程序,当有按键按下时,蜂鸣器发声。
*
*
*1X6 矩阵键盘
*六个输入引脚: EINT8 ---- (GPG0) --- K1
* EINT11 ---- (GPG3) --- K2
* EINT13 ---- (GPG5) --- K3
* EINT14 ---- (GPG6) --- K4
* EINT15 ---- (GPG7) --- K5
* EINT19 ---- (GPG11) --- K6
*内存运行地址: 0x30000000
*
*开发环境:mini2440
*编译环境:ADS V1.2
*
*
*作者:tianyi
*
*最后修改时间:2011.2.28
*
*版权所有:kfxy
*
*
******************************************************************************/
#define GLOBAL_CLK //相当于定义了FCLK,HCLK,PCLK,UCLK
#include "def.h"
#include "option.h"
#include "mmu.h"
#include "2440addr.h"
//#include "profile.h"
//#include "memtest.h"
//#include "2440lib.h"
//#include "2440slib.h"
static void __irq key_handler(void);
void delay(int times)
{
int i,j;
for(i=0;i<times;i++)
for(j=0;j<400;j++);
}
void beep_init(void)
{
//rGPBCON &= ~(0x3<<0);
rGPBCON |= (0x1<<0);
}
void beep_run(void)
{
rGPBDAT |= (0x1<<0);
delay(100);
rGPBDAT &= ~(0x1<<0);
delay(100);
}
void Key_Init(void)
{
rGPGCON &= ~(0x3<<0);
rGPGCON |= (0x2<<0);
rGPGCON &= ~(0x3<<6);
rGPGCON |= (0x2<<6);
rGPGCON &= ~(0x3<<10);
rGPGCON |= (0x2<<10);
rGPGCON &= ~(0x3<<12);
rGPGCON |= (0x2<<12);
rGPGCON &= ~(0x3<<14);
rGPGCON |= (0x2<<14);
rGPGCON &= ~(0x3<<22);
rGPGCON |= (0x2<<22); //设置外部引脚为第二功能(外部中断)
//rINTMOD |= (0x1<<5);
rINTMOD &= ~(0x1<<5); //设置为普通中断模式
rEXTINT1 &= ~((0x7<<0)|(0x7<<12)|(0x7<<20)|(0x7<<24)|(0x7<<28));//设置为低电平触发
rEXTINT2 &= ~(0x7<<12); //设置为低电平触发
rEINTMASK &=~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //设置外部中断屏蔽寄存器为disable
rINTMSK &= ~BIT_EINT8_23; //中断使能
pISR_EINT8_23=(U32)key_handler; //将中断服务函数的地址传给对应的中断向量表位置
EnableIrq(BIT_EINT8_23); //中断使能
}
int Main(void)
{
MMU_Init(); //初始化MMU,解决中断向量表入口地址与内存地址之间不一样的矛盾,进行地址的重映射
Key_Init(); //初始化按键设置相应的管脚为中断模式
beep_init();
return 0;
}
static void __irq key_handler(void)
{
/*判断是否是按键K1产生的中断*/
if(rINTPND==BIT_EINT8_23)
{
ClearPending(BIT_EINT8_23); //在中断服务函数中,需要清除相应的屏蔽寄存器
if(rEINTPEND&(1<<11))
{
rEINTPEND |= 1<< 11; //在中断服务函数中,需要清除相应的屏蔽寄存器
beep_run();
}
if(rEINTPEND&(1<<13))
{
rEINTPEND |= 1<< 13;
beep_run();
}
if(rEINTPEND&(1<<14))
{
rEINTPEND |= 1<< 14;
beep_run();
}
if(rEINTPEND&(1<<15))
{
rEINTPEND |= 1<< 15;
beep_run();
}
if(rEINTPEND&(1<<19))
{
rEINTPEND |= 1<< 19;
beep_run();
}
if(rEINTPEND&(1<<8))
{
rEINTPEND |= 1<< 8;
beep_run();
}
}
}
工程文件ourdev_618923TG14JA.rar(文件大小:110K) (原文件名:key_interrupt.rar) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|