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

来源:本站
导读:目前正在解读《支持键盘双击事件的C程序设计》的相关信息,《支持键盘双击事件的C程序设计》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《支持键盘双击事件的C程序设计》的详细说明。
简介:在这里给大家提供一个可以支持键盘双击事件的C程序设计

**********************************************************************************         KeyBoard Encode Program         This Program can encode press_key up to 128 and it can deal KB_DBClick Message         This is just a test proram and only use 2 key.If More Key need to Encode ,please       modify the function:KBKeyPress()          This Porgram use Message_Driver method,the KB_Msg is used to record what KB_Msg has occured.         The meaning of 'SysKBMsg' is list as following.                   Program Design:LiBaizhan                     Ver:1.10                    Date:2003-3-16************************************************************************************/#i nclude <reg51.h>#i nclude <intrins.h>sbit  Key1                =           P1^0;sbit  Key2                =           P1^1;/*    Some System Var Pre_Definition    Crystal Frequence is 11.0592MHz*/#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<KB_INTERNAL)  /*if DBClk Detection is not finish then detect continue*/      {         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){   unsigned int i;   for(i=0;i<dltime;i++);}void Init51(void){   SCON  = 0x50;                      /* mode 1: 8-bit UART, enable receiver     */   TMOD  = 0x21;                      /* timer 1 mode 2: 8-Bit reload            */                                      /* timer 0 mode 1: 16-bit Timer            */   TH1   = BAUD_4800;                 /* reload value 9600 baud                  */   TR1   = 1;                         /* timer 1 run                             */   IE    = 0X12;                      /* enable Serial INT,Timer0 INT            */   ES    = 0;                         /* disable Serial INT*/   EA    = 1;                         /* Open INT Ctrl                           */}void KBKeyEncode(void){   data unsigned char CurrPress=0,LastPress=0;   if((LastPress=KBKeyPress())!=0)              /*if some key is press then start encode*/   {      KBStartTimer(0,0);                        /*some key is press then start DBClk Detection Counter*/      SysKBMsg=LastPress;                      /*record the key that is pressed this time*/      while(!KBCounterStop)      {         if((CurrPress=KBKeyPress())!=0X0)      /*if some key is pressed during DBClk Detection then jump out to see wether DBclk is occured*/            break;      }      if((KBCounterStop==0)&&(LastPress==CurrPress))            /*this key DBClk occured*/         SysKBMsg|=0X80;      KBStopTimer();   }}unsigned char KBKeyPress(void){   data unsigned char KeyPress=0;   if((P1&0X03)!=0X03)   {      DelayMS(TIME_20MS);      if((KeyPress=(P1&0X03))!=0X03)         /*some key is press*/      {         if(KBCounterStart)            TR0=0;         while((P1&0X03)!=0X03);             /*wait until key is free*/         DelayMS(TIME_20MS);         if(KBCounterStart)            TR0=1;      }      else              /*Key is not real press*/      {         KeyPress=0;      }   }   return KeyPress;}void KBStartTimer(unsigned char CntH,unsigned char CntL){   TR0=0;   TH0=CntH;   TR0=1;                           /*Start Counter*/   TL0=CntL;   KBCounterFlag=1;                 /*this counter is used by KeyBoard*/   KBCounterStart=1;   KBCounterStop=0;}void KBStopTimer(void){   TR0=0;   TH0=0;   TL0=0;   KBCounter=0;   KBCounterFlag=0;   KBCounterStart=0;}void KBDealPressKey(void){   data unsigned char tmp=0;   switch(SysKBMsg)        /*here is just a test program,test to deal Sgl_Clk and DB_Clk Msg*/   {      case  0X01:       tmp=0X01;break;      case  0X02:       tmp=0X02;break;      case  0X81:       tmp=0X81;break;      case  0X82:       tmp=0X82;break;      default   :       break;   }   SysKBMsg=0;                                 /*this key msg has been done*/

提醒:《支持键盘双击事件的C程序设计》最后刷新时间 2024-03-14 01:02:33,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《支持键盘双击事件的C程序设计》该内容的真实性请自行鉴别。