您的位置 首页 知识

TQ2440之按键中止

这次是按键中断,首先呢,中断初始化方面确实比较麻烦。我自己设计的裸机程序是TQ板子上四个按键,当按键按下时触发一次中断,并且LED灯对…

这次是按键中止,首要呢,中止初始化方面的确比较费事。我自己规划的裸机程序是TQ板子上四个按键,当按键按下时触发一次中止,而且LED灯对应的就会亮,这儿要赞一下TQ的板子,按键4用的是子中止,其时我调程序的时分发现每次只需我按下按键4就堕入死循环出不来了,后来文彬指点了一句会不会是子中止的问题一出口我就知道问题出在哪了,其实他是知道的,成心让我纠结一下,还好没让我纠结那么久。程序是我自己编的,有一开始自己写的有点乱然后后边整理了一下而且参阅了他人编程的风格习气所以就形成了我下面给出的程序,有在板子上运转处成功,关于一些头文件跟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。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/262576.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部