找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4435|回复: 2
收起左侧

S3C2440开发板利用外部中断实现按钮切换不同功能

[复制链接]
ID:104126 发表于 2016-1-24 02:32 | 显示全部楼层 |阅读模式

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "mmu.h"
#include "stdio.h"

/*中断处理函数按下不同按钮进入该中断处理,并根据按下的不同按钮启动不同功能,实现功能控制面板的按钮功能*/
void __irq Eint_Isr(void)
{
  switch(rEINTPEND)
  {
    case 1<<13:  //功能1启动,同时关闭功能2
         rGPBDAT=0<<6|1<<7;
         rEINTPEND=1<<13;  //等待下一个自己的中断进入
         break;
    case 1<<14:  //功能2启动,同时关闭功能1
         rGPBDAT=1<<6|0<<7;
         rEINTPEND=1<<14;  //等待下一个自己的中断进入
         break;
    case 1<<8:  //关闭功能1和2
         rGPBDAT=1<<6|1<<7;
         rEINTPEND=1<<8;  //等待下一个自己的中断进入
         break;
    default:
         rGPBDAT=1<<6|1<<7;
         break;
  }
  ClearPending(BIT_EINT8_23);  //等待下一个该中断向量内的任意中断到来
}

/*设置启动后的默认功能*/
void Led_on()
{
     // 设置LED灯
   rGPBCON=0x155555;  //设置GPB为输出
   rGPBDAT=(0x1<<6)|(0x1<<7);   //GPB7脚置位,led灭
}


/*设置按钮出发方式*/
void Eint_func()
{
   // 按键中断源设置
   rGPGCON=(rGPGCON&~((0x3<<0)|(0x3<<10)|(0x3<<12)))|(0x1<<1)|(0x1<<11)|(0x1<<13); //设置GPG0、5、6脚为EINT8、13、14
   rGPGUP|=(0x1<<0)|(0x1<<5)|(0x1<<6);   //引脚使用第二功能
   rEXTINT1=rEXTINT1&~(0x7<<0);//|(0x1<<2);    //按钮1设置为低电平沿触发
   rEXTINT1=rEXTINT1&~(0x7<<20);//|(0x1<<22);  //按钮2设置为低电平沿触发
   rEXTINT1=rEXTINT1&~(0x7<<24);//|(0x1<<26);  //按钮3设置为低电平沿触发
}
                             
/*中断初始化*/
void Eint_init()
{
   rEINTMASK=rEINTMASK&~((0x1<<8)|(0x1<<13)|(0x1<<14));  // 使能外部中断屏蔽,为0时不屏蔽中断
   /*设置中断控制器*/
   rINTMOD&=~BIT_EINT8_23;  //设置中断模式为IRQ
   rINTMSK&=~BIT_EINT8_23;  //启动中断使能
}


/*中断挂起,等中断*/
void Eint_wait()
{
   rSRCPND=rSRCPND; //中断挂起寄存器清除
   rINTPND=rINTPND; //中断源挂起寄存器清除
   rEINTPEND|=(0x1<<8)|(0x1<<13)|(0x1<<14); //外部中断挂起寄存器,Eint13挂起等待中断
   rSRCPND=BIT_EINT8_23; //中断源挂起寄存器相应位置1等待中断
   rINTPND=BIT_EINT8_23; //中断挂起寄存器相应位置1等待中断
}


/*设置中断指针*/
void Eint_p()
{
   pISR_EINT8_23 =(U32)Eint_Isr;  //设置中断为Eint11响应
}


/*主程序开始*/
void Main()
{
//   isr_asm();  //使能CPSR寄存器的I位
   Led_on();  //启动时将led熄灭
   Eint_init(); //中断初始化
   Eint_func();  //中断触发状态初始化
   Eint_wait();  //等待中断
   Eint_p();    //中断指针
}


回复

使用道具 举报

ID:85743 发表于 2020-9-15 09:25 | 显示全部楼层
楼主能分别解释一下这些数字操作与实现功能的对应关系吗?谢谢!
1.png

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2020-9-16 01:20 | 显示全部楼层
vectorxu 发表于 2020-9-15 09:25
楼主能分别解释一下这些数字操作与实现功能的对应关系吗?谢谢!

这些都是位操作,C语言基础里面有介绍的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表