×
单片机 > 单片机程序设计 > 详情

基于mini2440的按键中断控制LED(裸机代码)

发布时间:2024-06-17 发布时间:
|

#define GLOBAL_CLK //相当于定义了FCLK,HCLK,PCLK,UCLK

#include "def.h"

#include "option.h"

#include "mmu.h"

#include "2440addr.h"

#define LED1_on rGPBDAT = ((0xf<<5)^(1<<5)) //GPB5=0

#define LED2_on rGPBDAT = ((0xf<<5)^(1<<6)) //GPB6=0

#define LED3_on rGPBDAT = ((0xf<<5)^(1<<7)) //GPB7=0

#define LED4_on rGPBDAT = ((0xf<<5)^(1<<8)) //GPB8=0

#define LED1_3_on rGPBDAT = ((0xf<<5)^(5<<5)) //GPB5=0,GPB7=0

#define LED2_4_on rGPBDAT = ((0xf<<5)^(5<<6)) //GPB6=0,GPB8=0

#define LED_off rGPBDAT = (0xf<<5) //GPB5=1,GPB6=1,GPB7=1,GPB8=1

#define LED_on rGPBDAT = ~(0xf<<5) //GPB5=0,GPB6=0,GPB7=0,GPB8=0

static void __irq key_handler(void); //声明按键中断服务程序

/************************************

延时函数

*************************************/

void delay(int times)

{

int i,j;

for(i=0;i

for(j=0;j<400;j++);

}

/************************************

LED初始化

*************************************/

void led_init(void)

{

rGPBUP = (0xf<<5); //禁止上拉电阻

rGPBCON = ((1<<16)|(1<<14)|(1<<12)|(1<<10)); //GPB5-8设为输出

LED_on;

delay(5); //延时

LED_off;

}

/************************************

按键初始化函数

*************************************/

void Key_Init(void)

{

rGPGUP = ((1<<11)|(1<<7)|(1<<6)|(1<<5)|(1<<3)|(1<<0)); //禁止上拉电阻

rGPGCON = ((1<<23)|(1<<15)|(1<<13)|(1<<11)|(1<<7)|(1<<1)); //设置GPG0-3-5-6-7-11端口为中断模式

rINTMOD &= ~(0x1<<5); //设置(INTMOD寄存器的EINT8_23)为普通中断模式

rEXTINT1 &= ~((0x7<<0)|(0x7<<12)|(0x7<<20)|(0x7<<24)|(0x7<<28));//设置EINT8-11-13-14-15为低电平触发

rEXTINT2 &= ~(0x7<<12); //设置中断触发方式的EINT19[6:4]=000为低电平触发

rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //设置外部中断屏蔽寄存器为disable

rINTMSK &= ~BIT_EINT8_23; //中断屏蔽寄存器相应位写入0使EINT8_23中断使能

/*设置ISR*/

pISR_EINT8_23=(U32)key_handler; //将中断服务函数的地址传给对应的中断向量表位置

EnableIrq(BIT_EINT8_23); //EINT8_23中断使能

}

/************************************

主函数

*************************************/

int Main(void)

{

MMU_Init(); //初始化MMU,解决中断向量表入口地址与内存地址之间不一致问题,进行地址的重映射

Key_Init(); //按键初始化

led_init(); //LED初始化

return 0;

}

/************************************

按键中断处理函数

*************************************/

static void __irq key_handler(void) //关键字__irq用来声明该函数一个IRQ中断服务程序,

//编译器便会自动在该函数内部增加中断现场保护的代码

{

/*判断是否是按键K1产生的中断*/

if(rINTPND==BIT_EINT8_23) //判断EININT8_23是否已经接受中断服务

{

ClearPending(BIT_EINT8_23); //在中断服务函数中清除相应的屏蔽寄存器(SRCPNG和INTPNG相应位写入1)

LED_off; //关闭所有LED

if(rEINTPEND&(1<<8)) //判断K1(EINT8)是否已经产生中断,相应EINTPEND位自动置1

{

rEINTPEND |= 1<< 8; //写入1清除EINTPEND寄存器相应位为下次中断做准备

LED1_on;

}

if(rEINTPEND&(1<<11))

{

rEINTPEND |= 1<< 11;

LED2_on;

}

if(rEINTPEND&(1<<13))

{

rEINTPEND |= 1<< 13;

LED3_on;

}

if(rEINTPEND&(1<<14))

{

rEINTPEND |= 1<< 14;

LED4_on;

}

if(rEINTPEND&(1<<15))

{

rEINTPEND |= 1<< 15;

LED1_3_on;

}

if(rEINTPEND&(1<<19))

{

rEINTPEND |= 1<< 19;

LED2_4_on;

}

}

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR M16实验之六 DS18B20测温