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

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

?? 單片機c51編程幾個有用的模塊(轉載).txt

?? 壓縮包中包括多個驅動程序的原代碼
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
1:找到數據包頭。
2:找到數據包尾。
3:數據包出錯,需要拋棄。
然后更改源代碼來實現上面的協議。

注意:當用戶需要使用字符串的時候,可以利用簡單的包裝函數將字符串轉換為字節數組。所以沒有必要提供專用的字符串處理函數。

鍵盤掃描模塊
  鍵盤掃描模塊有兩種工作方式, 一種為自動的由時鐘模塊調用, 另一種是由程序員自行調用。
1) 由時鐘模塊自動調用的方式
將時鐘模塊實現文件(Timer.h)及鍵盤掃描模塊的實現文件(KBScan。c)包含進工程, 在Config.h 文件中添加TIMER_KBSCANDELAY宏。時鐘模塊自動對時鐘中斷進行計數, 當達到TIMER_KBSCANDELAY宏所定義的值后, 自動調用鍵盤掃描模塊中的函數KBScanProcess()進行鍵盤掃描,也就是說,這個宏的值可以決定按鍵消抖動的時間。 
用戶應該提供兩個回調函數OnKBScan()及onKeysPressed()。 在函數OnKBScan中進行鍵盤掃描, 并返回掃描碼。掃描碼的類型缺省為BYTE, 當鍵盤規模較大時, BYTE不能夠完全包含鍵盤信息時, 可在Config.h文件中重定義宏KBVALUE, 如下:
#define KBVALUE      WORD
這樣, 就可以使用16位的鍵盤掃描碼, 如果此時還達不到要求, 可以將鍵盤掃描碼定義成一個結構, 但這樣做將會增加代碼量及消耗更多的RAM資源, 故不推薦。 
  掃描模塊調用OnKBScan取得掃描碼, 并調用用戶可以重定義的宏IsNoKeyPressed來判斷是否有鍵按下, 缺省的IsNoKeyPressed實現如下:
#define IsNoKeyPressed(x)      ((x) == 0x00)  
即認為OnKBScan返回0掃描碼時為沒有鍵按下, 如果掃描函數返回其它非零掃描碼做為無鍵按下的掃描碼時, 可以在Config.h文件中重定義IsNoKeyPressed宏的實現。
  8位鍵盤掃描碼(缺省值)時, 相應的掃描函數為:
BYTE OnKBScan()
  當掃描模塊經過軟件消抖動之后, 發現有鍵按下, 就會調用另一個回調函數onKeysPressed。 函數的聲明應該如下:
void onKeyPressed(BYTE byKBValue, BYTE byState)
其中中的參數byKBValue的類型為BYTE, 此為缺省值, 如果使用其它類型的掃描碼, 就將此參數變為相應類型。這個值由OnKBScan返回。另一個參數byState在通常情況下為零。但當用戶在Config.h中定義宏KBSCAN_BRUSTCOUNT,同時鍵盤上的某鍵被按住不放時, 掃描模塊對它自己的調用(注意這里和TIMER_KBSCANDELAY宏不同, TIMER_KBSCANDELAY是時鐘中斷足夠的次數后調用掃描模塊, 而KBSCAN_BRUSHCOUNT為掃描模塊自身的被調用次數)進行計數,當達到KBSCAN_BRUSTCOUNT時,掃描模塊調用 onKeysPressed,此時第一個參數的含義不變,而byState變成1, 同時計數器復位,又經過一段時間后,用值為3的byState 調用onKeysPressed。 這樣就可以很方便的實現多功能鍵或者檢測某鍵的長時間被按下。
2)由用戶自行調用
由用戶自行在程序中調用掃描模塊,而不是由時鐘中斷自行調用。其它與方式1相同。

注意:
1) 函數KBScanProcess為非阻塞函數,它將在很快的時間內返回,等待再次分配給它執行的機會。
2) 函數KBScanProcess是在時鐘中斷外部運行的,它的過程可以被任何中斷打斷,但不影響系統運行。
3) byState的最大值為250,之后被復位為零。

應用舉例
  現在來舉例說明上述幾個模塊的使用方法。
  硬件環境描述:
  為了控制一盞燈,需要單片機提供一個做控制功能的開關量,這里不描述外部接口電路,只說明當單片機的P10腳為高電平時,燈滅,當P10腳為低電平時,燈亮。
可以通過計算機由串口發送命令來控制,或通過一個按鍵(push button不是自鎖式的按鍵)來手動控制(按鍵接在P11腳上,當鍵沒有按下時,P11電平為高,鍵按下時,引腳電平被接低),當使用按鍵手動控制的時候,需要給計算機發送通知。
設定串口通訊指令如下:
數據包由0xff做包頭,4個字節長,第二個字節為命令代碼,第三個字節為數據,最后一個字節為校驗位。
命令和數據代碼有如下組合:
(計算機發給單片機)
0x10 0x01: 計算機控制燈亮。(數據位是非零值即可)
0x10 0x00: 計算機控制燈滅。
(單片機發給計算機)
0x11 0x01:單片機正常執行控制指令,返回。(數據位是非零值即可)
0x11 0x00: 單片機不能夠正常執行控制指令,或控制指令錯(不明含義的數據包或校驗錯等)。
0x12 0x01:手動控制燈亮。(數據位是非零值即可)
0x12 0x00: 手動控制燈滅。

  建立工程:
  在硬盤上建立文件夾Projects,在Projects下建立Common文件夾及Example文件夾。將各模塊的頭文件及實現文件拷貝到 Common文件夾下(推薦使用這樣的文件組織結構,其它工程也可以建立在Projects下,各工程共享Common文件夾中的代碼)。
  啟動KeilC的IDE,在Example下建立新工程,將各模塊的實現文件包含進工程。
  在Example文件夾下建立Output文件夾,更改工程設置,將Output作為輸出文件和List文件的輸出文件夾(推薦使用這樣的結構,當保存工程文件時,可以簡單的刪除Output文件夾中的內容而不會誤刪有用的工程文件)。
  建立工程配置頭文件Config.h及工程主文件Example.c,并將Exmaple.c文件加入工程。

  輸入代碼:
  代碼的具體編寫過程略。下面是最后的Config.h文件及Example.c文件。
//
// file: Config.h
//
#ifndef _CONFIG_H_
#define _CONFIG_H_
#i nclude <Atmel/At89x52.h>         // 使用AT89C52做控制
#i nclude “../Common/Common.h”        // 使用自定義的數據類型
#define TIMER_RELOAD      922    // 11.0592MHz晶振,1ms中斷周期
#define TIMER_KBSCANDELAY  40    // 40ms重檢測按鍵狀態,即40ms消抖
#define SCOMM_AsyncInterface        // 使用異步通訊服務
#define IsPackageHeader(x)    ((x) == 0xff)  // 判斷包頭是不是0xff
#define IsPackageTailer(x, y, z)  ((y) <= (z))  // 判斷包的長度是不是足夠
#endif // _CONFIG_H_

//
// file: Example.c
//
#i nclude <Atmail/At89x52.h>
#i nclude “../Common/Common.h”
#i nclude “../Common/Timer.h”
#i nclude “../Common/Scomm.h”
#i nclude “../Common/KBScan.h”

BIT gbitLampState = 1;            // 燈的狀態,缺省為off

static void Initialize()
{
  InitTimerModule();            // 初始化時鐘模塊
  InitSCommModule(0xfd, TRUE);      // 初始化通訊模塊,11.0592MHz晶振,
                    // 波特率為19200
  EA = 1;                // 開中斷
}

void main()
{
  Initialize();              // 初始化
  while(TRUE)              // 主循環
  {
    ImpTimerService();          // 實現時鐘中斷服務,如鍵盤掃描
    AsyncRecePackage(4);        // 接收4個字節長的數據包
}
}

// 在中斷外部響應時鐘中斷事件
void OnTimerEvent()            
{
  // do nothing
}

// 控制外部燈
static void TriggerLamp(BIT bEnable)  
{
  P10 = ~bEnable;            // 需要反相控制
}

// 鍵掃描回調函數
BYTE KBScan()  
{
  BIT b;
  P11 = 1;                // 讀之前拉高引腳電平
  b = P11;                // 讀入引腳狀態
  return ~b;                // 數據反相做掃描碼
}

// 計算校驗和
static BYTE CalcCheckSum(BYTE* pbyBuf, BYTE byLen)
{
  BYTE by, bySum = 0;
  for(by = 0; by < byLen; by++)
    bySum += pbyBuf[by];
  return 0 – bySum;
}

// 接收到鍵盤消息回調函數
void onKeyPressed(BYTE byValue, BYTE byState)
{
  BYTE by[4];
  if(byState == 0)
  {
    switch(byValue)
    {
    case 0x01:
      gbitLampState = ~g  bitLampState;  // 燈狀態取反
      TriggerLamp(gbitLampState);  // 執行控制
      by[0] = 0xff;          // 構造數據包
      by[1] = 0x12;
      by[2] = (BYTE)gbitLampState;
      by[3] = CalcCheckSum(by, 3);  // 求校驗和
      SendPackage(by, 4);      // 發送數據包
      break;
    // 處理其它掃描碼
    default:
      break;
  }
}

// 接收到數據包回調函數
void OnRecePackage(BYTE* pbyBuf, BYTE byBufLen)
{
  BYTE by[4];
  by[0] = 0xff;
  by[1] = 0x11;
  if(byBufLen != 4 || pbyBuf[3] != CalcCheckSum(pbyBuf, 3))
  {
    by[2] = 0;
    by[3] = CalcCheckSum(by, 3);
    SendPackage(by, 4);         // 處理長度或校驗和不正確
  }

  switch(pbyBuf[1])
  {
  case 0x10:
    gbitLampState = (BIT)pbyBuf[2];
    TriggerLamp(gbitLampState);
    by[2] = 1;
    by[3] = CalcCheckSum(by, 3);
    SendPackage(by, 4);        // 發送成功執行通知
    break;

  default:                // 不知道的命令
    by[2] = 0;
    by[3] = CalcCheckSum(by, 3);
    SendPackage(by, 4);        // 發送沒有成功執行通知
    break;
  }
} 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲高清在线精品| 欧美色综合久久| 国产综合色产在线精品| 久久国产福利国产秒拍| 男人的天堂久久精品| 日产精品久久久久久久性色| 亚洲va欧美va人人爽| 亚洲高清视频中文字幕| 日韩电影在线免费看| 麻豆专区一区二区三区四区五区| 美国毛片一区二区三区| 国产在线观看免费一区| 福利一区福利二区| k8久久久一区二区三区| 91美女福利视频| 欧美性色黄大片| 91精品国产综合久久福利软件 | 欧美综合在线视频| 欧美无乱码久久久免费午夜一区| 欧美日韩在线观看一区二区 | 久久免费国产精品 | 国产二区国产一区在线观看| 大桥未久av一区二区三区中文| 白白色 亚洲乱淫| 在线观看日产精品| 欧美一区二区三区在线观看视频 | 亚洲一区二区三区在线| 日韩国产欧美在线播放| 国模冰冰炮一区二区| 粉嫩高潮美女一区二区三区| 色综合天天综合给合国产| 欧美日韩中文字幕一区二区| 日韩精品一区二区三区视频| 欧美国产视频在线| 亚洲国产日韩一区二区| 黄色日韩三级电影| 91香蕉国产在线观看软件| 4438x亚洲最大成人网| 久久亚洲一区二区三区明星换脸| 国产精品久久久久久亚洲毛片 | 日韩女优av电影在线观看| 国产日韩欧美一区二区三区乱码| 一区二区三区中文字幕在线观看| 日韩成人免费在线| 国产精品123区| 欧美视频日韩视频在线观看| 久久综合久久综合久久| 亚洲自拍偷拍av| 国产精品一品二品| 一区二区视频在线| 毛片av一区二区| 色妞www精品视频| 精品少妇一区二区三区日产乱码| 国产精品成人午夜| 老色鬼精品视频在线观看播放| 成人午夜电影久久影院| 欧美一区二区三区在线视频| 亚洲欧美一区二区三区极速播放| 九色综合国产一区二区三区| 在线观看av不卡| 国产免费成人在线视频| 免费人成网站在线观看欧美高清| 99精品久久只有精品| 日韩欧美的一区| 亚洲一区二区欧美日韩 | 91麻豆精品国产自产在线| 中文字幕在线不卡国产视频| 久久99在线观看| 欧美色网站导航| 中文字幕一区二区不卡| 国产麻豆视频一区二区| 91麻豆精品国产综合久久久久久| 亚洲欧美日韩久久| 国产成人亚洲综合a∨猫咪| 欧美一级片在线看| 亚洲一卡二卡三卡四卡五卡| 9i看片成人免费高清| 国产丝袜在线精品| 久久69国产一区二区蜜臀| 欧美猛男超大videosgay| 亚洲婷婷在线视频| 不卡一区二区中文字幕| 欧美精品一区二区蜜臀亚洲| 天天亚洲美女在线视频| 欧美在线视频全部完| 亚洲欧洲国产日韩| 成人精品视频一区二区三区尤物| 久久综合九色综合欧美亚洲| 日韩不卡一区二区三区| 欧美日本韩国一区| 亚洲一区av在线| 欧美在线你懂得| 一区二区三区四区中文字幕| av在线综合网| 中文字幕一区在线观看| 成人av一区二区三区| 国产性天天综合网| 国产精品一区二区男女羞羞无遮挡 | 另类小说图片综合网| 日韩一区二区影院| 麻豆国产精品777777在线| 欧美一区二区久久| 久久精品国产精品亚洲红杏 | 日日噜噜夜夜狠狠视频欧美人 | 26uuu精品一区二区| 精品一区二区免费看| 久久这里都是精品| 国产.欧美.日韩| 中文字幕制服丝袜一区二区三区| 成人午夜精品在线| 亚洲色大成网站www久久九九| 色综合久久88色综合天天6| a美女胸又www黄视频久久| 国产精品国产三级国产三级人妇| 成人a级免费电影| 亚洲日本在线看| 在线视频观看一区| 亚洲不卡一区二区三区| 91精品免费在线| 国产在线精品一区二区三区不卡| 久久精品欧美一区二区三区麻豆| 国产成人午夜精品影院观看视频 | 日韩国产一区二| 精品欧美一区二区久久| 粉嫩一区二区三区在线看| 亚洲天堂久久久久久久| 欧美亚洲一区二区在线观看| 婷婷夜色潮精品综合在线| 欧美不卡在线视频| 风流少妇一区二区| 亚洲激情一二三区| 日韩一区二区高清| 国产不卡视频在线播放| 亚洲精品成a人| 欧美大片在线观看一区二区| 国产成人午夜精品影院观看视频| 亚洲欧美另类小说| 日韩欧美色综合网站| 高清国产一区二区三区| 亚洲国产精品尤物yw在线观看| 欧美成人精品1314www| 成人av电影免费观看| 偷偷要91色婷婷| 国产目拍亚洲精品99久久精品| 91福利视频在线| 精品一区二区三区不卡| 中文字幕不卡在线观看| 欧美少妇一区二区| 国产91精品精华液一区二区三区| 亚洲福利电影网| 日本一区二区三区久久久久久久久不 | 北岛玲一区二区三区四区| 日韩中文字幕91| 中文字幕日韩一区二区| 日韩欧美国产综合一区| www.在线欧美| 日韩视频国产视频| 不卡av电影在线播放| 首页欧美精品中文字幕| 中文字幕一区二区三| 欧美变态tickle挠乳网站| 91免费版在线| 国产在线视频一区二区三区| 亚欧色一区w666天堂| 国产精品久久久99| 精品日产卡一卡二卡麻豆| 欧美在线免费观看视频| 成人动漫一区二区在线| 久久成人av少妇免费| 亚洲一区二区欧美日韩| 国产精品久久久一区麻豆最新章节| 日韩亚洲欧美一区二区三区| 色综合久久天天| 国产精品亚洲一区二区三区在线| 午夜精品一区在线观看| 综合av第一页| 国产精品污网站| 精品成人一区二区| 4438x亚洲最大成人网| 在线亚洲人成电影网站色www| 国产99精品国产| 国产呦萝稀缺另类资源| 日本成人在线不卡视频| 亚洲成a人片在线不卡一二三区| 亚洲视频每日更新| 国产精品你懂的在线| 久久久99精品免费观看| 26uuu亚洲| 日韩不卡在线观看日韩不卡视频| 欧美国产精品一区二区三区| 欧美日韩一区二区不卡| 91蝌蚪porny| 9色porny自拍视频一区二区| 国产a视频精品免费观看| 国产一区二区三区精品欧美日韩一区二区三区| 亚洲午夜激情网站| 亚洲精品国产视频| 亚洲精品菠萝久久久久久久| 亚洲日本丝袜连裤袜办公室| 国产精品久久久久久久久久久免费看 |