亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 2051模擬pc鍵盤程序.txt

?? 2051制作的鍵盤模擬程序
?? TXT
字號:
2051模擬PC鍵盤程序
2051模擬PC鍵盤程序之主程序
#include <reg52.h>
#include <INTRINS.H>
#include <alignfir.h>
#include <alignkey.h>
#include <time.h>
#include <adtlc549.h>
#include <key.h>
#define TRUE    1
#define FALSE   0
#define T0_0P1MS11MHZ    164    /*256-11.0592/12*100*/
#define T0_0P05MS11MHZ    210    /*256-11.0592/12*50*/
#define BATGLASSMAX    8
code unsigned char BAT_GLASS[BATGLASSMAX]=
{
        0x83,        /*10-11.20v*/
        0x84,        /*-11.30v*/
        0x85,        /*-11.50v*/
        0x86,        /*-11.70v*/
        0x88,        /*-11.90v*/
        0x8a,        /*-12.10v*/
        0x8c,        /*-12.30v*/
        0x8e        /*>12.30v*/
};
code unsigned char BAT_PCCODE[BATGLASSMAX]=
{
        0x4f,        /*'a'*/
        0x56,        /*'b'*/
        0x5e,        /*'c'*/
        0x08,        /*'d'*/
        0x10,        /*'e'*/
        0x18,        /*'f'*/
        0x20,        /*'g'*/
        0x28        /*'h'*/
};
/*
0x00-0x0F  NoKey  F9 F7 F5 F3 F1 F2 F12 d F10 F8 F6 F4 TABLE ' Y
0x10-0x1F  e Alt LeftShift P Ctrl Q 1 z f q z S A W 2 [
0x20-0x2F  g C X D E 4 3 \ h Space V F T R 5 ]
0x30-0x3F  i N B H G Y 6 ^ j r M J U 7 8 -
0x40-0x4F  k , K I O 0 9 ` l . / L ; P - a
0x50-0x5F  m s ' t [ = b n CapsLock RightShift Enter ] u \ c v
0x60-0x6F  U V w x y z BackSpace { | END } Left Home ~Δo
0x70-0x7F  Ins Del Down 5 Right Up Esc NumLock F11 + PageDown - * PageUp 
ScallLock T
*/
sbit ioKeyData=P3^0;
sbit ioKeyClk =P3^1;
sbit WatchDog =P3^2;
sbit iACOn    =P3^3;
unsigned char T0_Task=0;
unsigned char T0_Data;
bit           T0_Crc;
unsigned char T0_BitPoint;
unsigned char T0_Count;
//unsigned char PcResetCount;
//bit PcResetBit,PcResetFlag;
unsigned char ADHold;
bit ACOnFlag;
/*使用T0工作在100uS下的中斷為模擬按鍵掃描值的發送*/
void Timer0_Init(unsigned char t0data)
{
  TMOD|=0x2;                            /*T0自動裝載方式.*/
  TH0=t0data;
  TL0=t0data;
  TR0=1;
  ET0=1;
  PT0=1;
  T0_Task=0;
//  PcResetCount=0;
//  PcResetBit=0;
//  PcResetFlag=1;                        /*檢測上電
復位PC發出的RESET用*/
}
void Timer0_Int(void) interrupt 1 using 1{                  /*T0中斷*/
/*  if(PcResetCount>0){
    PcResetCount--;
    if(PcResetCount==0)PcResetBit=1;
   }
*/
  switch(T0_Task){
    case 0:    if(Align_BackFirNum()){
          T0_Data=Align_ReadFirBuf(0);
          if(ioKeyClk==0){
            break;            /*PC占用,退出*/
          }
          ioKeyData=0;
          ioKeyClk =0;
          T0_Task++;
        }
        break;
    case 1:    ioKeyClk=1;
        T0_Crc=1;
        T0_BitPoint=1;
        T0_Count=8;
        T0_Task++;
        break;
    case 2:    if(ioKeyClk==0){
            T0_Task=0;
            break;            /*PC占用,退出*/
        }
        if(T0_Data&T0_BitPoint){
          ioKeyData=1;
          T0_Crc=~T0_Crc;
        }
        else ioKeyData=0;
        ioKeyClk=0;
        T0_Task++;
        break;
    case 3:    ioKeyClk=1;
        T0_Count--;
        T0_BitPoint<<=1;
        if(T0_Count==0)T0_Task++;
        else T0_Task--;
        break;
    case 4:    if(ioKeyClk==0){
            T0_Task=0;
            break;            /*PC占用,退出*/
        }
        ioKeyData=T0_Crc;               /*crc bit*/
        ioKeyClk=0;
        T0_Task++;
        break;
    case 5:    ioKeyClk=1;
        T0_Task++;
        break;
    case 6:    if(ioKeyClk==0){
            T0_Task=0;
            break;            /*PC占用,退出*/
        }
        ioKeyData=1;                    /*stop bit*/
        ioKeyClk=0;
        T0_Task++;
        break;
    case 7:    ioKeyClk=1;
                T0_Count=5;
        T0_Task++;
        break;
    case 8:     T0_Count--;
                if(T0_Count==0)T0_Task++;
                break;
    case 9:    if(ioKeyClk){
          T0_Data=Align_PopFirBuf();
          T0_Task=0;
        }
        break;
  }
}
/*返回電池對應PC的碼*/
unsigned char Key_GetPcBatCode(unsigned char Bat_AD)
{
unsigned char i;
for(i=0;i<(BATGLASSMAX-1);i++){
   if(Bat_AD<=BAT_GLASS)return(BAT_PCCODE);        /*i*/
}
return(BAT_PCCODE);
}
/********************************************************************/
void main()
{
   Align_Firinit(20);            /*環行隊列初始化,作為按鍵發送緩
沖*/
   Align_Keyinit(16);            /*環行隊列初始化,作為按鍵發送緩
沖*/
   key_init();
   Timer0_Init(T0_0P1MS11MHZ);
   Timer1_Init(T2_10MS11MHZ);
   EA=1;
   ACOnFlag=iACOn;
   if(ACOnFlag){
     Align_PushFirHead(0x1c);        /*acon=1*/
   }
   else {
     Align_PushFirHead(0x32);        /*acon=0*/
   }
   ACOnTimer=20;
while(1){
    WatchDog=~WatchDog;
    if(ACOnFlag!=iACOn){
      ACOnFlag=~ACOnFlag;
      if(ACOnFlag){
        Align_PushFirHead(0x1c);        /*acon=1*/
      }
      else {
        Align_PushFirHead(0x32);        /*acon=0*/
      }
      ACOnTimer=20;
    }
    if(ACOnTimer==1){
        ACOnTimer=0;
        Align_PushFirHead(0xf0);
        Align_PushFirHead(0x1c);
        Align_PushFirHead(0xf0);
        Align_PushFirHead(0x32);
    }
/*
    if(PcResetFlag){
      if(ioKeyClk)PcResetCount=180;
      if(PcResetBit){
          PcResetCount=0;
          PcResetFlag=0;
          Align_PushFirHead(0xaa);
      }
    }
*/
    if(SysTimer==0){
       SysTimer=160;                
    /*160*10MS*/
       /*返回電池對應PC的碼*/
       ADHold=Key_GetPcBatCode(AD_Once());
       Align_PushFirBuf(ADHold);
       ADFreeTimer=8;
    }
    if((ADHold>0)&&(ADFreeTimer==0)){
            Align_PushFirBuf(0xf0);
        Align_PushFirBuf(ADHold);
        ADHold=0;
    }
    if(Align_BackKeyNum()){         /*發送鍵值*/
      Align_PushFirBuf(Align_PopKeyBuf());
    }
  }
}
/***************************************************************/
2051模擬PC鍵盤程序之鍵掃描 
/*按鍵掃描模塊*/
/*在定時器0中調用KECHECK.C,檢查按鍵值
定時器每10MS中斷一次.
按標準鍵盤標準壓入按鍵或釋放按鍵值*/
/*按鍵緩沖區中,D7=0代表鍵值存儲,D7=1代表保持時間,也代表按鍵松開*/
/*
0x00-0x0F  NoKey  F9 F7 F5 F3 F1 F2 F12 d F10 F8 F6 F4 TABLE ' Y
0x10-0x1F  e Alt LeftShift P Ctrl Q 1 z f q z S A W 2 [
0x20-0x2F  g C X D E 4 3 \ h Space V F T R 5 ]
0x30-0x3F  i N B H G Y 6 ^ j r M J U 7 8 -
0x40-0x4F  k , K I O 0 9 ` l . / L ; P - a
0x50-0x5F  m s ' t [ = b n CapsLock RightShift Enter ] u \ c v
0x60-0x6F  U V w x y z BackSpace { | END } Left Home ~Δo
0x70-0x7F  Ins Del Down 5 Right Up Esc NumLock F11 + PageDown - * PageUp 
ScallLock T
*/
/***************************************************************/
#include <reg52.h>
#include <alignkey.h>
#define LINEBIT        0xe                /*掃描行線
輸入位*/
#define KEYAMPL        5                /*按鍵保持
時間放大5倍*/
sbit kColOut0=P1^4;
sbit kColOut1=P1^5;
sbit kEnter  =P3^7;
unsigned char KeyTask=0;                /*按鍵掃描任務號*/
unsigned char kHoldCount;            /*按鍵保持時間倍數的寄存器*/
unsigned char kHoldValue;
unsigned char kHoldTime;
#define KEYMAX  9
code unsigned char KeyScanTable[KEYMAX]={2,4,8,10,12,16,17,18,19};
code unsigned char KeyPcTable[KEYMAX]  ={6,4,12,3,11,2,0x6b,0x74,0x5a};
unsigned char CoderTask=0;                /*編碼器掃描任務號*/
unsigned char CHoldValue=18;
unsigned char cHoldOld;
unsigned char cHoldScan=18;
#define CODERIO    0x30
unsigned char Key_GetScanCode(unsigned char d)
{
unsigned char i=0;
  while(d!=KeyScanTable)i++;
  kHoldValue=KeyPcTable;
  return(kHoldValue);            /*返回PC掃描碼*/
}
/***********************************************************
            鍵盤始終使用P1口中的口/
入口:colbits,使用P1口中的位,1有效.
    bits,使用P1口中的位,1有效.
***********************************************************/
void key_init()
{
  kColOut0=0;
  kColOut1=0;
  KeyTask=0;
  CoderTask=0;
  CHoldValue=P3&CODERIO;
}
void key_Scan()
{
unsigned char mTempLine;
switch(KeyTask){
   case 0:                         
    /*開始檢查有無按鍵按下*/
           if(((P1|(~LINEBIT))!=0xff)|(kEnter==0))KeyTask++;
           break;
   case 1:                          /*進行按鍵
去抖*/
           KeyTask++;
           break;
   case 2:                          /*進行按鍵
去抖*/
           KeyTask++;
           break;
   case 3:                        
    /*進行按鍵掃描,保存鍵值*/
           mTempLine=~(P1|(~LINEBIT));
           if(mTempLine){
           /*COL 1*/
             kColOut1=1;
             if((P1|(~LINEBIT))!=0xff){
                kHoldCount=KEYAMPL;
               kHoldTime=0;
               Align_PushKeyBuf(Key_GetScanCode
(0*8+mTempLine));
               kColOut1=0;
               KeyTask++;
               break;
             }
           /*COl 2*/
             kColOut0=1;
             kColOut1=0;
             if((P1|(~LINEBIT))!=0xff){
               kHoldCount=KEYAMPL;
               kHoldTime=0;
               Align_PushKeyBuf(Key_GetScanCode
(1*8+mTempLine));
               kColOut0=0;
               KeyTask++;
               break;
             }
             kColOut0=0;
             kColOut1=0;
           }
           else {
             if(kEnter==0){
               Align_PushKeyBuf(Key_GetScanCode(19));
                  kHoldCount=KEYAMPL;
                  kHoldTime=0;
                  KeyTask++;
               break;
             }
           }
           KeyTask=0;                
    /*未通過去抖*/
           break;
   case 4:                        
    /*進行按鍵按下保持的時間計算*/
           if(((P1|(~LINEBIT))==0xff)&&(kEnter==1))KeyTask++;
           else {
             kHoldCount--;
             if(kHoldCount==0){
               kHoldCount=KEYAMPL;
               kHoldTime++;
               if(kHoldTime>0x7f)kHoldTime=0x7f;
             }
           }
           break;
   case 5:                          /*進行按鍵
去抖*/
           KeyTask++;
           break;
   case 6:                          /*進行按鍵
去抖*/
           KeyTask++;
           break;
   case 7:                        
    /*保存按鍵時間,釋放值*/
           if(((P1|(~LINEBIT))!=0xff)|(kEnter==0))KeyTask-=3;
           else {
                     Align_PushKeyBuf(0xf0);
              Align_PushKeyBuf(kHoldValue);
             KeyTask=0;
           }
           break;
}
}
void Coder_Scan()
{
unsigned char mTemp;
switch(CoderTask){
   case 0:                         
    /*開始檢查有無按鍵按下*/
           if(CHoldValue!=(P3&CODERIO))CoderTask++;
           break;
   case 1:                        
    /*進行按鍵掃描,保存鍵值*/
           mTemp=P3&CODERIO;
           if(mTemp!=CHoldValue){
              switch(CHoldValue){
                  case 0x20:  if(mTemp==0x0)cHoldScan=18;             /*->*/
                              else if(mTemp==0x30)cHoldScan=17;       /*<-*/
                              break;
                  case 0x0:   if(mTemp==0x10)cHoldScan=18;            /*->*/
                              else if(mTemp==0x20)cHoldScan=17;       /*<-*/
                              break;
                  case 0x10:  if(mTemp==0x30)cHoldScan=18;            /*->*/
                              else if(mTemp==0x0)cHoldScan=17;        /*<-*/
                              break;
                  case 0x30:  if(mTemp==0x20)cHoldScan=18;            /*->*/
                              else if(mTemp==0x10)cHoldScan=17;       /*<-*/
                              break;
              }
                     CHoldValue=mTemp;
                     cHoldOld=Key_GetScanCode(cHoldScan);
             Align_PushKeyBuf(cHoldOld);
                CoderTask++;
           }
              CoderTask=0;
           break;
    case 2:                         
    /*自動釋放*/
           Align_PushKeyBuf(0xf0);
           Align_PushKeyBuf(cHoldOld);
              CoderTask=0;
           break;
}
} 


2051模擬PC鍵盤之定時
/***************************************************************
設置定時器2為系統時鐘中斷,單位10MS
注意:此中斷定時精度不大,提供給時鐘要求不高的地方,如鍵盤,
     長時定時(如>0.1S),超時判斷,閃爍處理,蜂鳴器等等.
如需精確定時,請使用T0
***************************************************************/
#include <reg52.h>
#include <key.h>
#define T2_10MS6MHZ      0    /*65536-(10*1000)/(12/6)           */
#define T2_10MS11MHZ      1    /*65536-(10*1000)/(12/11.0584)     */
#define T2_10MS12MHZ      2    /*65536-(10*1000)/(12/12)          */
#define T2_10MS22MHZ    3    /*65536-(10*1000)/(12/22.1184)     */
#define T2_10MS24MHZ    4    /*65536-(10*1000)/(12/24)          */
#define T2_10MS33MHZ    5    /*65536-(10*1000)/(12/33.1752)     */
#define T2_10MS40MHZ      6    /*65536-(10*1000)/(12/40)          */
code unsigned int Time2Const[7]={
         60536,        /*65536-(10*1000)/(12/6)           */
          56321,        /*65536-(10*1000)/(12/11.0584)     */
          55536,        /*65536-(10*1000)/(12/12)          */
        47104,        /*65536-(10*1000)/(12/22.1184)     */
        45536,        /*65536-(10*1000)/(12/24)          */
        37890,        /*65536-(10*1000)/(12/33.1752)     */
          32203        /*65536-(10*1000)/(12/40)          */
       };
unsigned char SysTimer;
unsigned char ADFreeTimer;
unsigned char ACOnTimer;
unsigned char T1L,T1H;
void Timer1_Init(unsigned char TimeCode){
  union datastru{
    unsigned int  r_int;
    unsigned char r_char;
  }Data_Stru;
   TMOD|=0x10;
   Data_Stru.r_int=Time2Const[TimeCode];
   T1H=TH1 = Data_Stru.r_char;
   T1L=TL1 = *(&Data_Stru.r_char+1);
   TR1=1;
   ET1=1;
   SysTimer=100;
   ADFreeTimer=8;
   ACOnTimer=0;
}
void timer1(void) interrupt 3 {        /*T2中斷*/
  TH1=T1H;
  TL1=T1L;
  TR1=1;
  if(SysTimer)SysTimer--;
  if(ACOnTimer)ACOnTimer--;
  /*按鍵檢查*/
  key_Scan();
  /*編碼器檢查*/
  Coder_Scan();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲已满18点击进入久久| 亚洲综合一区二区三区| 国产精品妹子av| 婷婷六月综合亚洲| 国产精品一区二区免费不卡 | 欧美一区二区三区免费大片 | 亚洲蜜臀av乱码久久精品 | 丝袜亚洲另类丝袜在线| 懂色av一区二区三区蜜臀| 91 com成人网| 亚洲精品欧美激情| 成人黄色大片在线观看| 欧美成人精精品一区二区频| 亚洲国产日韩a在线播放性色| 成人少妇影院yyyy| 久久久久国产精品麻豆| 蜜桃视频在线观看一区| 欧美日韩在线三区| 亚洲男人天堂一区| 91原创在线视频| 国产精品久久久久久久久免费丝袜| 麻豆一区二区99久久久久| 精品视频在线免费看| 一区二区三区成人| 一本大道久久a久久综合| 国产精品久久久一本精品| 国产精品69久久久久水密桃| 精品成人佐山爱一区二区| 日本系列欧美系列| 日韩欧美成人激情| 美国欧美日韩国产在线播放| 日韩你懂的电影在线观看| 久久精品99国产国产精| 日韩一区二区三区三四区视频在线观看 | 紧缚捆绑精品一区二区| 成人综合日日夜夜| 国产色婷婷亚洲99精品小说| 国产成a人亚洲| 国产精品高清亚洲| 色老汉一区二区三区| 亚洲精品欧美综合四区| 欧美色电影在线| 日韩 欧美一区二区三区| 欧美一区二区在线视频| 国产伦精品一区二区三区免费迷| 久久久久久久久岛国免费| 国产成a人亚洲| 亚洲免费观看视频| 欧美日本在线视频| 裸体一区二区三区| 国产日产欧产精品推荐色 | 色综合天天综合网天天看片| 亚洲精品国产a| 欧美高清你懂得| 国内成人精品2018免费看| 欧美国产激情二区三区| 91国产成人在线| 日精品一区二区| 国产亚洲一二三区| 在线一区二区三区做爰视频网站| 亚洲va欧美va人人爽午夜 | 国产精品自产自拍| 中文字幕亚洲成人| 欧美老年两性高潮| 国产精品88av| 亚洲成人av在线电影| 久久色视频免费观看| 色先锋aa成人| 麻豆精品在线看| 综合av第一页| 亚洲婷婷国产精品电影人久久| 欧美日韩午夜精品| 国产福利精品导航| 亚洲成人动漫av| 中文字幕一区日韩精品欧美| 日韩精品专区在线| 在线影院国内精品| 国产成人精品免费网站| 亚洲国产日日夜夜| 中文一区在线播放| 日韩欧美久久一区| 欧洲亚洲精品在线| 风间由美一区二区av101| 婷婷中文字幕综合| 91精品国产黑色紧身裤美女| 亚洲免费观看视频| 一区二区三区在线视频观看58| 91精品国产综合久久精品图片| 94-欧美-setu| 国产真实精品久久二三区| 午夜精品一区在线观看| 日韩美女精品在线| 国产亚洲精品中文字幕| 日韩欧美在线影院| 欧美日韩不卡在线| eeuss鲁片一区二区三区在线看| 久久精品噜噜噜成人av农村| 亚洲成a人片在线观看中文| 亚洲天天做日日做天天谢日日欢| 久久蜜桃av一区精品变态类天堂| 538prom精品视频线放| 91福利视频网站| 色婷婷精品大在线视频| 不卡电影免费在线播放一区| 国产成+人+日韩+欧美+亚洲| 国产原创一区二区三区| 麻豆精品一区二区三区| 日韩高清中文字幕一区| 婷婷丁香久久五月婷婷| 亚洲午夜一二三区视频| 亚洲国产中文字幕在线视频综合| 亚洲视频中文字幕| 亚洲男同1069视频| 一区二区三区四区国产精品| 亚洲女女做受ⅹxx高潮| 亚洲精品视频在线看| 亚洲激情男女视频| 亚洲一区二区三区四区的 | 国产欧美精品一区| 久久午夜老司机| 欧美精品一区二区三区视频| 精品日韩一区二区三区| 久久一夜天堂av一区二区三区 | 久久国产精品第一页| 精油按摩中文字幕久久| 韩国女主播一区| 国产99久久久精品| 色综合一区二区三区| 91黄色免费看| 欧美一区二区三区成人| 久久久美女毛片| 亚洲欧洲在线观看av| 亚洲综合区在线| 日韩精品一级中文字幕精品视频免费观看| 午夜久久久久久久久| 久久er精品视频| 成人激情开心网| 91国产成人在线| 日韩美女主播在线视频一区二区三区 | 精品国产污网站| 欧美国产日本韩| 日韩一区二区三区视频在线| 韩国理伦片一区二区三区在线播放 | 欧美精品高清视频| 欧美不卡一区二区三区| 国产精品污网站| 亚洲自拍欧美精品| 久久成人麻豆午夜电影| 成人app网站| 欧美日韩综合在线免费观看| 欧美精品一区二区三区很污很色的| 中文字幕欧美激情| 亚洲成人激情综合网| 国产原创一区二区三区| 在线观看国产一区二区| www国产精品av| 亚洲一区欧美一区| 国产不卡免费视频| 911国产精品| 日韩美女精品在线| 美女一区二区视频| 91污片在线观看| 久久久精品影视| 亚洲一二三四久久| 成人一区二区三区视频| 欧美一区二区三区公司| 夜夜精品浪潮av一区二区三区 | 婷婷六月综合亚洲| 成人av电影在线播放| 欧美一级夜夜爽| 一区二区在线电影| 国产精品一区二区三区四区| 欧美精品一二三四| 亚洲三级电影网站| 国产**成人网毛片九色| 欧美一区二区三区在| 亚洲成人免费看| 91丨porny丨首页| 国产欧美日韩综合| 久久成人免费电影| 91.成人天堂一区| 亚洲福利视频导航| 99久久精品国产观看| 国产偷v国产偷v亚洲高清| 久久电影网电视剧免费观看| 911精品产国品一二三产区| 亚洲最大的成人av| 色综合一区二区| 亚洲欧洲日产国产综合网| 国产成人精品免费一区二区| 久久亚洲一区二区三区明星换脸| 免费观看在线综合色| 欧美日韩久久一区| 亚洲国产综合人成综合网站| 欧美亚洲免费在线一区| 又紧又大又爽精品一区二区| 日本久久电影网| 亚洲精品一卡二卡| 欧美日韩一区不卡| 亚洲国产精品自拍|