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

📄 host.c

📁 智能数字电流表。双CPU工作
💻 C
📖 第 1 页 / 共 3 页
字号:
			break;
		default:
		    //KeyFuncIndex = 30;//默认显示电流
		    //DisplayCurrent();
			return;
		}
		rst_wdog();
		KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
		(*KeyFuncPtr)();  //执行
	}	
	return;
}

void GetParamsCode(uchar *pChar, uchar begin, word wData) reentrant    //段码、显示片选起点、参数
{
	uchar i;
	if (wData > 0)
	{ 	
		for (i=4; i>=begin; i--)
		{
			pChar[i] = uLEDChar[wData % 10];
			wData = wData / 10;
			rst_wdog();
		}
		if (Param.PointPos < 5)
		    pChar[Param.PointPos] |= 0x40; 
    }
}

void Hints(uchar *pChar) reentrant
{
	byte i;
    TRG = 1;
	TRG = 0;
	I_Send('T');
	Delay(1, 5);
	for (i=0; i<5; i++)
	{
		I_Send(pChar[4-i]);
		rst_wdog();
	}
	return;
}

//显示测量数据
void DisplayCurrent()
{
	uchar i;
    dword dwCurrent; 
	dword Count;
	word wOutput, wALR_L, wALR_H;
	Count = GetCount();

	//计算
	wOutput = Param.wOutput.w;
	wALR_L = Param.wALR_L.w;
	wALR_H = Param.wALR_H.w;
	for (i=0; i<4-Param.PointPos; i++)
	{
		wOutput /= 10;
		wALR_L /= 10;
		wALR_H /= 10;
		rst_wdog();
	}
	//计算转换量
	if (Count >= Param.wZero.dw)
	    dwCurrent = (Count - Param.wZero.dw) * wOutput * 100 / (Param.wInCount.dw - Param.wZero.dw);
	Param.Current.w = dwCurrent / 10;
	if ((dwCurrent % 10) > 4)  //四舍五入
	    Param.Current.w ++ ;
	rst_wdog();
	//报警
	if (Param.bAlert)
	{
		if (Param.Current.w < wALR_L * 10)   //低报警
			JDQL = 0;	
	    if (Param.Current.w > wALR_L * 12)      //低报警回滞
	        JDQL = 1;
		if (Param.Current.w > wALR_H * 10)   //高报警
			JDQH = 0;	 	
		if (Param.Current.w < wALR_H * 8)    //高报警回滞
			JDQH = 1;
		rst_wdog();
	}
	//显示
	Display(Param.Current.w, 3);
	//Display(Count, 5);
	return;
}

uchar GetKeyValue(word *pValue, word Data, uchar uNum) reentrant
{
	uchar KeyValue, i;
	uchar CodeIndex[4] = {0, 0, 0 ,0};  //段码下标,依次对应片1, 2, 3, 4
	uchar uSelIndex = 4;     //片选下标
	word  Value = 0;
	
	//换算得到当前值的下标
	for (i=0; i<uNum; i++)
	{
		CodeIndex[3-i] = Data % 10 + 1;
		Data = Data / 10;
		rst_wdog();
	}
    
	while (1)
	{
		KeyValue = P2 & 0xF0;   //去掉低4位
		if (KeyValue != 0xF0)
		{
			Delay(10, 500);
			KeyValue = P2 & 0xF0;
			switch (KeyValue)
			{
			case 0xE0:  //左键, 翻数字
			    TRG = 1;
				TRG = 0;
				I_Send('S');
				Delay(1, 5);
				I_Send(uSelIndex);
				I_Send(uLEDChar[CodeIndex[uSelIndex - 1]++]);
				CodeIndex[uSelIndex - 1] = CodeIndex[uSelIndex - 1] % 10;
				break;
			case 0xD0:  //右键, 翻片子
				uSelIndex ++;
			    if (uSelIndex > 4) 
			        uSelIndex = 5 - uNum;
				TRG = 1;
				TRG = 0;
				I_Send('S');
				Delay(1, 5);
				I_Send(uSelIndex + 4);
				break;
			case 0xB0:  //MENU,取消操作
				TRG = 1;   //停止闪烁
				TRG = 0;   
				I_Send('N');   
				return 0xB0;
			case 0x70:  //回车,确认操作
				TRG = 1;  //静止显示
				TRG = 0;
				I_Send('A');
				//计算数据
				for (i=4-uNum; i<4; i++)
				     Value = Value * 10 + CodeIndex[i] - 1;
				*pValue = Value;
				changed = 1;
				Delay(50, 1000);
				TRG = 1;   //停止闪烁
				TRG = 0;   
				I_Send('N');  
				return 0x70;
			default:
				break;
			}
		}
		rst_wdog();
	}
	return 0x70;	
}

void KeyResult(uchar uKey, uchar uMenu, uchar uEnter, word Value) reentrant
{
	dword wInCount;
	uchar uKeyValue;
    if (uKey == 0xB0)   //MENU,取消操作
    {
		 rst_wdog();
    	 KeyFuncIndex = uMenu;    //跳到上一层
         KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
         (*KeyFuncPtr)();  //执行
	}
	
	if (uKey == 0x70)   //回车,确认操作
	{
		if (uEnter == 7)
		{
			//计算输入值并保存
			Param.wInput.w = Value;
			wInCount = GetCount();
			
			if (wInCount < 14158)  //小于标称值20%
			{	
				Hints(In_LHint);
				return;
			}
			if (wInCount > 21236)  //大于标称值20%
			{
				Hints(In_HHint);
				return;
			}
			
			Param.wInCount.dw = wInCount;
			Param.bAlert = 0;   //关闭报警
			JDQL = 1;
			JDQH = 1;
			rst_wdog();
		}
		if (uEnter == 26)
		{
		    Param.wOutput.w = Value;
		    Param.bAlert = 0;   //关闭报警
		    JDQL = 1;
			JDQH = 1;
			rst_wdog();
	    }
		if (uEnter == 23)
		{
		    Param.wALR_L.w = Value;
			rst_wdog();
		}
		if (uEnter == 22)
		{
			if (Value <= Param.wOutput.w)
		        Param.wALR_H.w = Value;
		    else
		        Param.wALR_H.w = Param.wOutput.w;
			rst_wdog();
	    }
		if (uEnter == 19)
		{
		    if (Value <256)
		        Param.bAddress = Value;
			rst_wdog();
		}
		if (uEnter == 4)
		{
			if ((Param.Password.w == Value) || (Value == 0))      //密码核对
	    	{
		    	uKeyValue = GetKeyValue(&Value, Value, 4);
		    	if (uKeyValue == 0x70)
		    	{
		        	if (Value != 0)
		        	{
		            	Param.Password.w = Value;      //设置密码
		    	        rst_wdog();
    	            } 
	            }
            }
	    	else 
	    	{
		        Hints(ErrorHint);
		    	Delay(30, 1000);
	        }
		}

		changed = 1;
		KeyFuncIndex = uEnter;    //跳到...
        KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
        (*KeyFuncPtr)();  //执行
	}
	return;
}

//测量BUSY的量(查询方式)
dword GetCount ()
{
	uchar i = 5;
	dword Counts[5], AddCount = 0;
	WordType Count;   //记数值
	TMOD = 0x01;   //定时器
	while (i--)
	{
	   TL0 = 0;
	   TH0 = 0;       //初始化 
	   while (!BUSY);
	   //开计数器 
	   TR0 = 1;
	   while (BUSY);
	   TR0 = 0;  //关闭计数器
	   Count.b[1] = TL0;
	   Count.b[0] = TH0;
	   if (Count.w >= 24651)
	       Counts[i] = Count.w - 24651;
	   else
	       i++;		
	   rst_wdog();
	}	
	
	for(i=0; i<5; i++)
	{
		AddCount += Counts[i];
		rst_wdog();
	}
	AddCount = AddCount / 10;
	return AddCount;
}

void OptionProg() reentrant
{
	if (changed && !flag)
	{
		//提示保存
		Hints(SaveHint);
		while (1)
		{
			uchar KeyValue;
			KeyValue = P2 & 0xF0;   //去掉低4位
			if (KeyValue != 0xF0)
			{
				Delay(10, 500);
				KeyValue = P2 & 0xF0;
				while ((P2 & 0xF0) != 0xF0)
		             rst_wdog();
				if (KeyValue == 0xB0)       //MENU
				{
					//恢复参数,读芯片
					ReadParams();     //读参数
					SetTimer(Param.BaudIndex);
					break;
				}

				if (KeyValue == 0x70)       //回车
				{
					uchar uKey, i; 
					word  Value;
					word  Passward = 0;
					for (i=0; i<3; i++)
					{
						//要求输入密码
						Hints(PwdHint);	
						uKey = GetKeyValue(&Value, Passward, 4); 
						if (uKey == 0x70)
						{    		
							if ((Value == Param.Password.w) || (Value == 0))    //比较密码
							{
								WriteParams(); //保存参数,写芯片
								i = 3;
							}
						}
						else break;
						rst_wdog();
					}
					break;					
				}
			}
			rst_wdog();
		}
	changed = 0;
	}
	Hints(ProgHint); //显示提示
	return;
}

void OptionAYS() reentrant
{
	Hints(A_YSHint); //显示提示
	return;
}

void OptionIn_Out() reentrant
{
	Hints(In_OuHint); //显示提示
	return;
}

void OptionALR() reentrant
{
	Hints(ALRHint); //显示提示
	return;
}

void OptionSecr() reentrant
{
	Hints(SecrHint); //显示提示
	return;
}

void OptionAdBd() reentrant
{
	Hints(Ad_BdHint); //显示提示
	return;
}

//显示零点
void AutoZero() reentrant
{
	Param.wZero.dw = GetCount();   //得到零
	Display(Param.wZero.w[1], 5);
	changed = 1;
	/*
	Delay(25, 1000);
	TRG = 1;  //闪烁显示
	TRG = 0;
	I_Send('A');
	Delay(25, 1000);
	TRG = 1;  //静止显示
	TRG = 0;
	I_Send('N');
	*/
	return; 	
}

void InputX() reentrant  //显示输入值
{
	byte Input[] = {0x06, 0x00, 0x00, 0xB6, 0xB6};
    GetParamsCode(Input, 3, Param.wInput.w); 
    Input[Param.PointPos] &= 0xBF;
	Hints(Input);       //显示提示
	return;	
}

void OutputX() reentrant //显示输出值
{
	byte Output[] = {0x9B, 0xB6, 0xB6, 0xB6, 0xB6};
	GetParamsCode(Output, 1, Param.wOutput.w); 
	Hints(Output);   //显示提示
	return;	
}

void ALROFF() reentrant      //关闭报警
{
	Hints(OFFHint);   //显示OFF
	Param.bAlert = 0;
	changed = 1;
	return;
}

void ALRON() reentrant      //启动报警
{
	Hints(ONHint);   //显示ON
	Param.bAlert = 1;
	return;
}

void Passward() reentrant  //显示密码输入界面 
{
	uchar uKeyValue; 
	word  Value;
    word  Passward = 0;
	Hints(PwdHint);	
	uKeyValue = GetKeyValue(&Value, Passward, 4); 
	KeyResult(uKeyValue, 4, 4, Value); 
	return;
}

void AddrX() reentrant   //显示当前地址
{
	byte AddrFace[] = {0xB7, 0x9E, 0xB6, 0xB6, 0xB6};
	GetParamsCode(AddrFace, 2, Param.bAddress);
	AddrFace[Param.PointPos] &= 0xBF;
	Hints(AddrFace);   //显示当前地址   
	return;
}
void BaudX() reentrant   //显示当前波特率
{
	Hints(Bauds[Param.BaudIndex]);   //显示当前波特率	
	return;
}

void Inp() reentrant     //显示INP
{
	Hints(INPHint);   //显示INP
	return;
}

void Oup() reentrant     //显示OUP
{
	Hints(OUPHint);   //显示OUP
	return;
}

void Point() reentrant      //提示小数点输入
{
	Hints(PoInHint);
	return;
}
void SetInput() reentrant   //设置输入值
{
	uchar uKey;
	word Value;
	word wInput = Param.wInput.w;
	InputX();      //显示当前值
	uKey = GetKeyValue(&Value, wInput, 2);
	KeyResult(uKey, 14, 7, Value);
	return;
}

void SetOutput() reentrant
{
	word Value;
	uchar uKey;
	word wOutput = Param.wOutput.w; 
	OutputX();      //显示当前值
	uKey = GetKeyValue(&Value, wOutput, 4);
	KeyResult(uKey, 15, 26, Value);
    return;
}

void SetPoint() reentrant    //设置小数点
{
	uchar KeyValue;
	uint  Div = 1;
	uchar uSelIndex = Param.PointPos;     //片选下标
	OutputX();      //显示当前值
	
	while (1)
	{
		KeyValue = P2 & 0xF0;   //去掉低4位
		if (KeyValue != 0xF0)
		{
			Delay(15, 500);
			KeyValue = P2 & 0xF0;
			switch (KeyValue)
			{
			case 0xE0:  //左键, 左翻片子
				uSelIndex --;
			    if (uSelIndex < 1) 
			        uSelIndex = 4;
			    TRG = 1;
				TRG = 0;
				I_Send('P');
				Delay(1, 5);

⌨️ 快捷键说明

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