📄 key.c
字号:
/******************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
我的邮箱:computer-lov@tom.com
欢迎访问我的blog: http://computer00.21ic.org
KEY.C file
作者:Computer-lov
建立日期: 2007.03.20
修改日期: 2007.03.22
版本:V1.1
版权所有,盗版必究。
Copyright(C) Computer-lov 2007-2017
All rights reserved
*******************************************************************/
#include "Key.h"
#include "my_type.h"
uint16 idata KeyMapCurrent,KeyMapOld,KeyMapOk,KeyNoChangedTime;
uint8 KeyMapCanChange;
#define KeyIO P1
/*************************定时器0初始化***************************************/
void InitTimer0(void)
{
TMOD&=0xF0;
TMOD|=0x01;
TH0=0xDC;
ET0=1;
TR0=1;
}
/******************************************************************************/
/*************************定时器0中断处理***************************************/
void Timer0Isr(void) interrupt 1
{
uint8 temp;
TH0=0xDC; //定时器0重装
KeyIO=0x0F;
if((KeyIO&0x0F)==0x0F) //如果现在没有按键按下
{
KeyMapCurrent=0; //没有键按下
}
else
{
//开始键盘扫描
//扫描第一行
KeyIO=~0x10;
//保存四个开关状态
temp=KeyIO&0x0F;
//扫描第二行
KeyIO=~0x20;
//保存四个开关状态
temp|=KeyIO<<4;
//保存按键状态到当前按键情况
KeyMapCurrent=(~temp)&0xFF;
//扫描第三行
KeyIO=~0x40;
//保存四个开关状态
temp=KeyIO&0x0F;
//扫描第四行
KeyIO=~0x80;
//保存四个开关状态
temp|=KeyIO<<4;
//保存全部16个开关的状态
//KeyMap总共有16个bit,当某个开关按下时,
//对应的bit为1
KeyMapCurrent|=(((uint16)~temp)<<8);
}
if(KeyMapCurrent!=KeyMapOld) //说明按键情况发生了改变
{
KeyNoChangedTime=0; //键盘按下时间为0
KeyMapOld=KeyMapCurrent; //保存当前按键情况
return;
}
else
{
KeyNoChangedTime++; //按下时间累计
if(KeyNoChangedTime>=1) //如果按下时间足够
{
KeyNoChangedTime=1;
if(KeyMapCanChange)
{
KeyMapOk=KeyMapOld; //保存按键
}
}
}
}
/******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -