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

📄 board_type.c

📁 单片机程序代码,经过很详细的测试.呵呵,硬件相关.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <REG54.H>
#include "rc7820.h"
#include "rc7860.h"
#include "f2rc7820.h"
#include "f2rc7860.h"
#include "cmd_para_save.h"
#include "rc7860.h"
#include "ep1k50.h"

extern void init_7820(void);
extern void init_7860(void);
extern void init_se0111(unsigned char slot);
extern void init_se0121(unsigned char slot);
extern unsigned char se0111_reg_rd(unsigned char Haddr,unsigned char Laddr,unsigned char slot);
extern void se0111_reg_wr(unsigned char Haddr,unsigned char Laddr,unsigned char value,unsigned char slot);
extern unsigned char se0121_reg_rd(unsigned char Laddr,unsigned char slot);
extern void se0121_reg_wr(unsigned char Laddr,unsigned char value,unsigned char slot);
extern void init_se0121(unsigned char slot);
extern void f2_rc7820(void);
extern unsigned char f2rc7820_rd(unsigned char f2addr) large reentrant;
extern void f2rc7820_wr(unsigned char f2addr,unsigned char value) large reentrant;
extern void f2_rc7860(void);
extern unsigned char f2rc7860_rd(unsigned int f2addr) large reentrant;
extern void f2rc7860_wr(unsigned int f2addr,unsigned char value) large reentrant;
extern void reset_f2rc7860(void);
extern void SetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char GetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char xdata tx_buf[];
extern unsigned char xdata tx_buf_pointer;
extern bit tx_done;
extern unsigned long int xdata commandid;
unsigned char xdata start_flg[4] = {1,1,1,1};					//查询单盘是否初始化标志位
unsigned char xdata start_flg_EOS[4] = {1,1,1,1};
unsigned char xdata board_flg[4] = {0,0,0,0};					//是否调用单盘初始化函数标志位
unsigned char xdata hold_board[4] = {0,0,0,0};					//单盘保持标志,防止单盘抖动用

extern unsigned char xdata lparray2m[3][21];
extern unsigned char xdata lparray_EOS[3];
extern unsigned char xdata EB_2M[3][21];
extern unsigned long int xdata REI_2M[3][21];
extern unsigned long int xdata REI_2M_15min[3][21];
extern unsigned int xdata PJC_2M[3][21];
extern unsigned int xdata PJC_2M_15min[3][21];
extern unsigned int xdata NJC_2M[3][21];
extern unsigned int xdata NJC_2M_15min[3][21];
extern unsigned char xdata lparrayf[4];
extern unsigned int xdata B1[4];
extern unsigned int xdata B2[4];
extern unsigned long int xdata REI_MS[4];
extern unsigned long int xdata REI_MS_15min[4];
extern unsigned int xdata B3[4];
extern unsigned long int xdata REI_HP[4];
extern unsigned long int xdata REI_HP_15min[4];
extern unsigned int xdata OFS[4];
extern unsigned int xdata OFS_15min[4];
extern unsigned int xdata PJC_HP[4];
extern unsigned int xdata PJC_HP_15min[4];
extern unsigned int xdata NJC_HP[4];
extern unsigned int xdata NJC_HP_15min[4];
extern unsigned char xdata timeslot_2M[3][21];

unsigned char xdata board_type[4][2] = {{4,4},{1,0},{2,0},{3,0}};	//定义插盘类型数组,第一位表示槽号,第二位表示盘号

unsigned char get_board_type(struct cmd_para_save *get_board){
//C30读取槽位中的插盘类型
unsigned char xdata boardid;
unsigned char xdata return_value;

	boardid = get_board -> board_num;

	switch (boardid){
	case 1: P1 = 0x20;
			return_value = XBYTE[0xA400];
			P1 = 0xFF;
			if (return_value == 0x51){
				return_value = 2;				//查到插盘为AMB(2M盘)
			}
			else if (return_value == 0x57){
				return_value = 3;
			}
			else return_value = 0;
			break;
	case 2: P1 = 0x60;
			return_value = XBYTE[0xA400];
			P1 = 0xFF;
			if (return_value == 0x51){
				return_value = 2;				//查到插盘为AMB(2M盘)
			}
			else if (return_value == 0x57){
				return_value = 3;
			}
			else return_value = 0;
			break;
	case 3: P1 = 0x40;
			return_value = XBYTE[0xA400];
			P1 = 0xFF;
			if (return_value == 0x51){
				return_value = 2;				//查到插盘为AMB(2M盘)
			}
			else if (return_value == 0x57){
				return_value = 3;
			}
			else return_value = 0;
			break;
	case 4: P1 = 0x10;
			return_value = XBYTE[0xB000];
			P1 = 0xFF;
			if (return_value == 0x55){
				return_value = 4;				//查到插盘为OTB-1
			}
			else return_value = 0;
			break;
	default: return_value = 6;
			 break;
	}
	if (!GetResRdyTbl(13))
		SetResRdyTbl(13);
	return (return_value);
}


void report_board_type(unsigned char value){
//C30回应函数
	tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x43;
	tx_buf[4] = 0x33;
	tx_buf[5] = 0x30;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '0';
	tx_buf[9] = '2';
	if (value == 6){
		tx_buf[10] = '2';
	}
	else tx_buf[10] = '0';
	tx_buf[11] = value + 0x30;
	tx_buf[12] = '*';
	tx_buf_pointer = 0;	
	while(tx_buf[tx_buf_pointer] != '*'){
		SBUF = tx_buf[tx_buf_pointer];
		while(tx_done == 0);
		tx_done = 0;
		tx_buf_pointer++;
	}
	SBUF = tx_buf[tx_buf_pointer];          //发送最后一个字符'*'
	while(tx_done == 0);
	tx_done = 0;
}


unsigned char get_board_state(struct cmd_para_save *get_board){
//C31读取槽位中的插盘状态
unsigned char xdata boardid;
unsigned char xdata return_value;

	boardid = get_board -> board_num;

	switch (boardid){
	case 1: P1 = 0x20;
			return_value = XBYTE[0xA400];
			P1 = 0xFF;
			if (return_value == 0x51){
				return_value = 1;				//查到插盘为AMB(2M盘)
			}
			else if (return_value == 0x57){
				return_value = 1;				//查到插盘为EOS
			}
			else return_value = 2;
			break;
	case 2: P1 = 0x60;
			return_value = XBYTE[0xA400];
			P1 = 0xFF;
			if (return_value == 0x51){
				return_value = 1;				//查到插盘为AMB(2M盘)
			}
			else if (return_value == 0x57){
				return_value = 1;				//查到插盘为EOS
			}
			else return_value = 2;
			break;
	case 3: P1 = 0x40;
			return_value = XBYTE[0xA400];
			P1 = 0xFF;
			if (return_value == 0x51){
				return_value = 1;				//查到插盘为AMB(2M盘)
			}
			else if (return_value == 0x57){
				return_value = 1;				//查到插盘为EOS
			}
			else return_value = 2;
			break;
	case 4: P1 = 0x10;
			return_value = XBYTE[0xB000];
			P1 = 0xFF;
			if (return_value == 0xAA){
				return_value = 1;				//查到插盘为OTB-1
			}
			else return_value = 2;
			break;
	default: return_value = 3;
			 break;
	}
	if (!GetResRdyTbl(14))
		SetResRdyTbl(14);
	return (return_value);
}


void report_board_state(unsigned char value){
//C31回应函数
	tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x43;
	tx_buf[4] = 0x33;
	tx_buf[5] = 0x31;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '0';
	tx_buf[9] = '2';
	if (value == 3){
		tx_buf[10] = '2';
	}
	else tx_buf[10] = '0';
	tx_buf[11] = value + 0x30;
	tx_buf[12] = '*';
	tx_buf_pointer = 0;	
	while(tx_buf[tx_buf_pointer] != '*'){
		SBUF = tx_buf[tx_buf_pointer];
		while(tx_done == 0);
		tx_done = 0;
		tx_buf_pointer++;
	}
	SBUF = tx_buf[tx_buf_pointer];          //发送最后一个字符'*'
	while(tx_done == 0);
	tx_done = 0;
}


unsigned char initializers_one_board(struct cmd_para_save *init_one_board){
//M01 MCP下发初始化某一单盘命令
unsigned char xdata btemp;
unsigned char xdata boardid;
unsigned char xdata return_value;
	
	commandid = 0x00543931;
	boardid = init_one_board -> single_board_reset;

	switch (boardid){
		case 1: P1 = 0x20;
				btemp = XBYTE[0xA400];
				P1 = 0xFF;
				if (btemp == 0x51){
					init_se0111(1);
					start_flg[1] = 0;
					return_value = 0;
				}
				else if (btemp == 0x57){
					init_se0121(1);
					start_flg_EOS[1] = 0;
					return_value = 0;
				}
				else return_value = 2;
				break;
		case 2: P1 = 0x60;
				btemp = XBYTE[0xA400];
				P1 = 0xFF;
				if (btemp == 0x51){
					init_se0111(2);
					start_flg[2] = 0;
					return_value = 0;
				}
				else if (btemp == 0x57){
					init_se0121(2);
					start_flg_EOS[2] = 0;
					return_value = 0;
				}
				else return_value = 2;
				break;
		case 3: P1 = 0x40;
				btemp = XBYTE[0xA400];
				P1 = 0xFF;
				if (btemp == 0x51){
					init_se0111(3);
					start_flg[3] = 0;
					return_value = 0;
				}
				else if (btemp == 0x57){
					init_se0121(3);
					start_flg_EOS[3] = 0;
					return_value = 0;
				}
				else return_value = 2;
				break;
		case 4:	P1 = 0x10;
				btemp = XBYTE[0xB000];
				P1 = 0xFF;
				if (btemp == 0x55){
					reset_f2rc7860();
			    	f2_rc7820();
					f2rc7820_wr(F2Encrypt_reg,0xAA);
					f2rc7820_wr(F2Intmask_reg,0xFF);

				    f2_rc7860();
					f2rc7860_wr(F2Dxc_cntr,0xA0);
					start_flg[0] = 0;
					return_value = 0;
				}
				else return_value = 2;
				break;
		case 5: P1 = 0x50;
				XBYTE[0xC400] = 0x01;
				XBYTE[0xC400] = 0x00;
				P1 = 0;
				init_7820();
				Encrypt_reg = 0xAA;
				Intmask_reg = 0xFF;
				S_reg = 0xC1;  //set 7820 free run
				//init 7860
				P1 = 0x30;
				XBYTE[0xC400] = 0x01;
				XBYTE[0xC400] = 0x00;
				P1 = 0;
				init_7860();
				Reg_protect			= 0xAA;
				Dxc_cntr			= 0xA0;
				return_value = 0;
				break;
		default:return_value = 2;
				break;
	}
	if (!GetResRdyTbl(1))
		SetResRdyTbl(1);                    //置响应事件列表相应位为1
	return (return_value);                       		//返回函数执行结果
}


unsigned char check_initializers(void){
//C80MCP查询MCU上电初始化状态
	commandid = 0x00433830;
	if (!GetResRdyTbl(1))
		SetResRdyTbl(1);                    //置响应事件列表相应位为1
	return (0);                       		//返回函数执行结果
}

void initializers_board(void){
//C81初始化某一单盘函数
unsigned char xdata btemp;
unsigned char xdata temp;
unsigned char xdata temp1;

		P1 = 0x20;
		btemp = XBYTE[0xA400];
		P1 = 0xFF;
		if ((btemp != 0x51) & (board_type[1][1] == 2)){	//2M盘1不在则置位该盘初始化标志位为1
			start_flg[1] = 1;
			if (board_flg[1] == 0){				//2M盘1丢失
				for (temp = 0; temp <= 20; temp++){	
					lparray2m[0][temp] = 0;			//将2M盘的环回状态复原为无环回
					EB_2M[0][temp] = 0;				//将2M盘的性能值清0
					REI_2M[0][temp] = 0;
					REI_2M_15min[0][temp] = 0;
					PJC_2M[0][temp] = 0;
					PJC_2M_15min[0][temp] = 0;
					NJC_2M[0][temp] = 0;
					NJC_2M_15min[0][temp] = 0;
					timeslot_2M[0][temp] = 0;
				}
				hold_board[1] = 0;
				board_flg[1] = 1;
				if (!GetResRdyTbl(6))
					SetResRdyTbl(6);           //置响应事件列表相应位为1
			}
		}
		else if((btemp != 0x57) & (board_type[1][1] == 3)){
			start_flg_EOS[1] = 1;
			if (board_flg[1] == 0){				//EOS盘1丢失
				lparray_EOS[0] = 0;
				hold_board[1] = 0;
				board_flg[1] = 1;
				if (!GetResRdyTbl(6))
					SetResRdyTbl(6);           //置响应事件列表相应位为1
			}
		}
		if (btemp == 0x51 & start_flg[1]){
			if (hold_board[1] != 0){				//一秒以后盘标志位表示该盘还在原位置
				if (hold_board[1] == 1){			//该盘还未初始化,则进行初始化
					init_se0111(1);
					board_type[1][1] = 2;
					hold_board[1] = 2;				//表示该盘已经初始化完毕
					start_flg[1] = 0;					//
					board_flg[1] = 0;
					if (!GetResRdyTbl(2))
						SetResRdyTbl(2); 	          //置响应事件列表相应位为1
				 }
				 else hold_board[1] = 2;
			}
			else hold_board[1] = 1;
		}
		if (btemp == 0x57 & start_flg_EOS[1]){
			if (hold_board[1] != 0){				//一秒以后盘标志位表示该盘还在原位置
				if (hold_board[1] == 1){			//该盘还未初始化,则进行初始化
					init_se0121(1);
					board_type[1][1] = 3;
					hold_board[1] = 2;				//表示该盘已经初始化完毕
					start_flg_EOS[1] = 0;
					board_flg[1] = 0;
					if (!GetResRdyTbl(2))
						SetResRdyTbl(2); 	          //置响应事件列表相应位为1
				 }
				 else hold_board[1] = 2;
			}
			else hold_board[1] = 1;
		}

		P1 = 0x60;
		btemp = XBYTE[0xA400];
		P1 = 0xFF;
		if ((btemp != 0x51) & (board_type[2][1] == 2)){						//2M盘2不在则置位该盘初始化标志位为1
			start_flg[2] = 1;
			if (board_flg[2] == 0){
				for (temp = 0; temp <= 20; temp++){	
					lparray2m[1][temp] = 0;			//将2M盘的环回状态复原为无环回
					EB_2M[1][temp] = 0;				//将2M盘的性能值清0
					REI_2M[1][temp] = 0;
					REI_2M_15min[1][temp] = 0;
					PJC_2M[1][temp] = 0;
					PJC_2M_15min[1][temp] = 0;
					NJC_2M[1][temp] = 0;
					NJC_2M_15min[1][temp] = 0;
					timeslot_2M[1][temp] = 0;
				}
				hold_board[2] = 0;
				board_flg[2] = 1;
				if (!GetResRdyTbl(7))
					SetResRdyTbl(7);           //置响应事件列表相应位为1
			}
		}
		else if((btemp != 0x57) & (board_type[2][1] == 3)){
			start_flg_EOS[2] = 1;
			if (board_flg[2] == 0){				//EOS盘1丢失
				lparray_EOS[1] = 0;
				hold_board[2] = 0;
				board_flg[2] = 1;
				if (!GetResRdyTbl(7))
					SetResRdyTbl(7);           //置响应事件列表相应位为1
			}
		}
		if (btemp == 0x51 & start_flg[2]){
			if (hold_board[2] != 0){				//一秒以后盘标志位表示该盘还在原位置

⌨️ 快捷键说明

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