《KEY按键应用》大全.docx

上传人:b****5 文档编号:14456569 上传时间:2023-06-23 格式:DOCX 页数:26 大小:26.84KB
下载 相关 举报
《KEY按键应用》大全.docx_第1页
第1页 / 共26页
《KEY按键应用》大全.docx_第2页
第2页 / 共26页
《KEY按键应用》大全.docx_第3页
第3页 / 共26页
《KEY按键应用》大全.docx_第4页
第4页 / 共26页
《KEY按键应用》大全.docx_第5页
第5页 / 共26页
《KEY按键应用》大全.docx_第6页
第6页 / 共26页
《KEY按键应用》大全.docx_第7页
第7页 / 共26页
《KEY按键应用》大全.docx_第8页
第8页 / 共26页
《KEY按键应用》大全.docx_第9页
第9页 / 共26页
《KEY按键应用》大全.docx_第10页
第10页 / 共26页
《KEY按键应用》大全.docx_第11页
第11页 / 共26页
《KEY按键应用》大全.docx_第12页
第12页 / 共26页
《KEY按键应用》大全.docx_第13页
第13页 / 共26页
《KEY按键应用》大全.docx_第14页
第14页 / 共26页
《KEY按键应用》大全.docx_第15页
第15页 / 共26页
《KEY按键应用》大全.docx_第16页
第16页 / 共26页
《KEY按键应用》大全.docx_第17页
第17页 / 共26页
《KEY按键应用》大全.docx_第18页
第18页 / 共26页
《KEY按键应用》大全.docx_第19页
第19页 / 共26页
《KEY按键应用》大全.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

《KEY按键应用》大全.docx

《《KEY按键应用》大全.docx》由会员分享,可在线阅读,更多相关《《KEY按键应用》大全.docx(26页珍藏版)》请在冰点文库上搜索。

《KEY按键应用》大全.docx

《KEY按键应用》大全

设计中你是否遇到过这样的问题:

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

下面有个方法,大家都见过遥控器吧,上面不但有几十个按键,而且功能还挺多什么去抖动,同时按键处理都有了,最最重要的是控制芯片体积小,价格便宜(也就1,2块钱),外围器件少。

不过具体实现起来有点小麻烦,这类芯片的信号一般是PPM输出的,通常为了有更远的遥控距离,按键编码调制在一个38k左右的载波上。

所以我们不得不再为这个方案多花上1块钱,加一个有烂运放做的低通滤波器,将载波滤除后在接到单片机的IO脚上,由于两个频率相差较多,这个滤波器并不难做。

我使用LM324做的。

其中有两级低通,一个比较器。

当你的示波器上出现一串可爱的几百赫兹的方波时,你的硬件就成功啦。

既然只用一条IO就扩展了几十个按键,软件上自然会多费些事,此类芯片发码都是有引导头,同步部分,用户码,键码等部分组成,有三十多个位,具体可参照sc6121资料。

下面时一个完整的接收程序,针对的芯片是sc6121,处理器89c51

///////////////////////////////////////////////////////////////////////////////

/*定时器1中断服务程序*/

/*

每100us中断一次,定时检测HangSignal线上的电平状态,根据6121的砝码格式译出用户码键码.\\

ib_KeyCode[0]用户码低位

ib_KeyCode[1]用户码高位

ib_KeyCode[2]键码

ib_KeyCode[3]键码的反码

*/

/////////////////////////////////////////////////////////////////////////////////////

voidHandIn()  interrupt3using3{

  unsignedchartempbit=0;

  bitHbit;

  Hbit=HandSignal;                                      /*采样信号线*/

  if(NewKey==FALSE){                                    /*如果上一次按键事件已经北处理*/

switch(ib_HandState){                          /*根据接收状态散转*/

  caseLEAD:

                                /*引导头接收情况*/                              

          if(Hbit){                              /*如果信号线是高电平*/  

            if((ib_LowTime>MIN_LeadTime)&&(ib_LowTime

    ib_HandState=START;                      /*正确进入同步头接收状态*/

            elseib_HandState=RESTART;                      /*否则复位接收程序*/

      ib_LowTime=0;                            /*清除低电平时间计数*/

  }

  else{                                /*如果信号是低电平*/  

    ib_LowTime++;                          /*增加低电平时间计数器*/

if(ib_LowTime>MAX_LeadTime)                /*判断低电平时间是否超时*/

            ib_HandState=RESTART;                    /*是的话复位接收程序*/

  }

          break;

    caseSTART:

                              /*同步头接收情况*/

          if(Hbit){                            /*如果信号线是高电平*/  

    ib_HighTime++;                        /*高电平时间计数器加一*/

            if(ib_HighTime>MAX_SynTime)              /*如果高电平时间超长,复位接收程序*/

            ib_HandState=RESTART;

            }

    else{                              /*如果信号线是低电平*/

                if((ib_HighTime>MIN_SynTime)&&(ib_HighTime

              ib_HandState=WAIT_HIGH;  

              elseib_HandState=RESTART;                    /*否则复位接收程序*/  

                ib_HighTime=0;  

  }

  

          break;

  caseWAIT_HIGH:

  /*等待数据位的上升沿的情况*/

          if(Hbit){                                /*如果检测到一个上升沿*/              

              if((ib_LowTime>MIN_L_Time)&&(ib_LowTime

                  ib_HandState=WAIT_LOW;

    }

                elseib_HandState=RESTART;                  /*否则复位接收程序*/

    ib_LowTime=0;

}

else{                                  /*如果仍为低电平*/

  ib_LowTime++;                          /*低电平时间计数器加一*/

  if(ib_LowTime>MAX_L_Time)                  /*如果低电平时间超长,则复位寄售程序*/

              ib_HandState=RESTART;

}

  break;

  caseWAIT_LOW:

                          /*等待数据下降沿的情况*/        

            if(Hbit){                              /*如果仍是高电平*/

                ib_HighTime++;                            /*高电平数据计数器加一*/  

              if(ib_HighTime>MAX_H_Time)                /*如果高电平实际超长,则复位接收程序*/

              ib_HandState=RESTART;

}

else{                                /*如果收到一个下降沿*/

              ib_KeyCode[ib_KeyPoint]>>=1;                  /*接收数据字节右移一位*/

              if((ib_HighTime>MIN_B1TIME)&&(ib_HighTime

              ib_KeyCode[ib_KeyPoint]+=0x80;

  }

              ib_BitCount++;                            /*接收数据位计数器加一*/

  if(ib_BitCount>7){                          /*如果接收满一个字节*/

    ib_BitCount=0;                            /*清空位计数器*/

ib_KeyPoint++;                              /*指向下一个字节*/

if(ib_KeyPoint>3)                          /*如果接收完整个数据*/

{

      //unsignedchari;

    NewKey=TRUE;                                  /*置有新键按下标志*/

    //for(i=0;i<4;i++){

    //TI=0;

    //SBUF=ib_KeyCode;

    //while(!

TI);

    //TI=0;

//}

                  //ib_HandState=RESTART;

}

  }

              ib_HighTime=0;                              /*将高电平时间计数器清零*/

  ib_HandState=WAIT_HIGH;                /*设定系统为等待上升沿状态*/

}

          break;  

      default:

break;

  }

  }

  if(ib_HandState==RESTART){                                  /*如果程序处于复位状态*/

    ib_LowTime=0;                                            /*复位各项参数*/

    ib_HighTime=0;

    ib_HandState=LEAD;  

  ib_KeyCode[0]=0;ib_KeyCode[1]=0;

  ib_KeyCode[2]=0;ib_KeyCode[3]=0;

  ib_KeyPoint=0;

  ib_BitCount=0;

    NewKey=FALSE;

  }

}

好多遥控器(无线,红外)发射数据都是PPM调制的,以上程序稍微改动后可以应用于各种PPM调制信号的场合。

4×4矩阵式键盘识别技术

#include

unsignedcharID;

voiddelay10ms(void)

{unsignedchari,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

voiddelay02s(void)

{unsignedchari;

for(i=20;i>0;i--)

{delay10ms();}

}

voidmain(void)

{while

(1)

{if(P3_7==0)

{delay10ms();if(P3_7==0)

{ID++;if(ID==4)

{ID=0;}

while(P3_7==0);}

}

switch(ID)

{case0:

P1_0=~P1_0;delay02s();break;

case1:

P1_1=~P1_1;delay02s();break;

case2:

P1_2=~P1_2;delay02s();break;

case3:

P1_3=~P1_3;delay02s();break;}

}

}

支持键盘双击事件的C程序设计!

/**********************************************************************************

      KeyBoardEncodeProgram

      ThisProgramcanencodepress_keyupto128anditcandealKB_DBClickMessage

      Thisisjustatestproramandonlyuse2key.IfMoreKeyneedtoEncode,please

    modifythefunction:

KBKeyPress()

      ThisPorgramuseMessage_Drivermethod,theKB_MsgisusedtorecordwhatKB_Msghasoccured.

      Themeaningof'SysKBMsg'islistasfollowing.

      

      ProgramDesign:

LiBaizhan

              Ver:

1.10

              Date:

2003-3-16

************************************************************************************/

#include

#include

sbit  Key1          =        P1^0;

sbit  Key2          =        P1^1;

/*

  SomeSystemVarPre_Definition

  CrystalFrequenceis11.0592MHz

*/

#define      TIME_2MS      0X74

#define      TIME_20MS      0X043B

#define      KB_INTERNAL    3      /*KeyDBClkDetectionInternal*/

/*

  SysKBMsgdefineKeyboardMessage,itincludeSingle_ClickorDouble_Click

  It'sbit6~bit0recordkey_encodeandbit7recordDBClk

(1)orSglClk(0)

  Itcanrecordandencodeupto127(2^7-1)keys

  Nokeyispresswhenitis0

  ThismethoddidnotdealkeysuchasCtrl_KeyorAlt_KeyorShift_Key...etc.

*/

                      /*_________________________________________________*/

dataunsignedcharSysKBMsg=0;  /*|  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |*/

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

dataunsignedcharKBCounter=0;

bit  KBCounterStart=0;

bit  KBCounterStop=0;        /*ifKeyBoardcounterstopthenthisbitis1*/

bit  KBCounterFlag=0;        /*CurrentCounterisusedbyKeyBoard*/

voidTimerInt0(void)interrupt1    /*timer0interruptusetorecordhowlongkeyispress*/

{

  TR0=0;

  if(KBCounterFlag)        /*CurrentCounterisusedbyKeyBoard*/

  {

    if(KBCounter

    {

      KBCounter++;

      TR0=1;

    }

    else

    {

      KBCounter=0;        /*DBClkDetectionisfinish*/

      KBCounterStop=1;

    }

  }

}

      voidDelayMS(unsignedintdltime);

      voidInit51(void);

unsignedcharKBKeyPress(void);      /*onlyreturnwhatkeyispress*/

      voidKBKeyEncode(void);    /*encodewhichkeyispressedandDBClkorSglClk*/

      voidKBStartTimer(unsignedcharCntH,unsignedcharCntL);  /*loadcounterinitialvalueandstarttimer*/

      voidKBStopTimer(void);

      voidKBDealPressKey(void);  /*dealkey_pressmessage*/

voidmain(void)

{

  Init51();

  while

(1)

  {

    KBKeyEncode();          /*recoredwhatKeyBoardMsgoccure:

whichkeyispressandsingleclkordbclk*/

    KBDealPressKey();

  }

}

/*

    DelayTimeis:

(20+17*dl_time)*12/CrystalFrequence(us)

*/

voidDelayMS(unsignedintdltime)

{

  unsignedinti;

  for(i=0;i

}

voidInit51(void)

{

  SCON  =0x50;              /*mode1:

8-bitUART,enablereceiver    */

  TMOD  =0x21;              /*timer1mode2:

8-Bitreload        */

                          /*timer0mode1:

16-bitTimer        */

  TH1  =BAUD_4800;            /*reloadvalue9600baud            */

  TR1  =1;                /*timer1run                    */

  IE  =0X12;              /*enableSerialINT,Timer0INT        */

  ES  =0;                /*disableSerialINT*/

  EA  =1;                /*OpenINTCtrl                  */

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2