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

📄 p_hd600.c

📁 这是监视器行业常见的键盘与球机通讯协议的C语言源代码
💻 C
字号:

/*

history;
  V 1.00 build 2003.05.24 by zh
  V 2.00 build 2003.06.21 by zh
  V 2.01 build 2003.06.27 by zh

*/

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

unsigned char data data4,data5,data6,data7,data8,datax;
unsigned char data pp = 0; // for seq point
bit start_set_fg = 0;
bit power_fg = 1;
/*
bit len6_fg = 0;
bit ti_fg = 0;
unsigned char idata sd[7];
unsigned char idata preset_no = 0;
*/

void (code * rr)(unsigned char rc);
void (code *ext)(unsigned char rc);
void word1(unsigned char rc);
void word2(unsigned char rc);
void word3(unsigned char rc);
void word4(unsigned char rc);
void word5(unsigned char rc);
void word6(unsigned char rc);
void word7(unsigned char rc);

void send_cs(unsigned char cc);

void word1(unsigned char rc)
{
	if (rc == 0xf6) 
	{
	//	len6_fg = 1;
		rr = word2;
	}
	/*
	else if (rc == 0xf4)
	{
		len6_fg = 0;
		rr = word2;
	}*/
}

void word2(unsigned char rc)
{
	datax = rc;
	data4 = rc;
	rr = word3;
}

void word3(unsigned char rc)
{
	datax += rc;
	if (rc == idh)
		rr = word4;
	else
		rr = word1;
}

void word4(unsigned char rc)
{
	datax += rc;
	if (rc == id)
		rr = word5;
	else
		rr = word1;
}

void word5(unsigned char rc)
{	
/*	if (!len6_fg)
	{
		rr = word1;
		datax &= 0x7f;
		if (datax == rc)
		{
			switch (data4)
			{
			case 0x51:
				seq[15] = 100;
				call_pre_fg = 1;
				break;
			case 0x53:
				seq[15] = 101;
				call_pre_fg = 1;
				break;
			case 0x58:
				seq[15] = 102;
				call_pre_fg = 1;
				break;
			case 0x63:
				seq[15] = 103;
				call_pre_fg = 1;
				break;
			case 0x65:
				seq[15] = 104;
				call_pre_fg = 1;
				break;
			case 0x67:
				seq[15] = 105;
				call_pre_fg = 1;
				break;
			case 0x69:
				seq[15] = 106;
				call_pre_fg = 1;
				break;
			case 0x6b:
				seq[15] = 107;
				call_pre_fg = 1;
				break;
			case 0x6c:
			case 0x6d:
				seq[15] = 108;
				call_pre_fg = 1;
				break;
			case 0x6e:
			case 0x6f:
				seq[15] = 109;
				call_pre_fg = 1;
				break;
			}
		}
	}
	else */
	{
		data7 = rc;
		datax += rc;
		rr = word6;
	}
}

void word6(unsigned char rc)
{
	data8 = rc;
	datax += rc;
	datax &= 0x7f;
	rr = word7;
}

void word7(unsigned char rc)
{
	rr = word1;
	if (datax == rc)
	{
		//if (data8 == 0x0f)
		{
			switch(data4)
			{
			case 0x45:
				cont_fg = 1;
				seq[12] = 4;
				seq[13] = data7*7;
				seq[14] = 0;
				if (seq[13] == 0) seq[12] = 0;
				break;
			case 0x46:
				cont_fg = 1;
				seq[12] = 2;
				seq[13] = data7*7;
				seq[14] = 0;
				if (seq[13] == 0) seq[12] = 0;
				break;
			case 0x47:
				cont_fg = 1;
				seq[12] = 8;
				seq[14] = data7*7;
				seq[13] = 0;
				if (seq[14] == 0) seq[12] = 0;
				break;
			case 0x48:
				cont_fg = 1;
				seq[12] = 16;
				seq[14] = data7*7;
				seq[13] = 0;
				if (seq[14] == 0) seq[12] = 0;
				break;
			case 0x49:
				if (data7 != 0x00)
					iris_close_fg = 1;
				break;
			case 0x4a:
				if (data7 != 0x00)
					iris_open_fg = 1;
				break;
			case 0x4b:
				if (data7 == 0x00)
					focu_stop_fg = 1;
				else
					focu_near_fg = 1;
				break;
			case 0x4c:
				if (data7 == 0x00)
					focu_stop_fg = 1;
 			    else
					focu_far_fg = 1;
				break;
			case 0x4d:			
				if (data7 == 0x00) 
					zoom_stop_fg = 1;
				else
					zoom_wide_fg = 1;
				break;
			case 0x4e:
				if (data7 == 0x00)
					zoom_stop_fg = 1;
				else
					zoom_tele_fg = 1;
				break;
			case 0x52:
				set_pre_fg = 1;
				seq[15] = data7;
			//	preset_no = data7;
				break;
			case 0x54:
				call_pre_fg = 1;
				seq[15] = data7;
				break;
			case 0x59:
				run_seq2_fg = 1;
				break;
			case 0x5c:
				if (data7 == 0x00)
					seq[15] = 51;
				else
					seq[15] = 52;
					
				set_pre_fg = 1;
				break;
			case 0x5d:
				if (data7 == 0x01)
				{
					run_swing_fg = 1;
					seq[17] = 51;
					seq[18] = 52;
				}
				break;
			case 0x9a:
			 	switch(data7)
				{
				case 0:
					break;
				case 1:
					power_fg = 1;
					power_on_fg = 1;
					break;
				case 2:
					addon_fg = 1;
	 				seq[10] = A_DIGI;
	 				seq[11] = ON;
					break;
				case 3:
					addon_fg = 1;
	  				seq[10] = A_FOCU;	
	  				seq[11] = AUTO;
					break;
				case 4:
					addon_fg = 1;
					seq[10] = A_BLC;
					seq[11] = ON;
					break;
				case 5:
				case 6:
				case 7:
				case 8:
				case 9:
				case 10:
				case 11:
					break;
				case 12:
					addon_fg = 1;
	  				seq[10] = A_WB;
	  				seq[11] = AUTO;
					break;
				case 13:
					disp_on_fg = 1;
					break;
				case 14:
					addon_fg = 1;
	  				seq[10] = A_MIRR;
	  				seq[11] = ON;
					break;
				case 15:
				default:
					break;
				}
				break;
			case 0x9b:
				switch(data7)
				{
				case 0:
					break;
				case 1:
					power_fg = 0;
					power_off_fg = 1;
					break;
				case 2:
					addon_fg = 1;
	 				seq[10] = A_DIGI;
	 				seq[11] = OFF;
					break;
				case 3:
					addon_fg = 1;
	  				seq[10] = A_FOCU;	
	  				seq[11] = MANU;
					break;
				case 4:
					addon_fg = 1;
					seq[10] = A_BLC;
					seq[11] = OFF;
					break;
				case 5:
				case 6:
				case 7:
				case 8:
				case 9:
				case 10:
				case 11:
					break;
				case 12:
					addon_fg = 1;
	  				seq[10] = A_WB;
	  				seq[11] = MANU;
					break;
				case 13:
					disp_off_fg = 1;
					break;
				case 14:
					addon_fg = 1;
	  				seq[10] = A_MIRR;
	  				seq[11] = OFF;
					break;
				case 15:
				default:
					break;
				}
				break;
			}
		}
	}
}

extern bit do_set_addon(unsigned char no)
{  
//#ifndef DIS660
	switch (no)
	{
	case F_SCAN_START:   		
	case F_SCAN_END:   
		no = no;
		return 0;
	case F_SEQ_SET:
		run_seq_fg = 0;
		run_seq2_fg = 0;
		return 1;
#ifndef DIS660
	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:			
		disp_off_fg = 1;
		return 1;
	case F_DIGI_OFF:
		addon_fg = 1;		
	 	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;
#endif
	  default:
		no = no;
		return 0;
	}
/*
#else
    no = no;
	return 0;
#endif
*/
}


extern bit do_call_addon(unsigned char no)
{
	switch (no)
	{
	case 0x60:
	case 0x61:
	case 0x63:
		run_seq_fg = 0;
		run_swing_fg = 0;
		run_swing2_fg = 1;
		return 1;
	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;
		run_swing2_fg = 0;
		return 1;
	case F_SEQ_RUN:
	    run_seq2_fg = 1;		
		return 1;
#ifndef DIS660
	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_FRZE;
	  	seq[11] = ON;
	  	return 1;
	  case F_MIRRO_ON:
	  	addon_fg = 1;
	  	seq[10] = A_MIRR;
	  	seq[11] = ON;
	  	return 1;
#endif
	default:
		no = no;
		return 0;
	}
//#else
//    no = no;
//	return 0;
//#endif
}


/*		
	  case 100:
	  	sd[0] = 0xf5;
		sd[1] = 0x10;
		sd[2] = idh;
		sd[3] = id;
		sd[4] = 0x0f;
		send_cs(6);
		return 1;
	 case 101:
	 	sd[0] = 0xf5;
		sd[1] = 0x11;
		sd[2] = idh;
		sd[3] = id;
		sd[4] = preset_no;
		send_cs(6);
		return 1;
	case 102:
	 	sd[0] = 0xf5;
		sd[1] = 0x12;
		sd[2] = idh;
		sd[3] = id;
		sd[4] = 0;
		sd[5] = 0;
		send_cs(6);
		return 1;
	case 103:
	 	sd[0] = 0xf5;
		sd[1] = 0x14;
		sd[2] = idh;
		sd[3] = id;
		sd[4] = 0;
		sd[5] = 0;
		send_cs(7);
		return 1;
	case 104:
	 	sd[0] = 0xf5;
		sd[1] = 0x15;
		sd[2] = idh;
		sd[3] = id;
		sd[4] = 0;
		sd[5] = 0;
		send_cs(7);
		return 1;
	case 105:
	 	sd[0] = 0xf5;
		sd[1] = 0x16;
		sd[2] = idh;
		sd[3] = id;
		sd[4] = 0;
		sd[5] = 0;
		send_cs(7);
		return 1;
	case 106:
	 	sd[0] = 0xf5;
		sd[1] = 0x17;
		sd[2] = idh;
		sd[3] = id;
		sd[4] = 0;
		sd[5] = 0;
		send_cs(7);
		return 1;
	case 107:
	 	sd[0] = 0xf5;
		sd[1] = 0x18;
		sd[2] = idh;
		sd[3] = id;
		sd[4] = 0;
		sd[5] = 0;
		send_cs(7);
		return 1;
	case 108:
	 	sd[0] = 0xf5;
		sd[1] = 0x19;
		sd[2] = idh;
		sd[3] = id;
		sd[4] = 04;
		sd[5] = 0;
		send_cs(7);
		return 1;
	case 109:
	 	sd[0] = 0xf5;
		sd[1] = 0x1a;
		sd[2] = idh;
		sd[3] = id;
		sd[4] = 02;
		sd[5] = 0;
		send_cs(7);
		return 1; */

/*
void send_cs(unsigned char cc)
{
	unsigned char i;
	sd[cc - 1] = 0;
	for (i=1;i<cc-1;i++) sd[cc-1] += sd[i];
	if (sd[cc - 1] > 128) sd[cc - 1] -= 128;

	DR = 1;
	for (i=0;i<cc;i++)
	{
		SBUF = sd[i];
		while(ti_fg == 0);
		ti_fg = 0;
		_nop_();
	}
	DR = 0;
}
*/

extern void init_serial(void)
{
	PCON = 0x00;SCON = 0x50;
	TH2 = 0xff; RCAP2H = 0xff;
#ifdef FOCS_40M
	TL2 = 0x7e; RCAP2L = 0x7e;
#else // for 22.1184
	TL2 = 0xb8; RCAP2L = 0xb8;
#endif
	T2CON = 0x34;

// for addr 0 -- 511
	if ((id & 0x80) == 0x80)
		idh |= 0x80;
	
	id &= 0x7f;

	AD9 = 1;
	if (!AD9) idh |= 0x01;

	//for addr 512 -- 1023
	//idh |= 0x02;
	
	rr = word1;
}

void serial_int(void) interrupt 4 using 1
{ 
	ES = 0;
	//if (_testbit_(TI)) {ti_fg = 1;}
	if (_testbit_(RI)) (*rr)(SBUF);
	ES = 1;
}

⌨️ 快捷键说明

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