KEY按键应用大全精修订
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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) {