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

📄 key.c

📁 嵌入式实验 软件:ARM Developer Suite v1.2 Multi-ICE V2.2.5(Build1319)
💻 C
字号:


//-----------------------------------------------------------------
// 包含文件区
//-----------------------------------------------------------------
#include "2410addr.h"


//-----------------------------------------------------------------
// 函数定义区
//-----------------------------------------------------------------
int i,j;//i表示行数j表示列数


static void __irq Eint2Int(void)
{
	i=2;
    j=Key_Int();//扫描列数
    Uart_Printf("THE KEY YOU PUSH IS %d row %d column\n",i,j);//根据键值完成功能
	//SRCPND EINT2 [2] = 1 : Requested
    rSRCPND = BIT_EINT2;
	
	//INTPND EINT2 [2] = 1 : Requested
    rINTPND = BIT_EINT2;
	
   
}
/*****************************************
 名称:Eint3Int()
 功能:外部中断3相应函数
 参数: void
 返回值:void
 *****************************************/
static void __irq Eint3Int(void)
{
	i=3;
    j=Key_Int();//扫描列数
    Uart_Printf("THE KEY YOU PUSH IS %d row %d column\n",i,j);//根据键值完成功能
	//SRCPND EINT3 [3] = 1 : Requested
    rSRCPND = BIT_EINT3; 

	//INTPND EINT3 [3] = 1 : Requested
    rINTPND = BIT_EINT3;
}

/*****************************************
 名称:Eint1Int()
 功能:外部中断1相应函数
  参数: void
 返回值:void
 *****************************************/
static void __irq Eint1Int(void)
{
	i=1;
    j=Key_Int();//扫描列数
    Uart_Printf("THE KEY YOU PUSH IS %d row %d column\n",i,j);//根据键值完成功能
	//SRCPND EINT7 [7] = 1 : Requested
    rSRCPND = BIT_EINT1; 

	//INTPND EINT7 [7] = 1 : Requested
	rINTPND = BIT_EINT1;
        
}
/*****************************************
 名称:Eint7_9Int()
 功能:外部中断7_9相应函数
  参数: void
 返回值:void
 *****************************************/
static void __irq Eint7_9Int(void)
{
    if(rEINTPEND==(1<<7))
    {
	i=4;
    j=Key_Int();
    Uart_Printf("THE KEY YOU PUSH IS %d row %d column\n",i,j);//根据键值完成功能
	rEINTPEND=(1<<7);
    }

	//SRCPND EINT7 [7] = 1 : Requested
    rSRCPND = BIT_EINT4_7; 

	//INTPND EINT7 [7] = 1 : Requested
    rINTPND = BIT_EINT4_7;
}

/*****************************************************************
*	函数名 	: Key_Test
*	功能  	: 实现中断方式基础上的键盘扫描
*   参数    : void
*   返回值  : void
******************************************************************/
void Key_Test(void)
{
	 //GPFCON GPF1 [3:2] = 10 : EINT1
	 //GPFCON GPF2 [3:2] = 10 : EINT2
	 //GPFCON GPF3 [3:2] = 10 : EINT3
	 //GPFCON GPF7 [3:2] = 10 : EINT7
	 rGPFCON = (rGPFCON & 0x3103)|(1<<3)|(1<<5)|(1<<15)|(1<<7);	

	 //GPGCON GPG7 [3:2] = 10 : EINT9
	 rGPGCON = (rGPGCON & 0xfffffff3)|(1<<3);

	 //EXTINT0 EINT1 [6 : 4] = 01X : 下降沿中断
	 //EXTINT0 EINT3 [14:12] = 01X : 下降沿中断
	 //EXTINT0 EINT2 [10: 8] = 01X : 下降沿中断
	 //EXTINT0 EINT7 [30:28] = 01X : 下降沿中断
	 rEXTINT0 = (rEXTINT0 & ~((7<<4)|(0x7<<12)  | (0x7<<8)|(0x7<<28))) | 0x2<<4 | 0x2<<8| 0x2<<28| 0x2<<12; 

	 //SRCPND EINT1 [1] = 1 : Requested
	 //SRCPND EINT2 [2] = 1 : Requested
	 //SRCPND EINT3 [3] = 1 : Requested
	 //SRCPND EINT7 [7] = 1 : Requested
	 rSRCPND = rSRCPND|0xe;

	 //GPBCON GPB7  [15:14] = 01 :OUTPUT
	 //GPBCON GPB8  [17:16] = 01 :OUTPUT
	 //GPBCON GPB9  [19:18] = 01 :OUTPUT
	 //GPBCON GPB10 [21:20] = 01 :OUTPUT
	 rGPBCON=rGPBCON|0x154000;
	 rGPBCON=rGPBCON&0x157fff;

	 //GPBDAT [10: 7] = 0000
	 rGPBDAT=rGPBDAT&0x7f;

	 //EINTPEND [1,2,3,7] = 0,0,0,0 : Requested
	 rEINTPEND = 0xffffff;

	 //SRCPND EINT1 [1] = 1 : Requested
	 //SRCPND EINT2 [2] = 1 : Requested
	 //SRCPND EINT3 [3] = 1 : Requested
	 //SRCPND EINT7 [7] = 1 : Requested
	 rSRCPND = BIT_EINT2|BIT_EINT1|BIT_EINT3|BIT_EINT4_7; //清除先前的状态位

	 //INTPND EINT7 [7] = 1 : Requested
	 //INTPND EINT3 [3] = 1 : Requested
	 //INTPND EINT2 [2] = 1 : Requested
	 //INTPND EINT1 [1] = 1 : Requested
	 rINTPND = BIT_EINT2|BIT_EINT1|BIT_EINT3|BIT_EINT4_7;
	    
	 //外部中断函数声明
	 pISR_EINT2=(unsigned)Eint2Int;
	 pISR_EINT1=(unsigned)Eint1Int;
	 pISR_EINT4_7=(unsigned)Eint7_9Int;
	 pISR_EINT3=(unsigned)Eint3Int;

	 Uart_Printf("\n\nPRESS ANY KEY ON ECPEND BOARD\n");  
	 Uart_Printf("\n\nPRESS ANY KEY OF PC TO STOP.\n");  
	 //EINTMASK EINT7 [7] = 0 : Enable Interrupt
	 //EINTMASK EINT9 [9] = 0 : Enable Interrupt
	 rEINTMASK=~( (1<<7)|(1<<9) );
 
	 //INTMSK EINT1   [1] = 0 : Service available
	 //INTMSK EINT2   [2] = 0 : Service available
	 //INTMSK EINT3   [3] = 0 : Service available
	 //INTMSK EINT4_7 [4] = 0 : Service available
	 rINTMSK=~(BIT_EINT2|BIT_EINT1|BIT_EINT3|BIT_EINT4_7);//中断开始工作
	 
	 //若有外部输入,种屏蔽中断
	 Uart_Getch();

	 //EINTMASK EINT7 [7] = 1 : Masked	
	 //EINTMASK EINT9 [9] = 1 : Masked	
	 rEINTMASK=0xffffff;

	 //INTMSK EINT1   [1] = 1 : Masked
	 //INTMSK EINT2   [2] = 1 : Masked
	 //INTMSK EINT3   [3] = 1 : Masked
	 //INTMSK EINT4_7 [4] = 1 : Masked
	 rINTMSK=BIT_ALLMSK;
	 Uart_Printf("\n\nTEST FINISHED!!");  
 }
/*****************************************************************
*	函数名 	: Key_Int
*	功能  	: 键盘扫描确定列数
*   参数    : void
*   返回值  : j
******************************************************************/
int Key_Int(void)
{
     //开始扫描各列
     //GPBDAT [10,9,8,7] = 0001 扫描第1列
 	 rGPBDAT=rGPBDAT|0x80;
     rGPBDAT=rGPBDAT&0x6ff;
     rGPBDAT=rGPBDAT&0x5ff;  
     rGPBDAT=rGPBDAT&0x3ff;
        if(!(~(rGPFDAT|0xffffff71))){j=1;}//判断是否第1列
		else
        	{ 
        	//GPBDAT [10,9,8,7] = 0010 扫描第2列
        	rGPBDAT=rGPBDAT&0x77f;
            rGPBDAT=rGPBDAT|0x100; 
            rGPBDAT=rGPBDAT&0x5ff;
            rGPBDAT=rGPBDAT&0x3ff;
             if(!(~(rGPFDAT|0xffffff71))){j=2;}//判断是否第2列
			 else
			 	{
				 //GPBDAT [10,9,8,7] = 0100 扫描第3列
				 rGPBDAT=rGPBDAT&0x77f;
                 rGPBDAT=rGPBDAT&0x6ff;
                 rGPBDAT=rGPBDAT|0x200;
                 rGPBDAT=rGPBDAT&0x3ff;
                   if(!(~(rGPFDAT|0xffffff71))){j=3;}//判断是否第3列
				   else
				   	{j=4;//以上条件不符合则为第4列
				   	//下面代码仅保证对应的LED亮
				   	//GPBDAT [10,9,8,7] = 1000 扫描第4列
				   	rGPBDAT=rGPBDAT&0x77f;
                    rGPBDAT=rGPBDAT&0x6ff;
                    rGPBDAT=rGPBDAT&0x5ff;
                    rGPBDAT=rGPBDAT|0x400;
				   	}
  			    }
		 }//打印结果
		 Delay(1);  //延迟以消除抖动
		 return (j);//返回列值
}
         




⌨️ 快捷键说明

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