📄 key.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;
sbit LED=P3^5;
/************************************************************************************
* 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;
}
}
/***********************************************************************************
* 函数名称:Key_SPI;
*
* 函数功能描述:键值到LED显示码转换;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
unsigned char Key_SPI(unsigned char key)
{
switch(key)
{
case 0x00: return 0x3f;//0
case 0x01: return 0x06;//1
case 0x02: return 0x5b;//2
case 0x03: return 0x4f;//3
case 0x04: return 0x66;//4
case 0x05: return 0x6d;//5
case 0x06: return 0x7d;//6
case 0x07: return 0x07;//7
case 0x08: return 0x7f;//8
case 0x09: return 0x6f;//9
case 0x0a: return 0x77;//a
case 0x0b: return 0x7c;//b
case 0x0c: return 0x39;//c
case 0x0d: return 0x5e;//d
case 0x0e: return 0x79;//e
case 0x0f: return 0x71;//f
default: return 0x00;
}
}
/***********************************************************************************
* 函数名称: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)
P4|=0x10;
else
P4&=0xef;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:LED_state;
*
* 函数功能描述:LED开关控制 0:关闭,其他:开启;
*
* 输入参数:0:关闭,其他:开启;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LED_state(unsigned char flag)
{
if(flag)
LED=1;
else
LED=0;
}
/*
SPI0DAT=0x3f; //显示0
SPI0DAT=0x06; //显示1
SPI0DAT=0x5b; //显示2
SPI0DAT=0x4f; //显示3
SPI0DAT=0x66; //显示4
SPI0DAT=0x6d; //显示5
SPI0DAT=0x7d; //显示6
SPI0DAT=0x07; //显示7
SPI0DAT=0x7f; //显示8
SPI0DAT=0x6f; //显示9
SPI0DAT=0x77; //显示a
SPI0DAT=0x7c; //显示b
SPI0DAT=0x39; //显示c
SPI0DAT=0x5e; //显示d
SPI0DAT=0x79; //显示e
SPI0DAT=0x71; //显示f
SPI0DAT=0x80; //显示.
*/
/***********************************************************************************/
// 文件结束
/***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -