完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 东风恶 于 2011-3-21 17:44 编辑
本人从单片机转向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 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(); } } }
|
|
相关推荐
|
|
谢谢,下来看看。
|
|
|
|
|
|
好东西,下来看看,谢谢分享
|
|
|
|
|
|
ubuntu ping 开发板存在严重的丢包情况,请问该怎么解决?
251 浏览 0 评论
12G-SDI高清视频开发案例,让4K视频采集更便捷!基于Xilinx MPSoC高性能平台
1395 浏览 0 评论
全志T507-H国产平台Ubuntu系统正式发布,让您的应用开发更便捷!
979 浏览 0 评论
全志T507-H国产平台Ubuntu系统正式发布,让您的应用开发更便捷!
29 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡-i2c与从设备通讯编程示例之i2c硬件原理
939 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-2 21:52 , Processed in 0.702879 second(s), Total 89, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号