《KEY按键应用》大全文档格式.docx
《《KEY按键应用》大全文档格式.docx》由会员分享,可在线阅读,更多相关《《KEY按键应用》大全文档格式.docx(29页珍藏版)》请在冰点文库上搜索。
![《KEY按键应用》大全文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/8501b472-5b64-4d50-b6c2-b3114a5df81c/8501b472-5b64-4d50-b6c2-b3114a5df81c1.gif)
bitHbit;
Hbit=HandSignal;
/*采样信号线*/
if(NewKey==FALSE){
/*如果上一次按键事件已经北处理*/
switch(ib_HandState){
/*根据接收状态散转*/
caseLEAD:
/*引导头接收情况*/
if(Hbit){
/*如果信号线是高电平*/
if((ib_LowTime>
MIN_LeadTime)&
&
(ib_LowTime<
MAX_LeadTime))/*判断低电平时间是否合乎要求*/
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)
/*如果高电平时间超长,复位接收程序*/
}
/*如果信号线是低电平*/
if((ib_HighTime>
MIN_SynTime)&
(ib_HighTime<
MAX_SynTime))/*如果高电平时间合乎要求,将状态设定为数据为高电平检测*/
ib_HandState=WAIT_HIGH;
/*否则复位接收程序*/
ib_HighTime=0;
caseWAIT_HIGH:
/*等待数据位的上升沿的情况*/
if(Hbit){
/*如果检测到一个上升沿*/
MIN_L_Time)&
MAX_L_Time)){
/*如果低电平时间合乎要求,将状态设定为等待数据下降沿*/
ib_HandState=WAIT_LOW;
elseib_HandState=RESTART;
/*如果仍为低电平*/
/*低电平时间计数器加一*/
MAX_L_Time)
/*如果低电平时间超长,则复位寄售程序*/
ib_HandState=RESTART;
caseWAIT_LOW:
/*等待数据下降沿的情况*/
/*如果仍是高电平*/
/*高电平数据计数器加一*/
MAX_H_Time)
/*如果高电平实际超长,则复位接收程序*/
/*如果收到一个下降沿*/
ib_KeyCode[ib_KeyPoint]>
>
=1;
/*接收数据字节右移一位*/
MIN_B1TIME)&
MAX_B1TIME)){/*如果高电平宽度符合逻辑1标准,接收字节高位置一*/
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);
//}
//ib_HandState=RESTART;
ib_HighTime=0;
/*将高电平时间计数器清零*/
/*设定系统为等待上升沿状态*/
default:
if(ib_HandState==RESTART){
/*如果程序处于复位状态*/
/*复位各项参数*/
ib_HandState=LEAD;
ib_KeyCode[0]=0;
ib_KeyCode[1]=0;
ib_KeyCode[2]=0;
ib_KeyCode[3]=0;
ib_KeyPoint=0;
NewKey=FALSE;
好多遥控器(无线,红外)发射数据都是PPM调制的,以上程序稍微改动后可以应用于各种PPM调制信号的场合。
4×
4矩阵式键盘识别技术
#include<
AT89X51.H>
unsignedcharID;
voiddelay10ms(void)
{unsignedchari,j;
for(i=20;
i>
0;
i--)
for(j=248;
j>
j--);
}
voiddelay02s(void)
{unsignedchari;
{delay10ms();
voidmain(void)
{while
(1)
{if(P3_7==0)
if(P3_7==0)
{ID++;
if(ID==4)
{ID=0;
while(P3_7==0);
switch(ID)
{case0:
P1_0=~P1_0;
delay02s();
case1:
P1_1=~P1_1;
case2:
P1_2=~P1_2;
case3:
P1_3=~P1_3;
支持键盘双击事件的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
************************************************************************************/
reg51.h>
intrins.h>
sbit
Key1
=
P1^0;
Key2
P1^1;
SomeSystemVarPre_Definition
CrystalFrequenceis11.0592MHz
#define
TIME_2MS
0X74
TIME_20MS
0X043B
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;
KBCounterStop=0;
/*ifKeyBoardcounterstopthenthisbitis1*/
KBCounterFlag=0;
/*CurrentCounterisusedbyKeyBoard*/
voidTimerInt0(void)interrupt1
/*timer0interruptusetorecordhowlongkeyispress*/
TR0=0;
if(KBCounterFlag)
/*CurrentCounterisusedbyKeyBoard*/
if(KBCounter<
KB_INTERNAL)
/*ifDBClkDetectionisnotfinishthendetectcontinue*/
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*/
Init51();
while
(1)
KBKeyEncode();
/*recoredwhatKeyBoardMsgoccure:
whichkeyispressandsingleclkordbclk*/
KBDealPressKey();
DelayTimeis:
(20+17*dl_time)*12/CrystalFrequence(us)
voidDelayMS(unsignedintdltime)
unsignedinti;
for(i=0;
dltime;
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;