⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key_int.c

📁 本代码是基于三星2410的嵌入式开发实验程序代码,包括:ADC,CS8900A,KEY_GPIO,KEY_INT,LED,PWMDAC,UART
💻 C
字号:
#include "2410addr.h"

#define KEY1 (1 << 3)//GPG3,EINT11
#define KEY2 (1 << 6)//GPG6,EINT14//GPG7,EINT15
#define KEY3 (1 << 7)//GPG7,EINT15//GPG8,EINT16
#define KEY4 (1 << 11)//GPG11,EINT19

#define LED1 (1 << 4)//GPF4
#define LED2 (1 << 5)//GPF5
#define LED3 (1 << 6)//GPF6
#define LED4 (1 << 7)//GPF7

/*******************************************************************************************
函数原形:void __irq IRQ_KEY(void)
功能描述:键盘中断处理程序,当产生键盘中断后将读取键值,重新刷新LED显示
参    数:无			
*******************************************************************************************/
void __irq IRQ_KEY(void)
{
    unsigned int i;
    ClearPending(BIT_EINT8_23);
    rEINTPEND = 0xffffff;
    rGPGCON = rGPGCON & (~((3 << 6) | (3 << 12) | (3 << 14) | (3 << 22)));//设置为输入状态
    if (rGPGDAT & KEY1){//当KEY1被按下时,LED亮,否则灭
        rGPFDAT |= LED1;//熄灭LED1 
    }
    else {
        rGPFDAT &= ~LED1;//点亮LED1
    }
    if (rGPGDAT & KEY2){
        rGPFDAT |= LED2; 
    }
    else {
        rGPFDAT &= ~LED2; 
    }
    if (rGPGDAT & KEY3){
        rGPFDAT |= LED3; 
    }
    else {
        rGPFDAT &= ~LED3; 
    }
    if (rGPGDAT & KEY4){
        rGPFDAT |= LED4; 
    }
    else {
        rGPFDAT &= ~LED4; 
    }
    rGPGCON |= (2 << 6) | (2 << 12) | (2 << 14) | (2 << 22);//重新设置外部中断输入功能
}
 
/*******************************************************************************************
函数原形:void __irq IRQ_KEY(void)
功能描述:键盘中断初始化,将按键输入管脚设置成外部中断输入功能,双边沿触发,IRQ中断模式
参    数:无			
*******************************************************************************************/
void EINT_Init(void)
{
    rGPGCON &= (~((3 << 6) | (3 << 12) | (3 << 14) | (3 << 22)));
    rGPGCON |= (2 << 6) | (2 << 12) | (2 << 14) | (2 << 22);
    //rGPGCON[23:22],[15:14],[13:12],[7:6]=10b,即GPG[11,7,6,3]为外部中断输入功能
    rEXTINT1 = rEXTINT1 & (~((7 << 12) | (7 << 24) | (7 << 28))) | ((6 << 12) | (6 << 24) | (6 << 28));
    //EINT11,EINT14,EINT15下降沿触发中断	
    rEXTINT2 = rEXTINT2 & (~(7 << 12)) | (6 << 12);//EINT19下降沿触发中断	
    pISR_EINT8_23 = (unsigned int)IRQ_KEY;
    rPRIORITY = 0x00000000;	    // 使用默认的固定的优先级
	ClearPending(BIT_EINT8_23); // 清除中断标志位
    rEINTPEND = 0xffffff;
    rINTMOD = 0x00000000;	    // 所有中断均为IRQ中断
	rINTMSK &= (~BIT_EINT8_23); // 使能外部中断8_23 
	rEINTMASK &= (~((1 << 11) | (1 << 14) | (1 << 15) | (1 << 19)));//使用能EINT11,EINT14,EINT15,EINT17
}

void Main(void){ 
    rGPFCON = (rGPFCON & 0x00ff) | 0x5500;//设置GPF[7:4](LED[4:1])为输出功能
    rGPFDAT |= LED1 | LED2 | LED3 | LED4;
    EINT_Init();
    while (1);
}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -