⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_pelcop48.c

📁 这是监视器行业常见的键盘与球机通讯协议的C语言源代码
💻 C
字号:
//
// V1.00 build 2003.04.21 by xsh 轨迹与线扫暂未使用
// V1.01 build 2003.05.23 by zh  完善协议
// V2.00 build 2003.06.20 by zh  改成函数指针处理,以减少处理周期

#include <REG54.H>
#include <INTRINS.H>
#include "protocol.h"
#include "kernel.h"
#include "config.h"

//unsigned char data rr=0;
unsigned char data1,data3,data4,datax;
unsigned char bdata data2;
sbit ext_fg = data2^0;
//unsigned char data recv_code;
bit power_fg = 0;
unsigned char data rc;

void (code *rr)(void);
void word1(void);
void word2(void);
void word3(void);
void word4(void);
void word5(void);
void word6(void);
void word7(void);
void word8(void);

void word1(void)
{
	if (rc == 0xa0)
	{
		datax = rc;
		rr = word2;
	}
}

void word2(void)
{
	if(rc != (id - 1)) 
		rr = word1;
	else
	{
		rr = word3;
		datax = datax^rc;
	}
}

void word3(void)
{
	data1 = rc;
	datax = datax^data1;
	rr = word4;
}

void word4(void)
{
	data2 = rc;
	datax = datax^data2;
	rr = word5;
}

void word5(void)
{
	data3 = rc;
	datax = datax^data3;
	rr = word6;
}

void word6(void)
{
	data4 = rc;
	datax = datax^data4;
	rr = word7;
}

void word7(void)
{
	if (rc != 0xaf) 
		rr = word1;
	else
	{
		datax = datax^0xaf;
		rr = word8;
	}
}

void word8(void)
{
	rr = word1;
	if (rc == datax)
	{
		if(ext_fg)
		{	
			switch(data2)
			{
			case 0x03:	
				set_pre_fg=1;
				run_swing_fg=0;
				run_seq2_fg=0;
				seq[15]=data4;
				break;
			case 0x07:
				call_pre_fg=1;
				run_swing_fg=0;
				run_seq2_fg=0;
				seq[15]=data4;
				break;
			}															
		}
		else		//不是Extened Command命令
		{
			if (data1)
			{
				switch(data1)
				{
					case 1:		//focu far
						focu_far_fg = 1;
						focus_need_stop = 1;
						break;
					case 2:		//focu near
						focu_near_fg = 1;
						focus_need_stop = 1;
						break;
					case 4: 	//iris open
						iris_open_fg = 1;
						break;
					case 8:		//iris close
						iris_close_fg = 1;
						break;						
				}						
			}
			else
			{
				switch(data2)
				{
					case 2:		//pan turn right
					case 4:		//pan turn left
					case 8:		//tilt up
					case 0x10:	//tilt down
					case 0x0a:	//tilt up and pan turn right
					case 0x0c:	//tilt up and pan left
					case 0x12:	//tilt down and pan right
					case 0x14:	//tilt down and pan left
						cont_fg = 1;
						run_seq2_fg = 0;
						run_swing_fg = 0;
						run_seq_fg = 0;
						seq[12] = data2;
						seq[13] = data3;									
						seq[14] = data4;
						break;
					case 0x20:	//zoom tele
						zoom_tele_fg = 1;
						zoom_need_stop = 1;
						break;
					case 0x40:	//zoo wide
						zoom_wide_fg = 1;
						zoom_need_stop = 1;
						break;							
					default:		
						if (_testbit_(zoom_need_stop)) zoom_stop_fg = 1;
						if (_testbit_(focus_need_stop)) focu_stop_fg = 1;
						seq[12] = 0;		//seq[12]---手动时的方向		
						cont_fg = 1;		//cont_fg---手动控制标志
						break;														
				}
			}					
		}
	}
}

/* 返回值为1则不当做预置点功能,返回值为0则是预置点功能 */
/* 用设置预置点的方法来实现附加功能*/
extern bit do_set_addon(unsigned char no)
{   
	switch (no)
	{
	case F_SCAN_START:   
	case F_SCAN_END:   
	case F_SEQ_SET:
		no = no;
		return 0;
	case F_CAM_RESET:			//camera reset
		addon_fg = 1;
		seq[10] = A_RESET;
		seq[11] = ON;
		return 1;
	case F_BLC_OFF:			//背光补偿关
		addon_fg = 1;   
		seq[10] = A_BLC;
		seq[11] = OFF;
		return 1;
	case F_ZERO_OFF:			//低照度关
		addon_fg = 1;
		seq[10] = A_ZERO;
		seq[11] = OFF;
		return 1;
	case F_MENU_OFF:			//diaplay off
		disp_off_fg = 1;
		return 1;
	case F_DIGI_OFF:
		addon_fg = 1;		//camera digital off
	 	seq[10] = A_DIGI;
	 	seq[11] = OFF;
	 	return 1;
	 case F_FOCU_MANU:
	 	addon_fg = 1;
	  	seq[10] = A_FOCU;		//聚焦手动
	  	seq[11] = MANU;
	  	return 1;
	  case F_IRIS_MANU:			// 光圈手动
	  	addon_fg = 1;
	  	seq[10] = A_IRIS;
	  	seq[11] = MANU;
	  	return 1;
	  case F_WB_MANU:			// 白平衡手动
	  	addon_fg = 1;
	  	seq[10] = A_WB;
	  	seq[11] = MANU;
	  	return 1;
	  case F_BLACK:			//黑白模式
	  	addon_fg = 1;
	  	seq[10] = A_BLACK;
	  	seq[11] = OFF;
	  	return 1;
	  case F_FREEZE_OFF:			//图象冻结解除
	  	addon_fg = 1;
	  	seq[10] = A_FRZE;
	  	seq[11] = OFF;
	  	return 1;
	  case F_MIRRO_OFF:			//镜像解除
	  	addon_fg = 1;
	  	seq[10] = A_MIRR;
	  	seq[11] = OFF;
	  	return 1;
	  default:
		no = no;
		return 0;
	}
}

/* 用调用预置点的方法来实现附加功能*/

extern bit do_call_addon(unsigned char no)
{
	switch (no)
	{
	case F_SCAN_RUN:
	    run_swing_fg = 1;
		seq[17] = F_SCAN_START;			//start point
		seq[18] = F_SCAN_END;			//end point
		return 1;
	case F_SCAN_STOP:
		run_swing_fg = 0;
		return 1;
	case F_SEQ_RUN:
	    run_seq2_fg = 1;		//运行轨迹标志,调用第一至第十六个预置点
		return 1;
	case F_CAM_POWER:
		power_fg = !power_fg;
		power_on_fg = power_fg;
		power_off_fg = !power_fg;
	    return 1;
	case F_BLC_ON:			//背光补偿开
		addon_fg = 1;
		seq[10] = A_BLC;
		seq[11] = ON;
		return 1;
	case F_ZERO_ON:			//低照度开
		addon_fg = 1;
		seq[10] = A_ZERO;
		seq[11] = ON;
		return 1;
	case F_MENU_ON:			//屏显开
		disp_on_fg = 1;
		return 1;
	case F_DIGI_ON:			//数字变倍开
		addon_fg = 1;
	 	seq[10] = A_DIGI;
	 	seq[11] = ON;
	 	return 1;
	 case F_FOCU_AUTO:
	    addon_fg = 1;
	  	seq[10] = A_FOCU;		//聚焦自动
	  	seq[11] = AUTO;
	  	return 1;
	  case F_IRIS_AUTO:			// 光圈自动
	  	addon_fg = 1;
	  	seq[10] = A_IRIS;
	  	seq[11] = AUTO;
	  	return 1;
	  case F_WB_AUTO:			// 白平衡自动
	  	addon_fg = 1;
	  	seq[10] = A_WB;
	  	seq[11] = AUTO;
	  	return 1;
	  case F_COLOR:			//黑白模式
	  	addon_fg = 1;
	  	seq[10] = A_BLACK;
	  	seq[11] = ON;
	  	return 1;
	  case F_FREEZE_ON:			//图象冻结
	  	addon_fg = 1;
	  	seq[10] = A_ZERO;
	  	seq[11] = ON;
	  	return 1;
	  case F_MIRRO_ON:			//镜像开
	  	addon_fg = 1;
	  	seq[10] = A_MIRR;
	  	seq[11] = ON;
	  	return 1;
	default:
		no = no;
		return 0;
	}
}

//初始化串行口
extern void init_serial(void)
{
	PCON = 0x00;SCON = 0x50;
	TH2 = 0xff; RCAP2H = 0xff;
#ifdef FOCS_40M
	TH2 = 0xfe; RCAP2H = 0xfe;
	TL2 = 0xfc; RCAP2L = 0xfc;
#else
	TH2 = 0xff; RCAP2H = 0xff;
	TL2 = 0x70; RCAP2L = 0x70;
#endif
	T2CON = 0x34;

	rr = word1;
}

//串行口中断服务程序
void serial_int(void) interrupt 4 using 1	// 串行口中断有高优先级,使用寄存器组1
{
	ES = 0;
	rc = SBUF;
	if (_testbit_(RI)) (*rr)();
	ES = 1;
/*
	ES=0;
	if (_testbit_(RI))
	{	
		rr++;
		recv_code = SBUF;
		switch(rr)
		{
			case 1:	
				if (recv_code != 0xa0) rr=0;
				datax =recv_code;
				break;
			case 2:		//address
				if(recv_code != (id - 1)) rr=0;
				datax = datax^recv_code;
				break;
			case 3:		//data1
				data1 = recv_code;
				datax = datax^data1;
				break;
			case 4:		//data2
				data2=recv_code;
				datax = datax^data2;
				break;
			case 5:		//data3
				data3=recv_code;
				datax = datax^data3;
				break;
			case 6:		//data4
				data4=recv_code;
				datax = datax^data4;
				break;
			case 7:		//end transmission
				if(recv_code != 0xaf) rr = 0;
				datax = datax^0xaf;
				break;
			case 8:		//表明此时的check-sum已经传来
				if (recv_code == datax)
				{
					if(ext_fg)
					{	
						switch(data2)
						{
							case 0x03:	
									set_pre_fg=1;
									run_swing_fg=0;
									run_seq2_fg=0;
									seq[15]=data4;
									break;
							case 0x07:
									call_pre_fg=1;
									run_swing_fg=0;
									run_seq2_fg=0;
									seq[15]=data4;
									break;
						}															
					}
					else		//不是Extened Command命令
					{
						if (data1)
						{
							switch(data1)
							{
								case 1:		//focu far
									focu_far_fg = 1;
									focus_need_stop = 1;
									break;
								case 2:		//focu near
									focu_near_fg = 1;
									focus_need_stop = 1;
									break;
								case 4: 	//iris open
									iris_open_fg = 1;
									break;
								case 8:		//iris close
									iris_close_fg = 1;
									break;						
							}
							
						}
						else
						{
							switch(data2)
							{
								case 2:		//pan turn right
								case 4:		//pan turn left
								case 8:		//tilt up
								case 0x10:	//tilt down
								case 0x0a:	//tilt up and pan turn right
								case 0x0c:	//tilt up and pan left
								case 0x12:	//tilt down and pan right
								case 0x14:	//tilt down and pan left
									cont_fg = 1;
									run_seq2_fg = 0;
									run_swing_fg = 0;
									run_seq_fg = 0;
									seq[12] = data2;
									seq[13] = data3;									
									seq[14] = data4;
									break;
								case 0x20:	//zoom tele
									zoom_tele_fg = 1;
									zoom_need_stop = 1;
									break;
								case 0x40:	//zoo wide
									zoom_wide_fg = 1;
									zoom_need_stop = 1;
									break;							
								default:		
								  	if (_testbit_(zoom_need_stop)) zoom_stop_fg = 1;
									if (_testbit_(focus_need_stop)) focu_stop_fg = 1;
									seq[12] = 0;		//seq[12]---手动时的方向		
									cont_fg = 1;		//cont_fg---手动控制标志
									break;														
							}
						}
						
					}
				}
				default:
					rr=0;
					break;
		}
	}
	ES=1;
*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -