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

📄 key.c

📁 c8051f120为主控芯片,P5口的8位IO口完成的16位按键
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: Key.C
* 文件标识: none
* 适用器件: C8051F120
* 
* 摘 要: 本文件是键盘子程序;使用外部22.1184MHz晶振.
* 
* 当前版本:1.2
* 作 者:李林利
* 完成日期:2005年6月19日
* 
* 历史版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9 
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/

/************************************************************************************/
// 引用外部头文件

#include "c8051F120.h"
#include <INTRINS.H>
#include "key.h"
#include "Delay.h"

/************************************************************************************/

/************************************************************************************
// 常量及全局变量定义
*************************************************************************************/
unsigned char code Key_Value_Table[16]=
         {0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff,
		  0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff
		 };
bit  bKeyUp_Flag;

/************************************************************************************
*  key功能子程序
*************************************************************************************/

/***********************************************************************************
* 函数名称:Key_Init;
*
* 函数功能描述:键盘初始化,将标志位置1;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Key_Init(void)
{          
	bKeyUp_Flag=1;//标志位置1
}

/***********************************************************************************
* 函数名称:GetScanKey;
*
* 函数功能描述:键盘扫描函数,得到键的行列位置;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
unsigned char GetScanKey(void)
{
	unsigned char key, i, temp;
   char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
   SFRPAGE = SFR_PAGE_F;          	 	// set SFR page F

	key=0xff;
	for (i=1; i<0x10; i<<=1)//i的低4位为行数位
	{
        Key_Scan |= 0x0f;//保留高4位,低4位置1
		Delay_us(1);
		Key_Scan &= ~i;  //取行数位
		Delay_us(1);     	
		temp = Key_Scan; //取高4位列数位
		temp = ~temp;    //取反
		temp>>=4;		 //右移4位
		if (temp!=0x00)  //有键值
		{                
            key = i<<4;  //左移4位
			key|=temp;   //取键值
			break;
		}
	}
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
	return key;          //返回行位(高四)和列位(低四)
}

/***********************************************************************************
* 函数名称:GetKey;
*
* 函数功能描述:取键值,长按无效;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
unsigned char GetKey(void)
{
	unsigned char key, temp;

	if (!bKeyUp_Flag)		//判断标志,是1执行
	{
		key=GetScanKey();
		if (key==0xff)		//没有按键,置标志位
			bKeyUp_Flag=1;
		else				//保持按键
			return 0xff;	
	}		
	key=GetScanKey();
	if (key==0xff)		//没有按键
		return key;
	else
 		temp=key;		//取键值	
	Delay_ms(20);		//延时20ms
	key=GetScanKey();	//键盘扫描	
	if(key!=temp)		//判断两次键值是否相同
	{
	    key=0xff;
		return key;
	}
	else				//取键值
	{
		  temp=Key_Value_Table[key>>4];
		  if (temp==0xff)
		  {
	    	key=0xff;
			return key;
		  }
		  
		  temp=Key_Value_Table[key&0x0f];
		  if (temp==0xff)
		  {
	    	key=0xff;
			return key;
		  }
		  
		  key=Key_Value_Table[key>>4]*4+Key_Value_Table[key&0x0f];
		  if (key>15)
		  {
	    	key=0xff;
			return key;
		  }

		  bKeyUp_Flag=0;
		  return key;
	} 
}

/***********************************************************************************
* 函数名称:Alarm;
*
* 函数功能描述:蜂鸣器开关控制  0:关闭,其他:开启;
*              
* 输入参数:0:关闭,其他:开启;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Alarm(unsigned char flag)
{
 	char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;          	 	// set SFR page F

	if(flag)
		Alarm_On;
	else
		Alarm_Off;
	
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
}

/***********************************************************************************
* 函数名称:LED_state;
*
* 函数功能描述:LED开关控制  0:关闭,其他:开启;
*              
* 输入参数:0:关闭,其他:开启;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void LED_state(unsigned char flag)
{
 	if(flag)
	{
		LED1 = 1;
		LED2 = 1;
		LED3 = 1;
	}
	else
	{
		LED1 = 0;
		LED2 = 0;
		LED3 = 0;
	}
}	
						  
/***********************************************************************************/
// 文件结束
/***********************************************************************************/

⌨️ 快捷键说明

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