📄 key.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 + -