KEY按键应用大全精修订

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

K E Y按键应用大全集团标准化工作小组 #Q8QGGQT-GX8G08Q8-GNQGJ8-MHHGN#

《KEY(按键)应用》大全

技术类别:

?

设计中你是否遇到过这样的问题:你的产品上要求有几十个按键,处理器IO口很少,PCB的面积又有严格限制,或者你要严格控制成本,无法使用象7219那样的扩展芯片,怎么解决这个问题

下面有个方法,大家都见过遥控器吧,上面不但有几十个按键,而且功能还挺多什么去抖动,同时按键处理都有了,最最重要的是控制芯片体积小,价格便宜(也就1,2块钱),外围器件少。。不过具体实现起来有点小麻烦,这类芯片的信号一般是PPM输出的,通常为了有更远的遥控距离,按键编码调制在一个38k左右的载波上。所以我们不得不再为这个方案多花上1块钱,加一个有烂运放做的低通滤波器,将载波滤除后在接到单片机的IO脚上,由于两个频率相差较多,这个滤波器并不难做。我使用LM324做的。其中有两级低通,一个比较器。

当你的示波器上出现一串可爱的几百赫兹的方波时,你的硬件就成功啦。既然只用一条IO就扩展了几十个按键,软件上自然会多费些事,此类芯片发码都是有引导头,同步部分,用户码,键码等部分组成,有三十多个位,具体可参照sc6121资料。下面时一个完整的接收程序,针对的芯片是

sc6121,处理器89c51

\

ib_KeyCode[0] 用户码低位

,ib_KeyCode[1]用户码高位

,ib_KeyCode[2]键码

,ib_KeyCode[3]键码的反码

*/

The meaning of 'SysKBMsg' is list as following.

Program Design:LiBaizhan

Ver:

Date:2003-3-16

************************************************************************************/ #include <>

#include <>

sbit Key1 = P1^0;

sbit Key2 = P1^1;

/*

Some System Var Pre_Definition

Crystal Frequence is

*/

#define TIME_2MS 0X74

#define TIME_20MS 0X043B

#define KB_INTERNAL 3 /*Key DBClk Detection Internal */

/*

SysKBMsg define Keyboard Message,it include Single_Click or Double_Click

It's bit6~bit0 record key_encode and bit 7 record DBClk(1) or SglClk(0)

It can record and encode up to 127(2^7-1) keys

No key is press when it is 0

This method did not deal key such as Ctrl_Key or Alt_Key or Shift_Key...etc.

*/

data unsigned char SysKBMsg=0; /*| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |*/

/*| D/S | KB6 | KB5 | KB4 | KB3 | KB2 | KB1 | KB0 |*/

data unsigned char KBCounter=0;

bit KBCounterStart=0;

bit KBCounterStop=0; /*if KeyBoard counter stop then this bit is 1*/

bit KBCounterFlag=0; /*Current Counter is used by KeyBoard*/

void TimerInt0(void) interrupt 1 /*timer 0 interrupt use to record how long key is press*/

{

TR0=0;

if(KBCounterFlag) /*Current Counter is used by KeyBoard*/

{

if(KBCounter

{

KBCounter++;

TR0=1;

}

else

{

KBCounter=0; /*DBClk Detection is finish*/

KBCounterStop=1;

}

}

}

void DelayMS(unsigned int dltime);

void Init51(void);

unsigned char KBKeyPress(void); /*only return what key is press*/

void KBKeyEncode(void); /*encode which key is pressed and DBClk or SglClk*/

void KBStartTimer(unsigned char CntH,unsigned char CntL); /*load counter initial value and start timer*/

void KBStopTimer(void);

void KBDealPressKey(void); /*deal key_press message*/

void main(void)

{

Init51();

while(1)

{

KBKeyEncode(); /*recored what KeyBoard Msg occure:which key is press and single clk or db clk*/

KBDealPressKey();

}

}

/*

Delay Time is :(20+17*dl_time)*12/CrystalFrequence(us)

*/

void DelayMS(unsigned int dltime)

{

相关文档
最新文档