《KEY按键应用》大全.docx
- 文档编号:11856221
- 上传时间:2023-04-06
- 格式:DOCX
- 页数:29
- 大小:27.34KB
《KEY按键应用》大全.docx
《《KEY按键应用》大全.docx》由会员分享,可在线阅读,更多相关《《KEY按键应用》大全.docx(29页珍藏版)》请在冰豆网上搜索。
《KEY按键应用》大全
《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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- KEY按键应用 KEY 按键 应用 大全
![提示](https://static.bdocx.com/images/bang_tan.gif)