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

📄 key_isr.c

📁 基于sunplus的16MCU产品,SPMC75的键盘和显示的例子,完整的工程,对单片机开发工程式师有一定的借鉴作用.
💻 C
字号:

//========================================================================
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
//             (C) COPYRIGHT 2004 SUNPLUS TECHNOLOGY CO.
//                    ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================================

//========================================================================
// Filename: Key_ISR.c
// Author: Lianshu  Mou (email: Lianshu@sunnorth.com.cn)
// Date: 2004/12/22
// Description: 
//
// Reference:
// Revision:
//      2004/12/22      First version
//========================================================================

#include "Spmc75_regs.h"
#include "mcMACRO.h"
#include "Option.h"


int Key_NEW = 0;
int Key_ISR_Time = 0;
int Key_Buffer;
unsigned int Key_Temp;

void Key_Data_dispose(int Key_NUM);

//=================================================================================================
// ----Function: void Key_Init(void);
// -Description: 键盘初始化
// --Parameters: None
// -----Returns: None
// -------Notes: 没有问题
//=================================================================================================
void Key_Init(void)
{
	Key_Port_Attrib &= ~Key_Const;		//正常属性
	Key_Port_Buffer |= Key_Const;		//设置为上拉
	Key_Port_Dir &= ~Key_Const;			//方向设置
	Key_Port_SPE &= ~Key_Const;			//特殊功能设置
	Key_Buffer = 7;
}

//=================================================================================================
// ----Function: int Key_Data(unsigned int Data);
// -Description: 获取当前键的键值
// --Parameters: None
// -----Returns: None
// -------Notes: 没有问题
//=================================================================================================
int Key_Data(unsigned int Data)
{
	int i;
	Data ^= 0xffff;				//取反
	Data &= Key_Const;
	for(i = 0;i < 9;i ++)
	{
		if((Data&0x0020) > 0) break;
		else Data = Data >> 1;
	}
	switch(i)
	{
		case 0:
		case 1:
		case 2: i = i + 1;
		break;
		case 3:
		case 6:
		case 7: i = 7;
		break;
		case 4:
		case 5:
		break;
		case 8: i = i - 2;
		break;
		default: break;
	}
	return(i);
}

//=================================================================================================
// ----Function: void Key_ISR(void);
// -Description: 键盘扫描服务
// --Parameters: None
// -----Returns: None
// -------Notes: 没有问题
//=================================================================================================
void Key_ISR(void)
{
	unsigned int Temp;
	Key_ISR_Time ++;
	switch(Key_NEW)
	{
		case 0:	
			Key_Temp = Key_Port_Data;
			Key_Temp &= Key_Const;
			if(Key_Temp != Key_Const)
			{
				Key_NEW = 1;
				Key_ISR_Time = 0;
			}
		break;
		case 1:
			if(Key_ISR_Time > 3)
			{
				Temp = Key_Port_Data;
				Temp &= Key_Const;
				if(Key_Temp == Temp)
				{
					Key_Buffer = Key_Data(Key_Temp);//获取当前键的键值
					Key_NEW = 2;
					Key_ISR_Time = 0;
				}
				else Key_NEW = 0;
			}
		break;
		case 2:
			if(Key_ISR_Time < 500)
			{
				Temp = Key_Port_Data;				//判断键是否释放
				if((Temp & Key_Const) == Key_Const)
				{
					Key_NEW = 4;					//键释放
					Key_ISR_Time = 0;
				}
			}
			else
			{
				Key_NEW = 3;						//键长按
				Key_ISR_Time = 0;
			}
		break;
		case 3:										//键长时间不释放处理
			Temp = Key_Port_Data;
			if((Temp&Key_Const) != Key_Const)
			{
				if(Key_ISR_Time > 50)
				{									//信息更新处理,注意判断只有数据增减键有这一特殊处理
					Key_Data_dispose(Key_Buffer);
					Key_ISR_Time = 0;
				}
			}
			else
			{
				Key_NEW = 4;						//键释放
				Key_ISR_Time = 0;
			}
		break;
		case 4:
			if(Key_ISR_Time > 3)					//键已释放
			{
				NOP();
				Key_Data_dispose(Key_Buffer);
				Key_NEW = 0;						//准备下一次
			}
		break;
		default: break;
	}
}

//=================================================================================================
// ----Function: void Key_Data_dispose(int Key_NUM);
// -Description: 键盘数据处理,命令分配
// --Parameters: 传递的参数是键号
// -----Returns: None
// -------Notes: 没有问题
//=================================================================================================
void Key_Data_dispose(int Key_NUM)
{
	switch(Key_NUM)
	{
		case 0:
		break;
		case 1: 
		break;
		case 2: 
		break;
		case 3:
		break;
		case 4: 
		break;
		case 5:
		break;
		case 6:
		break;
		default: break;
	}	
}

⌨️ 快捷键说明

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