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

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

?? pdiusbd12.c

?? 單片機上實現U盤功能
?? C
字號:
/******************************************************************
   本程序只供學習使用,未經作者許可,不得用于其它任何用途

        歡迎訪問我的USB專區: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
版權所有,盜版必究。
Copyright(C) 電腦圈圈 2008-2018
All rights reserved            
*******************************************************************/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/********************************************************************
函數功能:讀取D12端點狀態函數。
入口參數:Endp:端點號。
返    回:端點狀態寄存器的值。
備    注:無。
********************************************************************/
uint8 D12ReadEndpointStatus(uint8 Endp)
{
 D12WriteCommand(0x80+Endp); //讀取端點狀態命令
 return D12ReadByte();
}
////////////////////////End of function//////////////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人精品鲁一区一区二区| 一区二区三区四区在线播放| 欧美一区二区福利在线| 欧美一级艳片视频免费观看| 日韩一区二区三区在线视频| 精品国产乱码久久久久久影片| 精品日韩一区二区三区| 欧美激情资源网| 一区二区三区中文字幕电影| 97se亚洲国产综合自在线观| 国产精品66部| 日韩女优av电影| 欧美视频完全免费看| 欧美视频在线不卡| 国产欧美一区二区精品性| 亚洲福中文字幕伊人影院| 成人性生交大合| 国产亚洲欧美日韩日本| 国产一区高清在线| 久久综合资源网| 国产成人av自拍| 国产精品美女久久久久久久久| 国产资源精品在线观看| 欧美一二三区在线| 国产女人水真多18毛片18精品视频 | 99久久99久久精品免费看蜜桃| 国内精品国产成人国产三级粉色| 欧美日韩视频第一区| 不卡一卡二卡三乱码免费网站| 99久久精品国产导航| 欧美日韩精品二区第二页| 欧美一级片在线| 一区二区视频在线| 国产不卡视频一区二区三区| 欧美三级电影在线观看| 国产欧美日产一区| 极品少妇xxxx精品少妇| 欧美又粗又大又爽| 亚洲日本在线视频观看| 99在线精品观看| 久久久久久影视| 国产高清在线观看免费不卡| 日韩欧美一区在线观看| 午夜精品久久久久久久久| 国产日产欧美一区二区视频| 国产精品一区二区不卡| 日韩视频在线观看一区二区| 91精品福利在线一区二区三区| 99这里只有精品| 色综合久久88色综合天天| 久久在线观看免费| 国产不卡在线播放| 亚洲国产精品天堂| 亚洲国产精品欧美一二99| xfplay精品久久| 久久精品99久久久| 亚洲柠檬福利资源导航| 久久色.com| 精品久久人人做人人爽| 精品视频1区2区3区| 99视频超级精品| 成人免费毛片a| 国产99久久久国产精品| 久久成人免费网| 日韩av高清在线观看| 亚洲国产视频直播| 一区二区三区在线免费| 亚洲欧美日韩在线| 中文字幕制服丝袜一区二区三区| 国产日韩影视精品| 久久久国际精品| 2024国产精品视频| 久久久噜噜噜久久中文字幕色伊伊 | 精品噜噜噜噜久久久久久久久试看 | 国产九色精品成人porny| 视频一区二区国产| 国产精品18久久久| 黑人巨大精品欧美一区| 免费日本视频一区| 老汉av免费一区二区三区| 亚洲va天堂va国产va久| 日日夜夜精品视频免费| 日本中文字幕一区二区有限公司| 亚瑟在线精品视频| 视频一区二区国产| 久久精品国产澳门| 国产精品一区二区久激情瑜伽| 国产精品99久久久久久久女警| 风间由美中文字幕在线看视频国产欧美| 久久99国内精品| 国产成人午夜视频| 99精品欧美一区二区三区综合在线| 99精品国产热久久91蜜凸| 色系网站成人免费| 欧美丝袜自拍制服另类| 在线不卡中文字幕播放| 日韩欧美一级在线播放| 久久影院视频免费| 国产精品高潮久久久久无| 中文字幕亚洲精品在线观看| 亚洲免费资源在线播放| 亚洲制服丝袜av| 精品一区二区免费| 97久久精品人人做人人爽| 在线亚洲一区二区| 欧美一区二区视频观看视频| 久久久久久久久99精品| 中文欧美字幕免费| 亚洲主播在线观看| 激情五月婷婷综合| 成人av电影免费在线播放| 欧美在线999| 精品成人佐山爱一区二区| 国产精品乱人伦| 亚洲一区中文日韩| 国内精品国产成人国产三级粉色| www.欧美日韩| 日韩欧美国产一区在线观看| 国产精品久久夜| 日韩不卡一区二区| 欧美一卡2卡三卡4卡5免费| 中文字幕不卡在线播放| 五月婷婷激情综合网| 成人丝袜高跟foot| 欧美一区二区在线看| 国产精品美女久久久久久久久| 三级久久三级久久久| 粉嫩aⅴ一区二区三区四区五区| 精品污污网站免费看| 久久久午夜电影| 亚洲第四色夜色| 国产91对白在线观看九色| 欧美日韩高清一区| 国产精品伦理在线| 久久草av在线| 欧美调教femdomvk| 国产精品少妇自拍| 美国一区二区三区在线播放| 色婷婷av一区二区三区之一色屋| 亚洲精品一区二区精华| 午夜精品久久久久久久99樱桃| av一区二区三区黑人| 精品乱人伦小说| 午夜精品福利在线| 97超碰欧美中文字幕| 久久亚洲欧美国产精品乐播 | 欧美系列在线观看| 中文字幕一区二| 风间由美一区二区三区在线观看 | 欧美午夜寂寞影院| 亚洲欧洲精品一区二区精品久久久| 久久99精品国产麻豆婷婷洗澡| 欧美乱熟臀69xxxxxx| 亚洲人成亚洲人成在线观看图片| 国产精品一二三四区| 精品国产一区二区三区四区四| 视频在线观看一区| 欧洲av一区二区嗯嗯嗯啊| 成人免费在线观看入口| 成人午夜电影久久影院| 日本成人在线不卡视频| 欧美在线影院一区二区| 亚洲欧美日韩电影| 91黄色免费版| 夜夜嗨av一区二区三区中文字幕 | 精品国产一区二区三区久久久蜜月| 亚洲夂夂婷婷色拍ww47| 欧美天天综合网| 亚洲国产精品人人做人人爽| 欧美偷拍一区二区| 亚洲妇熟xx妇色黄| 555夜色666亚洲国产免| 免费视频一区二区| 欧美一区二区大片| 久久99精品久久久久久动态图 | 91高清视频在线| 亚洲最新在线观看| 欧美在线观看视频一区二区三区| 一区二区三区在线观看视频 | 粉嫩久久99精品久久久久久夜| 国产三区在线成人av| 国产成人免费视频一区| 在线观看视频91| 欧美亚洲综合另类| 一卡二卡欧美日韩| 欧美网站一区二区| 美女一区二区视频| 久久综合九色综合97婷婷女人| 国产jizzjizz一区二区| **性色生活片久久毛片| 在线视频中文字幕一区二区| 丝瓜av网站精品一区二区| 精品久久国产97色综合| 成人综合婷婷国产精品久久免费| 亚洲欧洲综合另类| 91麻豆精品国产91久久久| 蜜桃传媒麻豆第一区在线观看| 国产欧美一区在线| 欧洲另类一二三四区| 韩国三级中文字幕hd久久精品|