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

📄 key_matrix.c

📁 LPC900_jianpan键盘中断检测程序
💻 C
字号:
/*******************************************
*文件名:	Key_Matrix.C
*Copyright:	www.zlgmcu.com
*日期:		13:44 04-3-8
*功能:		可中断型键盘矩阵的示例代码
*******************************************/
#include "reg932.h"
#define	uchar	unsigned char

uchar	Result;
uchar	Row[3];
uchar	Column[3];
uchar	Matrix[0x10]={	0xEE,0xED,0xEB,0xE7,		//11101110,11101101,11101011,11100111,
			0xDE,0xDD,0xDB,0xD7,		//11011110,11011101,11011011,11010111,
			0xBE,0xBD,0xBB,0xB7,		//10111110,10111101,10111011,10110111,
			0x7E,0x7D,0x7B,0x77};		//01111110,01111101,01111011,01110111,

void 	Power_Down();
void	KeyISR_Init();
void 	ReadKey();
void	Delay();
void	Delayus();

//-------------------------------------------
//功能:键盘中断处理程序
//-------------------------------------------
void	KEY_ISR() interrupt	7{
	EA=0;

	PCONA=0x00;					//外部功能模块上电
	ReadKey();					//读键盘
	switch(Result){					//判断读取的值
		case	0xEE:				//如果读取的值为0xEE,则表示KEY1键按下
	//这里可添加你的处理程序
			break;
		case	0xEB:				//如果读取的值为0xEB则表示KEY3键按下
	//这里可添加你的处理程序
			break;
		default:
			break;
		}
	
	KBCON=0;
	EA=1;
}

//-------------------------------------------
//功能:主函数
//-------------------------------------------
main()
{
	P0M1=0x00;					//设置P0口
	P0M2=0x00;			

	KeyISR_Init();					//键盘中断初始化
	while(1);
	{
	Power_Down();					//完全掉电
	}
}
//-------------------------------------------
//功能:掉电
//-------------------------------------------
void	Power_Down()
{
	PCONA=0xFF;					//外部功能模块掉电
	PCON=0x03;					//完全掉电
}
//-------------------------------------------
//功能:键盘中断初始化程序
//-------------------------------------------
void	KeyISR_Init()
{
	KBMASK=0x0F;					//设置P03->P00为中断源
	KBCON=0x00;					//清除键盘中断标志
	P0=P0&0x0F;					//P07->P04作输出,先使其输出0000xxxxB;
	Delayus();					//延时3us左右,使程序对P0端口的操作更稳定

	EKBI=1;
	EA=1;
}
//-------------------------------------------
//功能:键盘扫描程序
//-------------------------------------------
void ReadKey()
{	
	uchar	Temp;
	uchar	i,j;
	uchar 	flag;

	P0=P0&0x0F;					//P07->P04作输出,先使其输出0000xxxxB;
	Delayus();					//延时3us左右,使程序对P0端口的操作更稳定
	Temp=P0;					//读P0口
	Delayus();					//延时3us左右,使程序对P0端口的操作更稳定

	Temp&=0x0F;					//取P03->P00到Temp

	if(Temp!=0x0F)					//假如Temp==0x0f,则表示无键按下,则结束函数
	{
		Delay();				//延时15ms去抖动
		
		Temp=0xEF;
		for(i=0;i<4;i++)
		{
			Temp|=0x0F;
			P0=Temp;			//输出口P07->P04轮流输出1110,1101,1011,0111
			Delayus();			//延时3us左右,使程序对P0端口的操作更稳定

			Column[i]=Temp;			//取P07->P04的值存入到Column[i]
			Row[i]=P0;			//读出P0
			Delayus();			//延时3us左右,使程序对P0端口的操作更稳定

			Row[i]&=0x0F;			//取P03->P00到Row[i]
			Temp=Temp<<1;			//Temp左移一位

			Result=Row[i]+Column[i];	//可利用result判断出键值

			for(j=0;j<16;j++)		//将Matrix中的值逐一与Result值进行对比,
			{
				if(Matrix[j]==Result)	//如有相同的值,则表示有键按下
				{
					flag=1;		//设置标志位
					break;		
				}
			}
			if(flag==1)			//如果标志位被设置退出此层循环
			{
				break;
			}
		}
	}
}
//-------------------------------------------
//功能:延时15ms
//-------------------------------------------
void	Delay()
{
	int	i;
	for(i=0;i<10000;i++);
}
//-------------------------------------------
//功能:延时3us
//-------------------------------------------
void	Delayus()
{
	uchar	i;
	for(i=0;i<5;i++);
}
/**************************************************************/

⌨️ 快捷键说明

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