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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pdiusbd12.c

?? USB HID類軟固件代碼
?? C
字號:
/******************************************************************
   本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途

        歡迎訪問我的USB專區(qū):http://group.ednchina.com/93/
        歡迎訪問我的blog:   http://www.ednchina.com/blog/computer00
                             http://computer00.21ic.org

        感謝PCB贊助商——電子園: http://bbs.cepark.com/

PDIUSBD12.C  file

作者:電腦圈圈
建立日期: 2008.06.27
修改日期: 2008.07.10
版本:V1.1
版權(quán)所有,盜版必究。
Copyright(C) 電腦圈圈 2008-2018
All rights reserved            
*******************************************************************/

#include <AT89x52.H>
#include "MyType.h"
#include "PDIUSBD12.H"
#include "config.h"
#include "UART.h"

/********************************************************************
函數(shù)功能:D12寫命令。
入口參數(shù):Command:一字節(jié)命令。
返    回:無。
備    注:無。
********************************************************************/
void D12WriteCommand(uint8 Command)
{
 D12SetCommandAddr();  //設(shè)置為命令地址
 D12ClrWr(); //WR置低
 D12SetPortOut(); //將數(shù)據(jù)口設(shè)置為輸出狀態(tài)(注意這里為空宏,移植時(shí)可能有用)
 D12SetData(Command);  //輸出命令到數(shù)據(jù)口上
 D12SetWr(); //WR置高
 D12SetPortIn(); //將數(shù)據(jù)口設(shè)置為輸入狀態(tài),以備后面輸入使用
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:讀一字節(jié)D12數(shù)據(jù)。
入口參數(shù):無。
返    回:讀回的一字節(jié)。
備    注:無。
********************************************************************/
uint8 D12ReadByte(void)
{
 uint8 temp;
 D12SetDataAddr(); //設(shè)置為數(shù)據(jù)地址
 D12ClrRd(); //RD置低
 temp=D12GetData(); //讀回?cái)?shù)據(jù)
 D12SetRd(); //RD置高
 return temp; //返回讀到數(shù)據(jù)
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:讀D12的ID。
入口參數(shù):無。
返    回:D12的ID。
備    注:無。
********************************************************************/
uint16 D12ReadID(void)
{
 uint16 id;
 D12WriteCommand(Read_ID); //寫讀ID命令
 id=D12ReadByte(); //讀回ID號低字節(jié)
 id|=((uint16)D12ReadByte())<<8; //讀回ID號高字節(jié)
 return id;
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:寫一字節(jié)D12數(shù)據(jù)。
入口參數(shù):Value:要寫的一字節(jié)數(shù)據(jù)。
返    回:無。
備    注:無。
********************************************************************/
void D12WriteByte(uint8 Value)
{
 D12SetDataAddr(); //設(shè)置為數(shù)據(jù)地址
 D12ClrWr(); //WR置低
 D12SetPortOut(); //將數(shù)據(jù)口設(shè)置為輸出狀態(tài)(注意這里為空宏,移植時(shí)可能有用)
 D12SetData(Value); //寫出數(shù)據(jù)
 D12SetWr(); //WR置高
 D12SetPortIn(); //將數(shù)據(jù)口設(shè)置為輸入狀態(tài),以備后面輸入使用
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:讀取D12最后傳輸狀態(tài)寄存器的函數(shù)。
入口參數(shù):Endp:端點(diǎn)號。
返    回:端點(diǎn)的最后傳輸狀態(tài)。
備    注:該操作將清除該端點(diǎn)的中斷標(biāo)志位。
********************************************************************/
uint8 D12ReadEndpointLastStatus(uint8 Endp)
{
 D12WriteCommand(0x40+Endp); //讀取端點(diǎn)最后狀態(tài)的命令
 return D12ReadByte();
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:選擇端點(diǎn)的函數(shù),選擇一個(gè)端點(diǎn)后才能對它進(jìn)行數(shù)據(jù)操作。
入口參數(shù):Endp:端點(diǎn)號。
返    回:無。
備    注:無。
********************************************************************/
void D12SelectEndpoint(uint8 Endp)
{
 D12WriteCommand(0x00+Endp); //選擇端點(diǎn)的命令
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:清除接收端點(diǎn)緩沖區(qū)的函數(shù)。
入口參數(shù):無。
返    回:無。
備    注:只有使用該函數(shù)清除端點(diǎn)緩沖后,該接收端點(diǎn)才能接收新的數(shù)據(jù)包。
********************************************************************/
void D12ClearBuffer(void)
{
 D12WriteCommand(D12_CLEAR_BUFFER);
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:應(yīng)答建立包的函數(shù)。
入口參數(shù):無。
返    回:無。
備    注:無。
********************************************************************/
void D12AcknowledgeSetup(void)
{
 D12SelectEndpoint(1); //選擇端點(diǎn)0輸入
 D12WriteCommand(D12_ACKNOWLEDGE_SETUP); //發(fā)送應(yīng)答設(shè)置到端點(diǎn)0輸入
 D12SelectEndpoint(0); //選擇端點(diǎn)0輸出
 D12WriteCommand(D12_ACKNOWLEDGE_SETUP); //發(fā)送應(yīng)答設(shè)置到端點(diǎn)0輸出
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:讀取端點(diǎn)緩沖區(qū)函數(shù)。
入口參數(shù):Endp:端點(diǎn)號;Len:需要讀取的長度;Buf:保存數(shù)據(jù)的緩沖區(qū)。
返    回:實(shí)際讀到的數(shù)據(jù)長度。
備    注:無。
********************************************************************/
uint8 D12ReadEndpointBuffer(uint8 Endp, uint8 Len, uint8 *Buf)
{
 uint8 i,j;
 D12SelectEndpoint(Endp); //選擇要操作的端點(diǎn)緩沖
 D12WriteCommand(D12_READ_BUFFER); //發(fā)送讀緩沖區(qū)的命令
 D12ReadByte();   //該字節(jié)數(shù)據(jù)是保留的,不用。
 j=D12ReadByte(); //這里才是實(shí)際的接收到的數(shù)據(jù)長度
 if(j>Len) //如果要讀的字節(jié)數(shù)比實(shí)際接收到的數(shù)據(jù)長
 {
  j=Len;  //則只讀指定的長度數(shù)據(jù)
 }
#ifdef DEBUG1 //如果定義了DEBUG1,則需要顯示調(diào)試信息
 Prints("讀端點(diǎn)");
 PrintLongInt(Endp/2); //端點(diǎn)號。由于D12特殊的端點(diǎn)組織形式,
                       //這里的0和1分別表示端點(diǎn)0的輸出和輸入;
                       //而2、3分別表示端點(diǎn)1的輸出和輸入;
                       //3、4分別表示端點(diǎn)2的輸出和輸入。
                       //因此要除以2才顯示對應(yīng)的端點(diǎn)。
 Prints("緩沖區(qū)");
 PrintLongInt(j);      //實(shí)際讀取的字節(jié)數(shù)
 Prints("字節(jié)。\r\n");
#endif
 for(i=0;i<j;i++)
 {
  //這里不直接調(diào)用讀一字節(jié)的函數(shù),而直接在這里模擬時(shí)序,可以節(jié)省時(shí)間
  D12ClrRd();  //RD置低
  *(Buf+i)=D12GetData(); //讀一字節(jié)數(shù)據(jù)
  D12SetRd();  //RD置高
#ifdef DEBUG1
  PrintHex(*(Buf+i)); //如果需要顯示調(diào)試信息,則顯示讀到的數(shù)據(jù)
  if(((i+1)%16)==0)Prints("\r\n"); //每16字節(jié)換行一次
#endif
 }
#ifdef DEBUG1
 if((j%16)!=0)Prints("\r\n"); //換行。
#endif
 return j; //返回實(shí)際讀取的字節(jié)數(shù)。
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:使能發(fā)送端點(diǎn)緩沖區(qū)數(shù)據(jù)有效的函數(shù)。
入口參數(shù):無。
返    回:無。
備    注:只有使用該函數(shù)使能發(fā)送端點(diǎn)數(shù)據(jù)有效之后,數(shù)據(jù)才能發(fā)送出去。
********************************************************************/
void D12ValidateBuffer(void)
{
 D12WriteCommand(D12_VALIDATE_BUFFER);
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:將數(shù)據(jù)寫入端點(diǎn)緩沖區(qū)函數(shù)。
入口參數(shù):Endp:端點(diǎn)號;Len:需要發(fā)送的長度;Buf:保存數(shù)據(jù)的緩沖區(qū)。
返    回:Len的值。
備    注:無。
********************************************************************/
uint8 D12WriteEndpointBuffer(uint8 Endp,uint8 Len,uint8 * Buf)
{
 uint8 i;
 D12SelectEndpoint(Endp); //選擇端點(diǎn)
 D12WriteCommand(D12_WRITE_BUFFER); //寫Write Buffer命令
 D12WriteByte(0); //該字節(jié)必須寫0
 D12WriteByte(Len);  //寫需要發(fā)送數(shù)據(jù)的長度
 
#ifdef DEBUG1 //如果定義了DEBUG1,則需要顯示調(diào)試信息
 Prints("寫端點(diǎn)");
 PrintLongInt(Endp/2); //端點(diǎn)號。由于D12特殊的端點(diǎn)組織形式,
                       //這里的0和1分別表示端點(diǎn)0的輸出和輸入;
                       //而2、3分別表示端點(diǎn)1的輸出和輸入;
                       //3、4分別表示端點(diǎn)2的輸出和輸入。
                       //因此要除以2才顯示對應(yīng)的端點(diǎn)。
 Prints("緩沖區(qū)");
 PrintLongInt(Len);    //寫入的字節(jié)數(shù)
 Prints("字節(jié)。\r\n");
#endif
 D12SetPortOut(); //將數(shù)據(jù)口設(shè)置為輸出狀態(tài)(注意這里為空宏,移植時(shí)可能有用)
 for(i=0;i<Len;i++)
 {
  //這里不直接調(diào)用寫一字節(jié)的函數(shù),而直接在這里模擬時(shí)序,可以節(jié)省時(shí)間
  D12ClrWr(); //WR置低  
  D12SetData(*(Buf+i)); //將數(shù)據(jù)放到數(shù)據(jù)線上
  D12SetWr();  //WR置高,完成一字節(jié)寫
#ifdef DEBUG1
  PrintHex(*(Buf+i));  //如果需要顯示調(diào)試信息,則顯示發(fā)送的數(shù)據(jù)
  if(((i+1)%16)==0)Prints("\r\n"); //每16字節(jié)換行一次
#endif
  }
#ifdef DEBUG1
 if((Len%16)!=0)Prints("\r\n"); //換行
#endif
 D12SetPortIn(); //數(shù)據(jù)口切換到輸入狀態(tài)
 D12ValidateBuffer(); //使端點(diǎn)數(shù)據(jù)有效
 return Len; //返回Len
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:設(shè)置地址函數(shù)。
入口參數(shù):Addr:要設(shè)置的地址值。
返    回:無。
備    注:無。
********************************************************************/
void D12SetAddress(uint8 Addr)
{
 D12WriteCommand(D12_SET_ADDRESS_ENABLE); //寫設(shè)置地址命令
 D12WriteByte(0x80 | Addr); //寫一字節(jié)數(shù)據(jù):使能及地址
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數(shù)功能:使能端點(diǎn)函數(shù)。
入口參數(shù):Enable: 是否使能。0值為不使能,非0值為使能。
返    回:無。
備    注:無。
********************************************************************/
void D12SetEndpointEnable(uint8 Enable)
{
 D12WriteCommand(D12_SET_ENDPOINT_ENABLE);
 if(Enable!=0)
 {
  D12WriteByte(0x01); //D0為1使能端點(diǎn)
 }
 else
 {
  D12WriteByte(0x00); //不使能端點(diǎn)
 }
}
////////////////////////End of function//////////////////////////////

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费小视频| 中文字幕国产一区| 日韩国产欧美在线视频| 欧美三电影在线| 日韩电影在线观看电影| 欧美大胆人体bbbb| 国内精品伊人久久久久av影院| 日韩欧美国产wwwww| 黑人精品欧美一区二区蜜桃| 国产欧美一区二区精品仙草咪| 成人午夜伦理影院| |精品福利一区二区三区| 91精彩视频在线观看| 丝袜美腿亚洲色图| 精品国产乱码久久久久久久| 岛国一区二区三区| 亚洲一区二区在线免费观看视频| 9191成人精品久久| 岛国精品在线观看| 五月天视频一区| 国产无一区二区| 欧美三级日韩三级国产三级| 久草精品在线观看| 亚洲桃色在线一区| 日韩欧美一级片| 一本一本大道香蕉久在线精品| 秋霞电影网一区二区| 国产精品久久久久久亚洲毛片| 欧美视频一区二区三区四区| 黑人巨大精品欧美黑白配亚洲| 国产精品免费视频观看| 欧美丰满嫩嫩电影| 成人免费精品视频| 日本免费在线视频不卡一不卡二| 中文字幕久久午夜不卡| 欧美一区二区三区的| 成人av网站在线观看免费| 日韩av在线免费观看不卡| 国产精品嫩草影院com| 91精品国产乱| 97久久精品人人做人人爽| 久久精品国产亚洲a| 一区二区三区在线免费播放| 精品久久久三级丝袜| 欧美三级韩国三级日本三斤| 成人免费高清在线观看| 日本不卡免费在线视频| 亚洲午夜精品网| 18涩涩午夜精品.www| 国产午夜精品久久久久久免费视| 欧美精三区欧美精三区| av电影在线观看完整版一区二区| 久久成人av少妇免费| 日韩综合小视频| 一区二区三区在线播| 成人免费一区二区三区在线观看 | 成人91在线观看| 久久97超碰国产精品超碰| 亚洲mv大片欧洲mv大片精品| 中文字幕一区二区在线播放| 亚洲精品在线网站| 日韩精品一区二区三区三区免费| 欧美人伦禁忌dvd放荡欲情| 在线免费观看日本一区| 99久久久国产精品免费蜜臀| 国产美女精品一区二区三区| 日本不卡一二三区黄网| 日韩激情视频网站| 青青草成人在线观看| 视频一区二区中文字幕| 午夜成人免费视频| 婷婷中文字幕一区三区| 亚洲va韩国va欧美va精品| 亚洲国产一区二区三区| 亚洲午夜影视影院在线观看| 亚洲久本草在线中文字幕| 亚洲日本va在线观看| 亚洲欧美色图小说| 亚洲精品免费在线观看| 一片黄亚洲嫩模| 亚洲综合男人的天堂| 亚洲午夜免费电影| 日韩不卡一区二区三区| 精品亚洲国内自在自线福利| 黑人巨大精品欧美一区| 成人午夜在线免费| 色噜噜夜夜夜综合网| 欧美视频自拍偷拍| 91精品在线免费观看| 欧美mv日韩mv国产网站| 国产无人区一区二区三区| 国产精品国产a| 一级日本不卡的影视| 日韩高清在线不卡| 国产一区二区久久| 99精品视频一区二区三区| 在线观看成人小视频| 欧美一区日韩一区| 国产亚洲欧美在线| 亚洲蜜桃精久久久久久久| 一区二区国产视频| 久国产精品韩国三级视频| 国产91精品一区二区麻豆网站 | 国产制服丝袜一区| 福利一区二区在线观看| 欧美午夜电影一区| 欧美精品一区二区久久婷婷 | 日韩精品专区在线影院观看| 久久精品欧美日韩| 一区二区三区日韩欧美| 久久国产精品色| 91丝袜呻吟高潮美腿白嫩在线观看| 国产传媒一区在线| 欧美一区二区网站| 国产精品免费视频观看| 亚洲成a人在线观看| 欧美国产精品久久| 亚洲成人av在线电影| 国产乱人伦精品一区二区在线观看 | 欧美在线视频你懂得| 2020国产精品自拍| 亚洲啪啪综合av一区二区三区| 肉肉av福利一精品导航| 99久久精品国产精品久久| 91麻豆精品91久久久久久清纯| 国产精品萝li| 久久不见久久见免费视频7| 色婷婷激情综合| 久久免费精品国产久精品久久久久| 一区二区三区高清不卡| 国产suv精品一区二区883| 在线不卡免费av| 亚洲女厕所小便bbb| 国产精品系列在线播放| 日韩一区二区三区在线观看 | 欧美老女人第四色| 中文字幕乱码亚洲精品一区| 亚洲 欧美综合在线网络| 国产精品剧情在线亚洲| 九九视频精品免费| 欧美日韩五月天| 亚洲欧美电影一区二区| 国产高清久久久| 欧美精品123区| 综合久久久久久久| 国产91精品露脸国语对白| 欧美电影免费观看高清完整版| 亚洲在线一区二区三区| av在线播放不卡| 国产亚洲欧美日韩在线一区| 久久国产生活片100| 制服丝袜日韩国产| 一区二区三区不卡视频| 91视频在线看| 亚洲婷婷综合色高清在线| 国产91精品入口| 久久精品人人做人人爽人人| 国产一区二三区好的| 日韩午夜激情免费电影| 免费成人在线观看视频| 日韩欧美一区二区久久婷婷| 人人爽香蕉精品| 欧美一区二区啪啪| 天堂久久一区二区三区| 欧美国产精品一区二区三区| 亚洲制服丝袜av| 99精品视频在线播放观看| 国产精品国产三级国产aⅴ原创| 国产91综合一区在线观看| 国产精品三级视频| 色综合天天综合色综合av| 亚洲人成影院在线观看| 一本到高清视频免费精品| 亚洲在线成人精品| 欧美日韩一级视频| 蜜臀av一区二区在线免费观看| 91精品国产综合久久香蕉的特点 | 精品国产第一区二区三区观看体验| 日本欧美在线观看| 精品成人一区二区| 成人三级伦理片| 亚洲欧美综合在线精品| 色94色欧美sute亚洲13| 日韩精品亚洲一区| 精品乱人伦小说| 高清不卡在线观看av| 亚洲视频一区在线| 欧美性大战久久久| 久久91精品国产91久久小草| 国产婷婷色一区二区三区| 91免费观看视频在线| 视频一区二区中文字幕| 久久先锋影音av| 色综合久久88色综合天天 | 欧美大尺度电影在线| 成人综合婷婷国产精品久久| 亚洲色图欧美激情| 日韩一区二区三区电影| 福利一区福利二区| 视频一区二区三区中文字幕|