单片机
返回首页

TQ2440之按键中断

2016-04-22 来源:eefocus

这次是按键中断,首先呢,中断初始化方面确实比较麻烦。我自己设计的裸机程序是TQ板子上四个按键,当按键按下时触发一次中断,并且LED灯对应的就会亮,这里要赞一下TQ的板子,按键4用的是子中断,当时我调程序的时候发现每次只要我按下按键4就陷入死循环出不来了,后来文彬指点了一句会不会是子中断的问题一出口我就知道问题出在哪了,其实他是知道的,故意让我纠结一下,还好没让我纠结那么久。TQ2440之按键中断TQ2440之按键中断程序是我自己编的,有一开始自己写的有点乱然后后边整理了一下并且参考了别人编程的风格习惯所以就形成了我下面给出的程序,有在板子上运行处成功,关于一些头文件跟c文件就不说了,真正有心在做裸机的知道解决方法。
#include '2440addr.h'
#include'option.h'
 
    
#define LED1_ON (rGPBDAT &= ~(1<<5) ) //置0灯亮,置1灯灭
#define LED1_OFF (rGPBDAT |=(1<<5) ) 
#define LED2_ON (rGPBDAT &= ~(1<<6) )
#define LED2_OFF (rGPBDAT |=(1<<6) ) 
#define LED3_ON (rGPBDAT &= ~(1<<7) )
#define LED3_OFF (rGPBDAT |=(1<<7) ) 
#define LED4_ON (rGPBDAT &= ~(1<<8) )
#define LED4_OFF (rGPBDAT |=(1<<8) )        
   
void delay(void)
{
unsigned int i,j;
for(i=0;i<1000;i++)
for(j=0;j<6000;j++)//纯粹是为了灯亮的好看不会闪烁;
;
}
 
void __irq Key1_ISR(void)//提前定义,不然下边的pISR_EINT那里会报错,原因c语言检测不到函数定义
{
rSRCPND |= (1<<1);//清除中断标志位,下面相同
rINTPND |= (1<<1);
LED1_ON;
delay();
LED1_OFF;
}
 
void __irq Key2_ISR(void)
{
rSRCPND |= (1<<4);
rINTPND |= (1<<4);
rEINTPEND |= (1<<4);//使能EINT4,因为它是复用的,所以要加上这句
rEINTMASK &= (~(1<<4));//中断屏蔽
LED2_ON;
delay();
LED2_OFF;
}
 
void __irq Key3_ISR(void)
{
rSRCPND |= (1<<2);
rINTPND |= (1<<2);
LED3_ON;
delay();
LED3_OFF;
}
 
void __irq Key4_ISR(void)
{
rSRCPND |= (1<<0);
rINTPND |= (1<<0);
LED4_ON;
delay();
LED4_OFF;
}
 
void led_init(void)//初始化灯
{
rGPBCON = 0x15400;//全部设置为I/O输出
rGPBUP = 0x00;//使能上拉电阻
rGPBDAT |= (1<<5)|(1<<6)|(1<<7)|(1<<8);//先让灯全灭,不然看不到效果
}
 
void key_init(void)//初始化中断
{
rGPFCON |= (1<<1)|(1<<3)|(1<<5)|(1<<9); //设置寄存器为中断方式
rEXTINT0 |= (1<<1)|(1<<5)|(1<<9)|(1<<17);//设置外部中断为下降沿方式触发
rEINTMASK &= (~(1<<4));//EINT4中断有效 
rEINTPEND |= (1<<4);//写1清除EINT4中断标志位
rSRCPND |= (1<<0)|(1<<1)|(1<<2)|(1<<4);//EINT0、1、2、4等待请求服务
rINTMSK &= (~(1<<0))&(~(1<<1))&(~(1<<2))&(~(1<<4));//设置cpu服务EINT0、1、2、4
rINTPND |= (1<<0)|(1<<1)|(1<<2)|(1<<4);//优先级的问题,IRQ决定服务哪个哪个中断源先
pISR_EINT0 = (unsigned)Key4_ISR;
pISR_EINT1 = (unsigned)Key1_ISR;
pISR_EINT2 = (unsigned)Key3_ISR;
    pISR_EINT4_7 = (unsigned)Key2_ISR;//就是这里啦,报unsigned错误让我调了好几天的地方,这里是设置中断服务子程序地址
}
 
void Main(void)
{
MMU_Init();
led_init();//初始化灯
key_init();//初始化中断
while(1);//死循环,等待按键中断
}
 
 
最近比较懒,好久没开博客看看了,下次再把串口裸机程序发上来,做好了,可是懒得写。最近要复习期末考,做到nand flash的操作裸机程序就暂且放一放,等考完试后再把它完成之后就正式进入驱动的学习,同时可能会学习一下UC/OS ii。
进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章