📄 key.c
字号:
/******************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
欢迎访问我的USB专区:http://group.ednchina.com/93/
欢迎访问我的blog: http://www.ednchina.com/blog/computer00
http://computer00.21ic.org
KEY.C file
作者:Computer-lov
建立日期: 2007.03.20
修改日期: 2007.11.18
版本:V1.2
版权所有,盗版必究。
Copyright(C) Computer-lov 2007-2017
All rights reserved
*******************************************************************/
#include "Key.h"
#include "MyType.h"
#include "config.h"
volatile uint8 idata KeyCurrent,KeyOld,KeyNoChangedTime;
volatile uint8 idata KeyPress;
volatile uint8 idata KeyDown,KeyUp,KeyLast;
volatile uint8 KeyCanChange;
volatile uint16 SystemTick=0;
/********************************************************************
函数功能:定时器0初始化,用来做键盘扫描,定时时间大约为5ms。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void InitTimer0(void)
{
TMOD&=0xF0;
TMOD|=0x01;
TH0=0xDC;
ET0=1;
TR0=1;
}
/*******************************************************************/
/********************************************************************
函数功能:键盘初始化
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void InitKeyboard(void)
{
KeyIO=0xFF; //键盘对应的口设置为输入状态
KeyPress=0; //无按键按下
KeyNoChangedTime=0;
KeyOld=0;
KeyCurrent=0;
KeyLast=0;
KeyDown=0;
KeyUp=0;
InitTimer0(); //初始化定时器
KeyCanChange=1; //允许键值改变
}
/*******************************************************************/
sbit LED_0=P1^0;
sbit LED_1=P1^1;
sbit LED_2=P1^2;
sbit LED_3=P1^3;
#define LED_SEG P0
#ifndef LCD
/*=====0-9=====A-F-OFF=====*/
code uint8 Table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82,0xFF};
uint8 LedBuffer[4];
#endif
/********************************************************************
函数功能:定时器0中断处理。
入口参数:约5ms中断一次。
返 回:无。
备 注:无。
********************************************************************/
void Timer0Isr(void) interrupt 1
{
uint8 temp;
#ifndef LCD
static uint8 LedDigit=0;
#endif
TH0=(65536-Fclk/1000/12*5+22)/256; //定时器0重装
TL0=(65536-Fclk/1000/12*5+22)%256;
SystemTick++;
#ifndef LCD //没有定义LCD,则使用数码管显示
switch(LedDigit)
{
case 0:
LED_3=1;
LED_SEG=Table[LedBuffer[0]];
LED_0=0;
LedDigit=1;
break;
case 1:
LED_0=1;
LED_SEG=Table[LedBuffer[1]];
LED_1=0;
LedDigit=2;
break;
case 2:
LED_1=1;
LED_SEG=Table[LedBuffer[2]];
LED_2=0;
LedDigit=3;
break;
case 3:
LED_2=1;
LED_SEG=Table[LedBuffer[3]];
LED_3=0;
LedDigit=0;
break;
default:
LedDigit=0;
break;
}
#endif
if(!KeyCanChange)return; //如果正在处理按键,则不再扫描键盘
//开始键盘扫描
//保存按键状态到当前按键情况
//KeyCurrent总共有8个bit
//当某个开关按下时,对应的bit为1
P2_4=0; //扫描第一列
temp=~KeyIO;
P2_4=1;
temp&=0x0F;
P2_5=0; //扫描第二列
KeyCurrent=~KeyIO;
P2_5=1;
KeyCurrent<<=4;
KeyCurrent|=temp;
if(KeyCurrent!=KeyOld) //说明按键情况发生了改变
{
KeyNoChangedTime=0; //键盘按下时间为0
KeyOld=KeyCurrent; //保存当前按键情况
return;
}
else
{
KeyNoChangedTime++; //按下时间累计
if(KeyNoChangedTime>=1) //如果按下时间足够
{
KeyNoChangedTime=1;
KeyPress=KeyOld; //保存按键
KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的键
KeyUp|=KeyLast&(~KeyPress); //求出新释放的键
KeyLast=KeyPress; //保存当前按键情况
if(KeyDown)BeepOn(); //按键按下,蜂鸣器响
else if(KeyUp)BeepOff();
}
}
}
/*******************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -