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

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

?? ch375451.c

?? USB接口芯片測試程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*; CH375/CH372/CH451 EVT
; U2(AT89C51) Program
;
; Website:  http://winchiphead.com
; Email:    tech@winchiphead.com
; Author:   W.ch 2003.12
;
;****************************************************************************
*/

/* MCS-51單片機C語言的示例程序 */

#include <reg52.h>
#include <string.h>
#include "CH375INC.H"

typedef	struct	_COMMAND_PACKET	{	/* 自定義的命令包結構 */
	unsigned char	mCommandCode;		/* 命令請求碼,見下面的定義 */
	unsigned char	mCommandCodeNot;	/* 命令碼的反碼,用于校驗命令包 */
	union	{
		unsigned char	mParameter[5];	/* 參數 */
		struct {
			unsigned char	mBufferID;  /* 緩沖區識別碼,本程序針對MCS51單片機定義: 1-專用功能寄存器SFR, 2-內部RAM, 3-外部RAM, 不過本程序實際只演示內部RAM */
			unsigned int	mBufferAddr;	/* 讀寫操作的起始地址,尋址范圍是0000H-0FFFFH,低字節在前 */
			unsigned int	mLength;	/* 數據塊總長度,低字節在前 */
		} buf;
	} u;
}	mCOMMAND_PACKET,	*mpCOMMAND_PACKET;

#define		CONST_CMD_LEN		0x07	/* 命令塊的長度 */
/* 由于命令與數據都是通過數據下傳管道(USB端點2的OUT)下傳, 為了防止兩者混淆,
 我們可以在計算機應用程序與單片機程序之間約定, 命令塊的長度總是7, 而數據塊的長度肯定不是7, 例如64,32等
 另外, 可以約定, 命令塊的首字節是命令碼, 等等
 本程序約定命令碼: 80H-0FFH是通用命令,適用于各種應用
                   00H-7FH是專用命令,針對各種應用特別定義 */
/* 通用命令 */
#define		DEF_CMD_GET_INFORM		0x90	/* 獲取下位機的說明信息,長度不超過64個字符,字符串以00H結束 */
#define		DEF_CMD_TEST_DATA		0x91	/* 測試命令,下位機將PC機發來的命令包的所有數據取反后返回 */
#define		DEF_CMD_CLEAR_UP		0xA0	/* 在上傳數據塊之前進行同步,實際是讓下位機清除上傳緩沖區的已有內容 */
#define		DEF_CMD_UP_DATA			0xA1	/* 從下位機的指定地址的緩沖區中讀取數據塊(上傳數據塊) */
#define		DEF_CMD_DOWN_DATA		0xA2	/* 向下位機的指定地址的緩沖區中寫入數據塊(下傳數據塊) */
/* 專用命令 */
#define		DEMO_CH451_CMD			0x56	/* PC發送命令給CH451,用于演示CH451的功能 */
/* 對于MCS51單片機在使用通用命令時,還需要指定緩沖區識別碼 */
#define		ACCESS_MCS51_SFR		1		/* 讀寫51單片機的SFR */
#define		ACCESS_MCS51_IRAM		2		/* 讀寫51單片機的內部RAM */
#define		ACCESS_MCS51_XRAM		3		/* 讀寫51單片機的外部RAM */

unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1;		/* CH375命令端口的I/O地址 */
unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0;		/* CH375數據端口的I/O地址 */

/* 有關CH451的定義,演示板的連接方式 */
sbit   CH451_dclk=P1^7;      /* 串行數據時鐘上升延激活 */
sbit   CH451_din=P1^6;	     /* 串行數據輸出,接CH451的數據輸入 */
sbit   CH451_load=P1^5;      /* 串行命令加載,上升延激活 */
sbit   CH451_dout=P3^3;      /* INT1,鍵盤中斷和鍵值數據輸入,接CH451的數據輸出 */
unsigned char CH451_KEY;				/* 存放鍵盤中斷中讀取的鍵值 */
unsigned char LAST_KEY;					/* 保存上次的鍵值 */

mCOMMAND_PACKET	CMD_PKT;				/* 命令包結構緩沖區 */
unsigned char data *CurrentRamAddr;		/* 進行數據塊傳輸時保存被讀寫的緩沖區的起始地址 */
unsigned char CurrentRamLen;			/* 進行數據塊傳輸時保存剩余長度 */
bit		FLAG_INT_WAIT;		/* 中斷等待標志,1指示有中斷數據正在CH375中等待發送 */
unsigned char CH451_CMD_H;	/* PC機發給CH451的高4位命令,為0FFH則命令無效 */
unsigned char CH451_CMD_L;  /* PC機發給CH451的低8位命令 */
unsigned char code InformString[16] = "CH375/CH451\x0";	/* 信息字符串 */

/* 延時2微秒,不精確 */
void	Delay2us( )
{
	unsigned char i;
#define DELAY_START_VALUE	1  /* 根據單片機的時鐘選擇初值,20MHz以下為0,30MHz以上為2 */
	for ( i=DELAY_START_VALUE; i!=0; i-- );
}

/* 延時50毫秒,不精確 */
void	Delay50ms( )
{
	unsigned char i, j;
	for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- );
}

/* 將PC機的低字節在前的16位字數據轉換為C51的高字節在前的數據 */
unsigned int	BIG_ENDIAN( unsigned int value )
{
	unsigned int  in, out;
	in = value;
	((unsigned char *)&out)[1] = ((unsigned char *)&in)[0];
	((unsigned char *)&out)[0] = ((unsigned char *)&in)[1];
	return( out );
}

/* CH375初始化子程序 */
void	CH375_Init( )
{
	unsigned char i;
	FLAG_INT_WAIT = 0;  /* 清發送中斷等待標志 */
/* 測試CH375是否正常工作,可選操作,通常不需要 */
#ifdef TEST_CH375_FIRST
	CH375_CMD_PORT = CMD_CHECK_EXIST;  /* 測試CH375是否正常工作 */
	Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
	CH375_DAT_PORT = 0x55;  /* 寫入測試數據 */
	Delay2us( );
	i = ~ 0x55;  /* 返回數據應該是測試數據取反 */
	if ( CH375_DAT_PORT != i ) {  /* CH375不正常 */
		for ( i=80; i!=0; i-- ) {
			CH375_CMD_PORT = CMD_RESET_ALL;  /* 多次重復發命令,執行硬件復位 */
			Delay2us( );
		}
		CH375_CMD_PORT = 0;
		Delay50ms( );  /* 延時50ms */
	}
#endif
#ifdef USE_MY_USB_ID
/* 設置外部自定義的USB設備VID和PID,可選操作,不執行該命令則使用默認的VID和PID */
	CH375_CMD_PORT = CMD_SET_USB_ID;  /* 設置外部自定義的USB設備VID和PID,可選操作 */
	Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
	CH375_DAT_PORT = (unsigned char)MY_USB_VENDOR_ID;  /* 寫入廠商ID的低字節 */
	CH375_DAT_PORT = (unsigned char)(MY_USB_VENDOR_ID>>8);  /* 寫入廠商ID的高字節 */
	CH375_DAT_PORT = (unsigned char)MY_USB_DEVICE_ID;  /* 寫入設備ID的低字節 */
	CH375_DAT_PORT = (unsigned char)(MY_USB_DEVICE_ID>>8);  /* 寫入設備ID的高字節 */
	Delay2us( );
#endif
/* 設置USB工作模式, 必要操作 */
	CH375_CMD_PORT = CMD_SET_USB_MODE;
	Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
	CH375_DAT_PORT = 2;  /* 設置為使用內置固件的USB設備方式 */
	for ( i=100; i!=0; i-- ) {  /* 等待操作成功,通常需要等待10uS-20uS */
		if ( CH375_DAT_PORT==CMD_RET_SUCCESS ) break;
	}
/*	if ( i==0 ) { CH372/CH375存在硬件錯誤 }; */
/* 下述啟用中斷,假定CH375連接在INT0 */
	IT0 = 0;  /* 置外部信號為低電平觸發 */
	IE0 = 0;  /* 清中斷標志 */
	EX0 = 1;  /* 允許CH375中斷 */
}

/* 加載上傳數據 */
void	LoadUpData( unsigned char data *Buf, unsigned char Len )
{
	unsigned char i;
	CH375_CMD_PORT = CMD_WR_USB_DATA7;  /* 向USB端點2的發送緩沖區寫入數據塊 */
	Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
	CH375_DAT_PORT = Len;  /* 首先寫入后續數據長度 */
	for ( i=0; i<Len; i++ ) CH375_DAT_PORT = Buf[i];  /* 加載數據 */
}

/* CH375中斷服務程序INT0,使用寄存器組1 */
void	mCH375Interrupt( ) interrupt 0 using 1
{
	unsigned char InterruptStatus;
	unsigned char length, c1, len1, len2, i;
#define		cmd_buf		((unsigned char data *)(&CMD_PKT))
	CH375_CMD_PORT = CMD_GET_STATUS;  /* 獲取中斷狀態并取消中斷請求 */
	Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
	InterruptStatus = CH375_DAT_PORT;  /* 獲取中斷狀態 */
	IE0 = 0;  /* 清中斷標志,對應于INT0中斷 */
	if ( InterruptStatus == USB_INT_EP2_OUT ) {  /* 批量端點下傳成功 */
		CH375_CMD_PORT = CMD_RD_USB_DATA;  /* 從當前USB中斷的端點緩沖區讀取數據塊,并釋放緩沖區 */
		Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
		length = CH375_DAT_PORT;  /* 首先讀取后續數據長度 */
		if ( length == CONST_CMD_LEN ) {  /* 命令塊長度總是CONST_CMD_LEN,分析并處理命令 */
/* 分析通過USB接收到的命令塊,長度總是CONST_CMD_LEN,首字節為命令,其余為可選的參數,這種命令結構是由單片機和計算機應用層之間自行定義的 */
			for ( i=0; i<CONST_CMD_LEN; i++ ) cmd_buf[i] = CH375_DAT_PORT;  /* 接收命令包的數據 */
			if ( CMD_PKT.mCommandCode != (unsigned char)( ~ CMD_PKT.mCommandCodeNot ) ) return;  /* 命令包反碼校驗錯誤 */
			switch ( CMD_PKT.mCommandCode ) {  /* 分析命令碼,switch可以用多個if/else代替 */
				case DEF_CMD_GET_INFORM:  /* 獲取下位機的說明信息,長度不超過64個字符,字符串以00H結束 */
					CH375_CMD_PORT = CMD_WR_USB_DATA7;  /* 向USB端點2的發送緩沖區寫入數據塊 */
					Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
					CH375_DAT_PORT = 16;  /* 首先寫入后續數據長度 */
					for ( i=0; i<16; i++ ) CH375_DAT_PORT = InformString[i];  /* 加載數據 */
					break;
				case DEF_CMD_TEST_DATA:  /* 測試命令,下位機將PC機發來的命令包的所有數據取反后返回 */
					CH375_CMD_PORT = CMD_WR_USB_DATA7;  /* 向USB端點2的發送緩沖區寫入數據塊 */
					Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
					CH375_DAT_PORT = CONST_CMD_LEN;  /* 首先寫入后續數據長度 */
					for ( i=0; i<CONST_CMD_LEN; i++ ) CH375_DAT_PORT = ~ cmd_buf[i];  /* 加載數據,數據取反后返回,由計算機應用程序測試數據是否正確 */
					break;
				case DEF_CMD_CLEAR_UP:  /* 在上傳數據塊之前進行同步,實際是讓下位機清除上傳緩沖區的已有內容 */
/* 連續上傳數據塊之前進行同步,實際是讓單片機清除上傳緩沖區的已有內容
; 如果上一次進行數據上傳時,計算機提前結束上傳,那么有可能在上傳緩沖區中遺留有數據,所以在第二次上傳前需要清除上傳緩沖區 */
					CH375_CMD_PORT = CMD_SET_ENDP7;  /* 設置USB端點2的IN,也就是批量上傳端點 */
					Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
					CH375_DAT_PORT = 0x0e;  /* 同步觸發位不變,設置USB端點2的IN正忙,返回NAK */
					break;
				case DEF_CMD_UP_DATA:  /* 從下位機的指定地址的緩沖區中讀取數據塊(上傳數據塊) */
/* 連續上傳數據塊, 本程序實際只演示內部RAM */
/*					switch ( CMD_PKT.u.buf.mBufferID ) {
						case ACCESS_MCS51_SFR:  讀寫51單片機的SFR
						case ACCESS_MCS51_IRAM:  讀寫51單片機的內部RAM
						case ACCESS_MCS51_XRAM:  讀寫51單片機的外部RAM
					} */
					CurrentRamAddr = (unsigned char)BIG_ENDIAN( CMD_PKT.u.buf.mBufferAddr );  /* 起始地址,對于內部RAM只用低8位地址 */
					CurrentRamLen = (unsigned char)BIG_ENDIAN( CMD_PKT.u.buf.mLength );  /* 數據塊長度,對于內部RAM總長度不可能超過256 */
					len1 = CurrentRamLen >= CH375_MAX_DATA_LEN ? CH375_MAX_DATA_LEN : CurrentRamLen;  /* 數據上傳,準備第一組數據 */
					LoadUpData( CurrentRamAddr, len1);  /* 加載上傳數據 */
					CurrentRamLen -= len1;
					CurrentRamAddr += len1;
					break;
				case DEF_CMD_DOWN_DATA:  /* 向下位機的指定地址的緩沖區中寫入數據塊(下傳數據塊) */
/* 連續下傳數據塊, 本程序實際只演示外部RAM */
					CurrentRamAddr = BIG_ENDIAN( CMD_PKT.u.buf.mBufferAddr );  /* 起始地址 */
					CurrentRamLen = BIG_ENDIAN( CMD_PKT.u.buf.mLength );  /* 數據塊長度 */
					break;
				case DEMO_CH451_CMD:  /* PC發送命令給CH451,用于演示CH451的功能 */
/*; 為了防止在CH375中斷服務程序打斷主程序中的CH451_READ而執行CH451_WRITE產生錯誤
; 所以在此保存CH451的命令碼由主程序在空閑時發給CH451 */
					CH451_CMD_L = CMD_PKT.u.mParameter[1];  /* 低8位命令 */
					CH451_CMD_H = CMD_PKT.u.mParameter[2];  /* 高4位命令 */
					break;
				default:
					break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品免费观看| 国产伦理精品不卡| 午夜精品福利视频网站| 欧美色网站导航| wwwwww.欧美系列| 国产精品一二三四五| 国产日韩精品一区| 97久久精品人人做人人爽50路| 亚洲精品视频观看| 欧美一三区三区四区免费在线看| 久久99久久久欧美国产| 国产欧美一区二区三区鸳鸯浴 | 亚洲乱码国产乱码精品精的特点 | 国产精品美女久久久久久2018| 91一区二区在线| 三级精品在线观看| 久久久青草青青国产亚洲免观| 99久久免费精品| 日韩电影一区二区三区| 国产日韩欧美精品电影三级在线| 97国产精品videossex| 视频一区二区国产| 中文字幕av一区二区三区高| 欧美日韩专区在线| 国产九色sp调教91| 亚洲成人黄色影院| 中文字幕av一区 二区| 欧美视频一区二区三区四区| 国产精品一区二区男女羞羞无遮挡| 亚洲免费在线观看| 久久影院午夜片一区| 色偷偷88欧美精品久久久| 极品美女销魂一区二区三区免费 | 26uuu国产在线精品一区二区| 日韩在线a电影| 亚洲精品高清视频在线观看| 久久99热这里只有精品| 欧美精品第1页| 亚洲人成亚洲人成在线观看图片| 黑人巨大精品欧美一区| 欧美成人猛片aaaaaaa| 视频在线观看91| 在线观看欧美精品| 樱花影视一区二区| 色综合久久久久综合体| 亚洲国产精品人人做人人爽| 天堂精品中文字幕在线| 欧美一区二区三区男人的天堂| 国产成人精品一区二区三区四区 | 一级日本不卡的影视| 国产喷白浆一区二区三区| 欧美图区在线视频| av一区二区三区黑人| 国产在线精品一区二区三区不卡| 午夜精品久久久久久久99水蜜桃| 亚洲欧洲精品一区二区三区| 精品国产3级a| 日韩精品一区二区三区四区| 欧美日韩国产a| 欧美亚洲一区三区| 色999日韩国产欧美一区二区| 东方欧美亚洲色图在线| 国产综合一区二区| 韩国av一区二区三区四区| 日本sm残虐另类| 日韩精品91亚洲二区在线观看| 亚洲永久免费av| 亚洲欧美日韩在线播放| 亚洲视频中文字幕| 亚洲天堂2016| 亚洲精品国产品国语在线app| 国产精品欧美久久久久无广告| 国产色爱av资源综合区| 欧美激情一二三区| 国产精品天美传媒沈樵| 欧美国产国产综合| 中文字幕一区二区三区av| 中文字幕欧美国产| 国产精品视频九色porn| 亚洲婷婷在线视频| 亚洲免费高清视频在线| 亚洲自拍偷拍图区| 日本最新不卡在线| 美洲天堂一区二卡三卡四卡视频| 裸体健美xxxx欧美裸体表演| 美女一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 国产麻豆欧美日韩一区| 成人福利在线看| 91免费国产视频网站| 欧美视频日韩视频| 日韩精品一区二区三区swag| 久久久久九九视频| 国产精品久久久久久久久免费樱桃 | 日本韩国欧美在线| 欧美日韩精品一区视频| 日韩精品一区二区三区在线 | 亚洲国产精品一区二区久久 | 精品一区二区影视| 国产成人精品一区二区三区四区| 99久久精品国产毛片| 欧美日韩视频不卡| 久久蜜桃一区二区| 亚洲精品综合在线| 免费日韩伦理电影| 成人黄色电影在线| 欧美亚洲国产怡红院影院| 日韩三级中文字幕| 国产精品你懂的| 日韩av电影免费观看高清完整版| 国产老肥熟一区二区三区| 色综合网站在线| 欧美一区二区视频在线观看| 国产精品天天看| 秋霞电影网一区二区| 处破女av一区二区| 91精品国产91久久久久久一区二区| 久久久久久毛片| 亚洲国产精品久久人人爱| 国产一区二区三区在线观看免费视频| 成人av综合在线| 日韩视频免费观看高清完整版| 国产精品婷婷午夜在线观看| 日本美女一区二区三区视频| 成人免费高清视频| 欧美一区二区精品久久911| 国产精品久久久久婷婷二区次| 香蕉成人啪国产精品视频综合网| 国产成人一级电影| 这里是久久伊人| 一区二区三区在线观看国产| 国产一区二区91| 91麻豆精品国产91久久久使用方法 | 亚洲精品乱码久久久久久日本蜜臀| 蜜臀av亚洲一区中文字幕| 99久久综合99久久综合网站| 久久久久久综合| 日韩av高清在线观看| 欧美在线色视频| 亚洲欧美一区二区三区久本道91 | 成av人片一区二区| 亚洲精品在线电影| 免费成人小视频| 91精品国产91热久久久做人人| 一区二区三区成人| av资源站一区| 国产精品网站在线观看| 国产福利一区二区三区视频| 日韩视频123| 另类成人小视频在线| 欧美一区二区三区在线视频| 亚洲18色成人| 欧美色成人综合| 亚洲成av人综合在线观看| 日本高清不卡视频| 亚洲男人电影天堂| 色菇凉天天综合网| 亚洲最大成人综合| 欧洲精品一区二区| 亚洲国产视频a| 欧美精品1区2区3区| 日韩黄色免费网站| 91精品黄色片免费大全| 日韩电影在线观看网站| 8v天堂国产在线一区二区| 日日夜夜精品免费视频| 欧美一卡2卡三卡4卡5免费| 日本人妖一区二区| 日韩三级av在线播放| 另类小说综合欧美亚洲| 欧美精品一区二区在线播放| 黄色精品一二区| 国产欧美精品在线观看| 99国产精品久| 亚洲一区在线免费观看| 91麻豆精品91久久久久同性| 免费国产亚洲视频| 国产日韩高清在线| av电影一区二区| 亚洲h在线观看| 精品久久久三级丝袜| 懂色av一区二区三区免费看| 亚洲欧美激情一区二区| 欧美日韩亚洲综合在线| 久久99九九99精品| 国产精品视频你懂的| 在线观看欧美精品| 久久se精品一区精品二区| 国产亚洲一区二区三区在线观看 | 国产视频视频一区| 91美女片黄在线观看91美女| 亚洲一区二区免费视频| 精品噜噜噜噜久久久久久久久试看| 国产经典欧美精品| 一二三区精品视频| 久久亚洲综合色| 色8久久人人97超碰香蕉987| 蜜桃精品视频在线观看| 综合久久国产九一剧情麻豆| 欧美乱熟臀69xxxxxx|