/******************************************************************<br /> 本程序只供学习使用,未经作者许可,不得用于其它任何用途<br /><br /> 欢迎访问我的USB专区:http://group.**/93/<br /> 欢迎访问我的blog: http://www.**/blog/computer00<br /> http://computer00.21ic.org<br /><br />KEY.C file<br /><br />作者:Computer-lov<br />建立日期: 2007.03.20<br />修改日期: 2007.11.18<br />版本:V1.2<br />版权所有,盗版必究。<br />Copyright(C) Computer-lov 2007-2017<br />All rights reserved <br />*******************************************************************/<br /><br /><br /><br /><br />#include "Key.h"<br />#include "my_type.h"<br />#include "config.h"<br /><br />volatile uint8 idata KeyCurrent,KeyOld,KeyNoChangedTime;<br />volatile uint8 idata KeyPress;<br />volatile uint8 idata KeyDown,KeyUp,KeyLast;<br /><br />volatile uint8 KeyCanChange;<br /><br />/********************************************************************<br />函数功能:定时器0初始化,用来做键盘扫描,定时时间大约为5ms。<br />入口参数:无。<br />返 回:无。<br />备 注:无。<br />********************************************************************/<br />void InitTimer0(void)<br />{<br /> TMOD&=0xF0;<br /> TMOD|=0x01;<br /> TH0=0xDC;<br /> ET0=1;<br /> TR0=1;<br />}<br />/*******************************************************************/<br /><br /><br />/********************************************************************<br />函数功能:键盘初始化<br />入口参数:无。<br />返 回:无。<br />备 注:无。<br />********************************************************************/<br />void InitKeyboard(void)<br />{<br /> KeyIO=0xFF; //键盘对应的口设置为输入状态<br /> KeyPress=0; //无按键按下<br /> KeyNoChangedTime=0;<br /> KeyOld=0;<br /> KeyCurrent=0;<br /> KeyLast=0;<br /> KeyDown=0;<br /> KeyUp=0;<br /> InitTimer0(); //初始化定时器<br /> KeyCanChange=1; //允许键值改变<br />}<br />/*******************************************************************/<br /><br />/********************************************************************<br />函数功能:定时器0中断处理。<br />入口参数:22.1184M晶体约5ms中断一次。<br />返 回:无。<br />备 注:无。<br />********************************************************************/<br />void Timer0Isr(void) interrupt 1<br />{ <br /> TH0=(65536-Fclk/1000/12*5+15)/256; //定时器0重装<br /> TL0=(65536-Fclk/1000/12*5+15)%256;<br /><br /> if(!KeyCanChange)return; //如果正在处理按键,则不再扫描键盘 <br /><br /> //开始键盘扫描<br /> //保存按键状态到当前按键情况<br /> //KeyCurrent总共有8个bit<br /> //当某个开关按下时,对应的bit为1<br /> <br /> KeyCurrent=~KeyIO; <br /><br /> if(KeyCurrent!=KeyOld) //说明按键情况发生了改变<br /> {<br /> KeyNoChangedTime=0; //键盘按下时间为0<br /> KeyOld=KeyCurrent; //保存当前按键情况<br /> return;<br /> }<br /> else<br /> {<br /> KeyNoChangedTime++; //按下时间累计<br /> if(KeyNoChangedTime>=1) //如果按下时间足够<br /> {<br /> KeyNoChangedTime=1;<br /> KeyPress=KeyOld; //保存按键<br /> KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的键<br /> KeyUp|=KeyLast&(~KeyPress); //求出新释放的键<br /> KeyLast=KeyPress; //保存当前按键情况<br /> }<br /> }<br />}<br />/*******************************************************************/
|