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

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

?? comm.c

?? 通訊程序
?? C
字號:

#include <common.h>
#include <head.h>

BYTE ToHexchar( BYTE a )
{
	a &= 0x0f;
	if ( a < 10 )
		return a + '0';
	
	return a - 10 + 'A';
}

BYTE HexCharToInt( BYTE c )
{
	if ( ((c) >= '0') && ((c) <= '9') )
		return (c) - '0';

	if ( ((c) >= 'A') && ((c) <= 'F') )
		return (c) - 'A' + 10;

	if ( ((c) >= 'a') && ((c) <= 'f') )
		return (c) - 'a' + 10;

	return 0;
}

BYTE TwoHexCharToInt( BYTE c1, BYTE c2 )
{
	return (HexCharToInt( c1 ) << 4) | HexCharToInt( c2 );
}

BYTE CalCheckCode( u_char idata *buf, BYTE len )
{
	BYTE	i, ret;
	
	ret = 0;
	for( i = 0; i < len; i++ )
		ret += buf[i];
	
	return ret;
}

void EnableSerialComm( void )
{
	u_char	tmp;

	// 串行通訊初始化
	SCON = 0x40;  	// 模式1, 允許接收
	T2CON = 0x30;	// RXD TXD 使用T2
	TR2 = 0;

	// 波特率公式:
	// baud = f/2/16/(65536-(RCAP2H,RCAP2L))
	// f = 40M
	// 1200: 0xfbee
	// 2400: 0xfdf7
	// 4800: 0xfefb
	// 9600: 0xff7d

#if (SCH_PCB_VERSION == 1)
	tmp = ((BYTE)BAUD_RATE_H*2) + (BYTE)BAUD_RATE_L;
#endif
#if (SCH_PCB_VERSION == 2)
	tmp = CommBaudRateConst[P1>>6];
#endif

	RCAP2H = CommBaudRateConst[tmp] >> 8;
	RCAP2L = CommBaudRateConst[tmp];

	TH2 = RCAP2H;
	TL2 = RCAP2L;		

	TR2 = 1;

	RE	= RECV;

	REN = 1;		// 啟動接收
	ES = 1;			// 允許中斷

	EA = 1;
}

void FillHalfByteToCommBuf( BYTE cc )
{
	CommBuf.MsgData[CommBuf.MsgCnt++] = ToHexchar( cc );
}

void FillByteToCommBuf( BYTE cc )
{
	CommBuf.MsgData[CommBuf.MsgCnt++] = ToHexchar( cc >> 4 );
	CommBuf.MsgData[CommBuf.MsgCnt++] = ToHexchar( cc );
}

void CommandProcessExtra( void )
{
	FillByteToCommBuf( CalCheckCode( CommBuf.MsgData, CommBuf.MsgCnt ) );
	CommBuf.MsgData[CommBuf.MsgCnt++] = END_CHAR;
			
	RE = SEND;
	BufUseFlag = 1;
	CommBuf.SendIdx = 0;
	TxdStartFlag = 1;	
	RecvOkFlag = 0;

	TI = 1;
}

void ReadCommand( void )
{
	BYTE 	idx, tmp;
	BYTE	idata	*ptr;
	DWORD	dtmp;

	CommBuf.MsgData[0] = NO_ACK_CHAR;
	CommBuf.MsgCnt = CMD_HEAD_LEN;
	
	idx = CommBuf.MsgData[2] - '1';
	switch ( CommBuf.MsgData[4] )
	{
		case READ_MOTOR_STATUS:	// 讀電機狀態
			if ( idx >= MAX_MOTOR_NUM )
				break;

			// 正確回答
			CommBuf.MsgData[0] = ACK_CHAR;	

			// 填充電機方向
			FillHalfByteToCommBuf( MotorStatus[idx].Dir & DIR_FLAG_MASK );

			// 填充電機狀態
			tmp = MotorStatus[idx].Status & ZERO_RECORD_MASK ? 2 : 0;
			tmp |= MotorStatus[idx].TotalPluseCnt ? 0 : 1;
			FillHalfByteToCommBuf( tmp );

			// 填充電機脈沖計數
			dtmp = MotorStatus[idx].TotalPluseCnt >> 1;

			ptr = (BYTE idata*)&dtmp + MSB;
			if ( *ptr & 0x40 )
				*ptr |= 0x80;
			FillByteToCommBuf( *ptr );
			ptr++;
			FillByteToCommBuf( *ptr );
			ptr++;
			FillByteToCommBuf( *ptr );
			ptr++;
			FillByteToCommBuf( *ptr );
			break;
		
		case READ_VERSION:	// 讀軟件版本號
			CommBuf.MsgData[0] = ACK_CHAR;	
			FillByteToCommBuf( Version );
			break;
	}
	
	CommandProcessExtra( );
}

void WriteCommand( void )
{
	BYTE 		idx;
	BYTE idata 	*ptr;
	WORD		tmp;

	CommBuf.MsgData[0] = NO_ACK_CHAR;
	CommBuf.MsgCnt = CMD_HEAD_LEN;
	
	idx = CommBuf.MsgData[2] - '1';
	switch ( CommBuf.MsgData[4] )
	{
		case WRITE_MOTOR_DATA:	// 寫電機數據
			if ( idx >= MAX_MOTOR_NUM )
				break;
			
			// 已運行
			if ( MotorStatus[idx].Status & MOTOR_RUN_MASK )
				break;

			// 保留零點記錄標志,其余清除
			MotorStatus[idx].Status &= ZERO_RECORD_MASK;

			// 方向
			MotorStatus[idx].Dir = HexCharToInt( CommBuf.MsgData[5] ) & DIR_FLAG_MASK;
						
			// 零位檢測
			if ( (HexCharToInt( CommBuf.MsgData[6] ) & 0x03) == 0x03 )
				break;
			MotorStatus[idx].Status |= HexCharToInt( CommBuf.MsgData[6] ) & 0x01 ? ZERO_CHECK_MASK : 0;
			MotorStatus[idx].Status |= HexCharToInt( CommBuf.MsgData[6] ) & 0x02 ? WORK_ZERO_CHECK_MASK : 0;

			// 升降頻, 轉換時將頻率計數值放低4位,頻率增量放高4位
			MotorStatus[idx].UpDwon = TwoHexCharToInt( CommBuf.MsgData[8], CommBuf.MsgData[7] );
			if ( !(MotorStatus[idx].UpDwon & 0xf0) || !(MotorStatus[idx].UpDwon & 0x0f) )
				MotorStatus[idx].UpDwon = 0;

			// 頻率
			MotorStatus[idx].SetFreq = (TwoHexCharToInt( CommBuf.MsgData[9], CommBuf.MsgData[10] )<<8)
										| TwoHexCharToInt( CommBuf.MsgData[11], CommBuf.MsgData[12] );
			if ( MotorStatus[idx].SetFreq > MAX_FREQ_VAL )
				MotorStatus[idx].SetFreq = MAX_FREQ_VAL;
			if ( MotorStatus[idx].SetFreq < START_FREQ )
				MotorStatus[idx].SetFreq = START_FREQ;
	
			// 脈沖數量
			ptr = (BYTE idata*)&MotorStatus[idx].CmdPluseNum + MSB;
			*ptr = TwoHexCharToInt( CommBuf.MsgData[13], CommBuf.MsgData[14] );
			ptr++;
			*ptr = TwoHexCharToInt( CommBuf.MsgData[15], CommBuf.MsgData[16] );
			ptr++;
			*ptr = TwoHexCharToInt( CommBuf.MsgData[17], CommBuf.MsgData[18] );
			ptr++;
			*ptr = TwoHexCharToInt( CommBuf.MsgData[19], CommBuf.MsgData[20] );
					
			// 回零命令
			if ( MotorStatus[idx].Status & ZERO_CHECK_MASK )
			{
				// 已在零點
				if ( (MotorStatus[idx].TotalPluseCnt == 0) && (MotorStatus[idx].Status & ZERO_RECORD_MASK) )
				{
					// 保留零點記錄
					MotorStatus[idx].Status &= ZERO_RECORD_MASK;
					MotorStatus[idx].Dir = 0;
				}
			}
			CommBuf.MsgData[0] = ACK_CHAR;
			break;

		case WRITE_MOTOR_FREQ:		// 改變電機頻率
			if ( idx >= MAX_MOTOR_NUM )
				break;

			// 已啟動
			if ( MotorStatus[idx].Status & MOTOR_RUN_MASK )
			{
				// 不是升降速都可以改變頻率
				if ( !MotorStatus[idx].UpDwon )
				{
					tmp = (TwoHexCharToInt( CommBuf.MsgData[5], CommBuf.MsgData[6] ) << 8)
							| TwoHexCharToInt( CommBuf.MsgData[7], CommBuf.MsgData[8] );					
					if ( tmp > MAX_FREQ_VAL )
						tmp = MAX_FREQ_VAL;
					if ( tmp < START_FREQ )
						tmp = START_FREQ;

					MotorStatus[idx].SetFreq = tmp;
					CommBuf.MsgData[0] = ACK_CHAR;	
				}
			}
			break;

		case WRITE_MOTOR_STOP_CMD:	// 電機停止
			// 停止所有電機
			if ( idx == 0xff )				
			{
				if ( Timer[0].MotorIdx )
					MotorStatus[Timer[0].MotorIdx-1].Status |= MOTOR_STOP_CMD_MASK;	
					
				if ( Timer[1].MotorIdx )
					MotorStatus[Timer[1].MotorIdx-1].Status |= MOTOR_STOP_CMD_MASK;	
				
				CommBuf.MsgData[0] = ACK_CHAR;
			}
			else if ( idx < MAX_MOTOR_NUM )
			{
				MotorStatus[idx].Status |= MOTOR_STOP_CMD_MASK;
				CommBuf.MsgData[0] = ACK_CHAR;
			}
			break;

		case WRITE_CLR_PLUSE_CNT:
			// 清除所有電機頻率
			if ( idx == 0xff )				
			{
				for( idx = 0; idx < MAX_MOTOR_NUM; idx++ )
				{
					MotorStatus[idx].TotalPluseCnt = 0;
				}
				CommBuf.MsgData[0] = ACK_CHAR;
			}
			else if ( idx < MAX_MOTOR_NUM )
			{
				MotorStatus[idx].TotalPluseCnt = 0;
				CommBuf.MsgData[0] = ACK_CHAR;
			}
			break;
	}
	
	CommandProcessExtra( );
}

void RecvMsgProce( void )
{
	u_char	tmp;

	if ( !RecvOkFlag )
		return;

	// 模塊地址
	tmp = HexCharToInt(CommBuf.MsgData[1]);
	if ( tmp && (tmp != (P1 & 0x0f) ) )
		return;

	// 檢查校驗碼
	if ( TwoHexCharToInt( CommBuf.MsgData[CommBuf.MsgCnt-3], CommBuf.MsgData[CommBuf.MsgCnt-2] ) 
			!= CalCheckCode( CommBuf.MsgData, CommBuf.MsgCnt-3 ) )
	{
		CommBuf.MsgData[0] = NO_ACK_CHAR;
		CommBuf.MsgCnt = CMD_HEAD_LEN;
		CommandProcessExtra( );
		return;	
	}	

	switch( CommBuf.MsgData[3] )
	{
		case 'R':
			ReadCommand( );
			return;
		case 'W':
			WriteCommand( );
			return;
		default:	
			CommBuf.MsgData[0] = NO_ACK_CHAR;
			CommBuf.MsgCnt = CMD_HEAD_LEN;
			CommandProcessExtra( );
			break;
 	}
}

// 注意:中斷程序中不能調用帶參數子程序
void SerialComm( void ) interrupt 4 using 1
{
	if ( RI )
	{
		RI = 0;
		
		CommChar = SBUF;
		if ( (CommChar >= 'a') && (CommChar <= 'z') )
			CommChar = CommChar - 'a' + 'A';

		if ( !RecvOkFlag && !TxdStartFlag )
		{		
			switch( CommBuf.MsgCnt )
			{
				case 0:
					if ( CommChar == START_CHAR )
					{
						CommBuf.MsgData[0] = CommChar;
						CommBuf.MsgCnt = 1;
					}
					break;
				 default:
				 	if ( CommChar == START_CHAR )
					{
						CommBuf.MsgData[0] = CommChar;
						CommBuf.MsgCnt = 1;
						break;
					}
		
					CommBuf.MsgData[CommBuf.MsgCnt] = CommChar;
					CommBuf.MsgCnt++;
					if ( CommBuf.MsgCnt == MAX_COMM_BUF_SIZE )
						CommBuf.MsgCnt = 0;

					if ( CommChar == END_CHAR )
						RecvOkFlag = 1;
					break;
			}
		}
	}

	if ( TI )
	{
		TI = 0;
		if ( (CommBuf.SendIdx < CommBuf.MsgCnt) && TxdStartFlag )
		{
			SBUF = CommBuf.MsgData[CommBuf.SendIdx];
			CommBuf.SendIdx++;
		}
		else
		{
			RE	= RECV;
			CommBuf.MsgCnt = 0;
			CommBuf.SendIdx = 0;
			TxdStartFlag = 0;
		}
	}
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一区二区三区在线 | 久久夜色精品国产噜噜av| 精品成人一区二区三区| 亚洲最新在线观看| 国产高清一区日本| 91麻豆精品国产自产在线 | 大胆亚洲人体视频| 欧美一区二区三区精品| 一区二区三区丝袜| 丰满亚洲少妇av| 精品精品欲导航| 亚洲电影激情视频网站| 99精品久久久久久| 欧美激情综合在线| 国产精品一级片| 精品理论电影在线观看| 五月天精品一区二区三区| 97精品久久久久中文字幕| 国产欧美一区二区精品性色超碰| 免费人成在线不卡| 在线观看91精品国产麻豆| 一级中文字幕一区二区| 色综合久久久久网| 亚洲美女免费视频| 91丨九色丨国产丨porny| 国产精品福利影院| 成人高清av在线| 国产精品三级久久久久三级| 国产夫妻精品视频| 国产视频一区二区在线| 国产一区久久久| 精品久久久久香蕉网| 精品一区二区日韩| www国产精品av| 国产精品性做久久久久久| 欧美成人一区二区三区| 激情欧美日韩一区二区| www久久精品| 成人免费视频国产在线观看| 国产精品视频一二| 99vv1com这只有精品| 亚洲人一二三区| 欧美在线高清视频| 日韩av不卡一区二区| 中文字幕 久热精品 视频在线| 国产精品亚洲综合一区在线观看| 久久久99精品免费观看不卡| 国产成人精品aa毛片| 国产精品久久网站| 色网综合在线观看| 日日嗨av一区二区三区四区| 日韩天堂在线观看| 国产乱码精品一区二区三区av| 中文字幕免费在线观看视频一区| 成人国产精品免费观看视频| 亚洲视频在线一区观看| 欧美色中文字幕| 久久成人免费网站| 国产精品美女久久久久久久网站| 91看片淫黄大片一级| 丝袜国产日韩另类美女| 337p日本欧洲亚洲大胆色噜噜| 国产精品白丝jk黑袜喷水| 亚洲色欲色欲www在线观看| 在线不卡的av| 国产aⅴ精品一区二区三区色成熟| 亚洲视频一区在线| 日韩午夜精品电影| aaa国产一区| 麻豆国产91在线播放| 国产精品成人免费在线| 欧美二区三区91| 成人免费看视频| 午夜精品视频一区| 中文字幕巨乱亚洲| 欧美理论片在线| 97国产精品videossex| 奇米色一区二区| 亚洲啪啪综合av一区二区三区| 91精品欧美福利在线观看| 99精品欧美一区二区蜜桃免费| 蜜臀av亚洲一区中文字幕| 亚洲人午夜精品天堂一二香蕉| 欧美www视频| 欧美日韩精品免费观看视频| 懂色av一区二区夜夜嗨| 美女视频黄a大片欧美| 亚洲精品成人a在线观看| 久久久影视传媒| 7777精品伊人久久久大香线蕉经典版下载| 国产精华液一区二区三区| 三级不卡在线观看| 一区二区欧美国产| 国产精品免费免费| 久久精品一区蜜桃臀影院| 欧美福利视频一区| 色嗨嗨av一区二区三区| 一区二区三区精品在线观看| 香蕉影视欧美成人| 国产日韩精品一区二区三区在线| 欧美日韩三级视频| 色欧美日韩亚洲| www.亚洲精品| 丁香一区二区三区| 久久精品噜噜噜成人av农村| 亚洲地区一二三色| 夜夜精品浪潮av一区二区三区| 亚洲国产精品二十页| 91精品国产91久久久久久一区二区| 色爱区综合激月婷婷| 成a人片国产精品| 成人午夜av电影| 成人久久久精品乱码一区二区三区| 国产精品一区一区| 久久99久久久久| 美腿丝袜亚洲三区| 激情综合一区二区三区| 老司机精品视频线观看86| 蜜臀91精品一区二区三区| 日韩av在线发布| 九九精品视频在线看| 久久99精品久久久久久国产越南| 日本亚洲免费观看| 首页国产欧美日韩丝袜| 奇米影视在线99精品| 日本不卡视频在线| 精品一区二区精品| 高清国产一区二区三区| 成人精品亚洲人成在线| 99久久精品国产导航| 欧洲生活片亚洲生活在线观看| 在线免费av一区| 欧美日韩二区三区| 亚洲精品一区在线观看| 亚洲国产精品v| 一区二区三区四区中文字幕| 香蕉加勒比综合久久 | 久久精品一区四区| 亚洲色图视频网站| 亚洲国产乱码最新视频 | 欧美一级在线视频| 精品国内片67194| 国产精品久久久一区麻豆最新章节| 国产精品国产馆在线真实露脸| 亚洲精品久久久蜜桃| 日韩精品成人一区二区三区| 狠狠色丁香婷婷综合| 97久久超碰国产精品电影| 欧美妇女性影城| 国产欧美日本一区二区三区| 亚洲精品成人精品456| 激情丁香综合五月| 91国在线观看| 精品国产乱码久久久久久闺蜜 | 国产福利一区二区三区| 日本黄色一区二区| 久久综合网色—综合色88| 亚洲欧美日韩系列| 久久成人麻豆午夜电影| 99re视频这里只有精品| 日韩美女视频在线| 日韩美女久久久| 九九国产精品视频| 91福利视频网站| 国产欧美一区二区精品性色超碰| 亚洲电影在线免费观看| 国产高清不卡二三区| 91麻豆精品91久久久久久清纯| 国产精品免费视频观看| 裸体在线国模精品偷拍| 在线观看国产一区二区| 国产精品免费久久| 精品影视av免费| 欧美区视频在线观看| 亚洲日本电影在线| 国产不卡在线视频| 欧美变态口味重另类| 午夜亚洲福利老司机| 一本大道久久a久久精二百 | 欧美日韩国产高清一区二区| 日本一区二区三区国色天香| 久久狠狠亚洲综合| 欧美伦理电影网| 亚洲一本大道在线| 91丨国产丨九色丨pron| 国产精品每日更新在线播放网址 | 成人在线综合网| 精品国产乱码久久| 美女网站一区二区| 91精品国产一区二区三区蜜臀 | 日韩精品一二三区| 欧美丝袜丝交足nylons| 亚洲精品国产视频| 91网站最新地址| 日韩理论电影院| 91小视频免费看| 一区二区三区不卡视频| 日本二三区不卡| 亚洲一二三专区| 欧美日韩一区二区三区免费看|