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 */
}