关于mini2440的一个裸机程序——LED与按键中断
来源:互联网 发布:诺基亚5320下载软件 编辑:程序博客网 时间:2024/04/27 15:41
/* *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裸机程序的简单学习就不深入讨论了,因为我也是才开始学习,只是对一些东西知道,现在也不知道更好的解决方法。
- 关于mini2440的一个裸机程序——LED与按键中断
- 关于mini2440的一个裸机程序——LED与按键中断
- Mini2440 裸机实验之LED程序、按键、中断
- 基于mini2440的按键中断控制LED(裸机代码)
- mini2440裸机程序LED
- 2440裸机程序——按键中断
- 一个基于mini2440的测试按键与led灯的测试程序
- [2014.3.17]mini2440裸机跑马灯/按键点亮LED的C程序
- mini2440 按键中断LED 实验
- ARM裸机程序开发——按键控制LED灯
- mini2440按键中断控制led灯遇到的问题
- 关于mini2440按键中断的配置
- 基于mini2440的裸机led程序及其链接脚本分析
- 中断控制LED裸机程序
- ARM裸机——FS2410按键控制LED(中断方式)
- mini2440按键中断和LED gpio
- 【OK6410裸机程序】按键中断
- mini2440裸机程序测试第一部-LED
- 技术人员的归宿(来自团队的总结)
- Linux驱动编程 step-by-step (四)
- ubuntu 常用快捷键~收藏
- 转:【Excel技巧】Excel公式的错误值解释:# N/A!、#VALUE!、#DIV/O!#NUM!、#NULL!
- Linux驱动编程 step-by-step (五)
- 关于mini2440的一个裸机程序——LED与按键中断
- 网络分析优化Graph Partition算法初探
- 单服务器node.js和php性能测试
- OpenGL Programming Guide or 'The Red Book'
- BroadcastReceiver使用方式
- 用lua给wxEditor扩展显示相关变量信息
- Linux驱动编程 step-by-step (六)
- 动态规划之最长公共子序列问题
- DataSet&ListView分页和根据自己需要读取列数据,根据需要排列显示的位置或者可以说是顺序.[winform学习示例]