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

📄 minsys.c

📁 用S52和1602液晶做的可进行设置的多级菜单
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<at89x52.h>
#include<absacc.h>
#include<memory.h>
#include<lcm.h>

#define Retry 0x80

unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'};

unsigned char code DataSeclete[]={			//在发送数据前先发此,用来选择模式的代号
									0x81,   //0 停止用的包头代号 
									0x82,	//1 查询用的包头代号
									0x83	//2 设置用的包头代号
};

unsigned char DataBase[]={         			//向下设置的数值
								   	0xff,   //0 地址(密码)
									0xff,   //1 总开关(0x00为关,0xff为开)
									0x00,   //2 分钟
									0x0a,   //3 小时(最大99)
									0x1d,   //4 时间修正值(修正值是计数器溢出次数24-33,默认值是29,分10个档,设置时对应为0~9,设置值+24=修正值)
									0xB2,   //5 温度上限,默认是50度(最高位为正负号,1为正,0为负,后面7位为温度值,范围为-9~+99)
									0x80,   //6 温度下限,默认是0度(最高位为正负号,1为正,0为负,后面7位为温度值,范围为-9~+99)
									0x03,   //7 震动灵敏度(灵敏度是25毫秒内震动的次数2-20,设置时对应为0~9,设置值*2+2=灵敏度)
};


unsigned char DataReceive[]={      			//向上读取的数值,把地址改为是否已经报警
									0x00,   //0 是否已经报警(1不报警,0报警)
									0x00,   //1 工作状态0x00为不工作,0xff为工作
									0x00,   //2 分钟
									0x00,   //3 小时(最大99)
};

sbit KeyA=P1^0;
sbit KeyB=P1^1;
sbit KeyC=P1^2;
sbit KeyD=P1^3;
sbit HzOut=P3^3;

unsigned char KEYA = 1,//按键A被按下为0,未按为零,,下同
			  KEYB = 1,
			  KEYC = 1,
			  KEYD = 1;

unsigned char LiuCheng1 = 1,  //停止流程,1未开始,0开始,下同
						      LiuCheng1_1 = 1,//工作子流程-设置对应的地址 DispSetAddress(unsigned char HH,HL,sign)//输入被控板的地址,输入数值,位置
												LiuCheng1_password[8], //流程1的地址暂存数组
												LiuCheng1_1_Sign = 8,  //焦点位置
												//LiuCheng1_password[0]地址8位
												//LiuCheng1_password[1]地址7位
												//LiuCheng1_password[2]地址6位
												//LiuCheng1_password[3]地址5位
												//LiuCheng1_password[4]地址4位
												//LiuCheng1_password[5]地址3位
												//LiuCheng1_password[6]地址2位
												//LiuCheng1_password[7]地址1位
			  LiuCheng2 = 1,  //查询流程
			  LiuCheng3 = 1,  //工作流程
							  LiuCheng3_1 = 1,//工作子流程-设时间
												LiuCheng3_1_HH,		   //小时十位
												LiuCheng3_1_HL,		   //小时个位
												LiuCheng3_1_LH,		   //小时十位
												LiuCheng3_1_LL,		   //小时个位
												LiuCheng3_1_Sign = 4,  //焦点位置
				
							  LiuCheng3_2 = 1,//工作子流程-时间修正值
							  					LiuCheng3_2_Num,   //修正值
				
							  LiuCheng3_3 = 1,//工作子流程-温度上限
												LiuCheng3_3_HH,		   //温度十位
												LiuCheng3_3_HL,		   //温度个位
												LiuCheng3_3_Sign,	   //温度正负号
												LiuCheng3_3_WeiZhi = 3,//焦点位置
							  LiuCheng3_4 = 1,//工作子流程-温度下限
												LiuCheng3_4_HH,		   //温度十位
												LiuCheng3_4_HL,		   //温度个位
												LiuCheng3_4_Sign,	   //温度正负号
												LiuCheng3_4_WeiZhi = 3,//焦点位置
				
				   			  LiuCheng3_5 = 1,//工作子流程-震动灵敏度
							  					LiuCheng3_5_Num = 0,   //灵敏度
						      LiuCheng3_6 = 1,//工作子流程-设置对应的地址 DispSetAddress(unsigned char HH,HL,sign)//输入被控板的地址,输入数值,位置
												LiuCheng3_password[8],//流程3的地址暂存数组
												//LiuCheng3_password[0]地址8位
												//LiuCheng3_password[1]地址7位
												//LiuCheng3_password[2]地址6位
												//LiuCheng3_password[3]地址5位
												//LiuCheng3_password[4]地址4位
												//LiuCheng3_password[5]地址3位
												//LiuCheng3_password[6]地址2位
												//LiuCheng3_password[7]地址1位
												LiuCheng3_6_Sign = 8;  //焦点位置

unsigned char LiuCheng1Enable = 1,//停止流程使能
			  LiuCheng2Enable = 1,//查询流程使能
			  LiuCheng3Enable = 1;//工作流程使能

////////////////////////////////////////////////////////////////////////////////////////////////////////////菜单显示函数
void DispPasswordError(void)
{
   /****************
    Password Wrong.
	Please Retry!  
	****************/
	printx(0,0,"Password Wrong. ");
	printx(0,1,"Please Retry!   ");

}
void DispSetTime(unsigned char HH,HL,LH,LL,weizhi)//设置时间,输入小时十位,小时个位,分钟十位,分钟个位,焦点相对位置
{
   /****************
	(hour:min) 00:00
	set time:      ^
	****************/  
	printx(0,0,"(hour:min)   :  ");
	DispOneChar(11,0,table[HH]);
	DispOneChar(12,0,table[HL]);
	DispOneChar(14,0,table[LH]);
	DispOneChar(15,0,table[LL]);
	if(weizhi == 1)
	{
		printx(0,1,"set time:  ^    ");
	}
	if(weizhi == 2)
	{
		printx(0,1,"set time:   ^   ");
	}
	if(weizhi == 3)
	{
		printx(0,1,"set time:     ^ ");
	}
	if(weizhi == 4)
	{
		printx(0,1,"set time:      ^");
	}

}

void DispSetRevise(unsigned char num)//设置时间修正值,输入数值
{
   /****************
	( 0 - 9 )     0
    Xiu Zheng :   ^
	****************/
	printx(0,0,"( 0 - 9 )       ");
	printx(0,1,"Xiu Zheng :   ^ ");
	DispOneChar(14,0,table[num]);

}

void DispTemUp(unsigned char HH,HL,sign,weizhi)//设置温度上限十位,上限个位,输入符号(0为负,1为正),数值,位置
{
   /****************
	(-9 - +99)  x00
	Tem up :      ^  
	****************/
	printx(0,0,"(-9 - +99)      ");
  	if(sign == 0)
	{
		DispOneChar(12,0,'-');	
	}
	else
	{
		DispOneChar(12,0,'+');	
	}
	DispOneChar(13,0,table[HH]);
	DispOneChar(14,0,table[HL]);
	if(weizhi == 1)
	{
		printx(0,1,"Tem up :    ^   ");
	}
	if(weizhi == 2)
	{
		printx(0,1,"Tem up :     ^  ");
	}
	if(weizhi == 3)
	{
		printx(0,1,"Tem up :      ^ ");
	}

}

void DispTemDown(unsigned char HH,HL,sign,weizhi)//设置温度下限十位,上限个位,输入符号(0为负,1为正),数值,位置
{
   /****************
	(-9 - +99)  x00
	Tem down:     ^   
	****************/
	printx(0,0,"(-9 - +99)      ");
  	if(sign == 0)
	{
		DispOneChar(12,0,'-');	
	}
	else
	{
		DispOneChar(12,0,'+');	
	}
	DispOneChar(13,0,table[HH]);
	DispOneChar(14,0,table[HL]);
	if(weizhi == 1)
	{
		printx(0,1,"Tem down:   ^   ");
	}
	if(weizhi == 2)
	{
		printx(0,1,"Tem down:    ^  ");
	}
	if(weizhi == 3)
	{
		printx(0,1,"Tem down:     ^ ");
	}
}

void DispShake(unsigned char num)//震动灵敏度,输入数值0 ~ 9
{
   /****************
	( 0 - 9 )    0
	Shake:       ^ 
	****************/
	printx(0,0,"( 0 - 9 )       ");
	printx(0,1,"Shake:       ^  ");
	DispOneChar(13,0,table[num]);
}

void DispConnect(void)//正在传输中
{
   /****************
    Now Connecting..
	Please Wait.....
	****************/
	printx(0,0,"Now Connecting..");
	printx(0,1,"Please Wait.....");

}

void DispOver(void)//传输完毕
{
   /****************
    Deliver is over.
	Please Wait.....
	****************/
	printx(0,0,"Deliver is over.");
	printx(0,1,"Please Wait.....");
}

void DispStoping(void)//停止中
{
   /****************
    Now Stoping.....
	Please Wait.....
	****************/
	printx(0,0,"Now Stoping.....");
	printx(0,1,"Please Wait.....");
}

void DispSearch(void)//查看功能板的状态
{
   /****************
    Now Searching...
	Please Wait.....
	****************/
	printx(0,0,"Now Searching...");
	printx(0,1,"Please Wait.....");
}

void DispFindNow(unsigned char HH,HL,LH,LL,num,sign)//功能板的状态显示,输入小时十位,小时个位,分钟十位,分钟个位,报警状态,工作状态(1工作,0不工作)
{
   /****************
    ALARM time:00:00
	working?  YES/NO
	****************/
	printx(0,0,"      time:  :  ");

	DispOneChar(11,0,table[HH]);
	DispOneChar(12,0,table[HL]);
	DispOneChar(14,0,table[LH]);
	DispOneChar(15,0,table[LL]);

	if(num == 0)//1不报警,0报警
	{
		DispOneChar(0,0,'A');
		DispOneChar(1,0,'L');
		DispOneChar(2,0,'A');
		DispOneChar(3,0,'R');
		DispOneChar(4,0,'M');
	}
	else
	{
		DispOneChar(0,0,'S');
		DispOneChar(1,0,'A');
		DispOneChar(2,0,'F');
		DispOneChar(3,0,'T');
		DispOneChar(4,0,'Y');
	}

	if(sign == 0xff)
	{
		printx(0,1,"working? YES    ");
	}
	else
	{
		printx(0,1,"working?  NO    ");
	}
}

void DispWelcome(void)//显示开机画面
{
   /****************
	System Work Now!
    Designed By LYQ!
	****************/
	printx(0,0,"System Work Now!");
	printx(0,1,"Designed By LYQ!");
}

void DispSetAddress(unsigned char *arrays,unsigned char sign)//输入被控板的地址,输入位置
{
   /****************
	Pass   00000000 
	word:         ^ 
	****************/
	printx(0,0,"Pass            ");

	DispOneChar(8,0,table[arrays[0]]);
	DispOneChar(9,0,table[arrays[1]]);
	DispOneChar(10,0,table[arrays[2]]);
	DispOneChar(11,0,table[arrays[3]]);
	DispOneChar(12,0,table[arrays[4]]);
	DispOneChar(13,0,table[arrays[5]]);
	DispOneChar(14,0,table[arrays[6]]);
	DispOneChar(15,0,table[arrays[7]]);

	switch(sign)
	{
		case 1: 
				printx(0,1,"word:   ^       ");
				break;
		case 2: 
				printx(0,1,"word:    ^      ");
				break;
		case 3: 
				printx(0,1,"word:     ^     ");
				break;
		case 4: 
				printx(0,1,"word:      ^    ");
				break;
		case 5: 
				printx(0,1,"word:       ^   ");
				break;
		case 6: 
				printx(0,1,"word:        ^  ");
				break;
		case 7: 
				printx(0,1,"word:         ^ ");
				break;
		case 8: 
				printx(0,1,"word:          ^");
				break;
		default:
				break;
	}
}

unsigned char GetBaiwei(unsigned char temp)//从整数中取百位数
{
	temp = temp/100;
	return temp;
}

unsigned char GetShiwei(unsigned char temp)//从整数中取十位数
{
	if(temp > 99)
	{
		temp = temp - GetBaiwei(temp)*100;
	}
	temp = temp/10;
	return temp;
}

unsigned char GetGewei(unsigned char temp)//从整数中取个位数
{
	temp = temp%10;
	return temp;
}

void DispPassWord(unsigned char x1,x2,x3,y,num)//输入显示的x1,x2,x3,y,数值(5.6.7.1.DataBase[0])
{
	DispOneChar(x1,y,table[GetBaiwei(num)]);
	DispOneChar(x2,y,table[GetShiwei(num)]);
	DispOneChar(x3,y,table[GetGewei(num)]);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////其他功能函数

void putchar(unsigned char a)//从串口发送一个字节
{
	TI=0;
	SBUF=a;
	while(!TI);
	TI=0;
}

unsigned char getchar(void)//从串口接收一个字节
{
	unsigned char a;
	RI = 0;
	while(RI == 0);
	a = SBUF;
	RI = 0;
	return a;
}

void PutAll(unsigned char * arrays)//从串口发送一个8数据数组
{
	unsigned char i;
	for(i=0;i<8;i++)//发8数据数组
	{
		putchar(arrays[i]);
	}
}

void GetAll(unsigned char * arrays)//从串口接收一个4数据数组,参数是待接收的数组名,DataReceive[]或DataSbuffer[]
{
	unsigned char i;
	for(i=0;i<4;i++)//收4数据数组
	{
		arrays[i] = getchar();
	}
}

void CalculatePassword(unsigned char * arrays,unsigned char ADDR)//把数组计算成设置
{
	unsigned char temp,i;
	temp = ADDR;
	for(i=0;i<8;i++)
	{
		temp = ADDR<<i;
		arrays[i] = temp>>7;
	}
}

void ReCalculatePassword(unsigned char * arrays)//把设置还原成数组
{
	DataBase[0] = arrays[0]*128+arrays[1]*64+arrays[2]*32+arrays[3]*16+arrays[4]*8+arrays[5]*4+arrays[6]*2+arrays[7];
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////中断函数
void Key(void) interrupt 0
{
	unsigned char temp;
	EA = 0;
	Delay5Ms();
	Delay5Ms();

/*读取按键*/
	if(KeyA == 0)
	{
		KEYA = 0;
	}
	if(KeyB == 0)
	{
		KEYB = 0;
	}
	if(KeyC == 0)
	{
		KEYC = 0;
	}
	if(KeyD == 0)
	{
		KEYD = 0;
	}


/*菜单判断*/
//停止流程
    if((LiuCheng1 == 1)&&(LiuCheng1Enable == 1))
	{
		if(KEYA == 0)//按了“停止/返回”键
		{
			LiuCheng1 = 0;
			LiuCheng1_1 = 0;
			LiuCheng2Enable = 0;
			LiuCheng3Enable	= 0;
			//读取下一个
			CalculatePassword(LiuCheng1_password,DataBase[0]);
			//显示
			DispSetAddress(LiuCheng1_password,LiuCheng1_1_Sign);
			DispPassWord(5,6,7,1,DataBase[0]);//输入显示的x1,x2,x3,y,数值(5.6.7.1.DataBase[0])
			Delay400Ms();Delay400Ms();
		}
	}
	else
	{
		if(LiuCheng1_1 == 0)
		{
			LiuCheng2Enable	= 0;
			LiuCheng3Enable = 0;

			if(KEYC == 0)//按了“上翻/查询”键
			{
				//上翻
				LiuCheng1_password[LiuCheng1_1_Sign -1] ++;
				if(LiuCheng1_password[LiuCheng1_1_Sign-1] > 1)
				{
					LiuCheng1_password[LiuCheng1_1_Sign-1] -= 2;
				}	
				//保存
				ReCalculatePassword(LiuCheng1_password);//把结果统计进数组
				DispSetAddress(LiuCheng1_password,LiuCheng1_1_Sign);
				DispPassWord(5,6,7,1,DataBase[0]);//输入显示的x1,x2,x3,y,数值(5.6.7.1.DataBase[0])
				Delay400Ms();
			}
	
			if(KEYB == 0)//按了“左翻”键
			{
				//左翻
				LiuCheng1_1_Sign --;
				if(LiuCheng1_1_Sign == 0)
				{
					LiuCheng1_1_Sign = 8;
				}
				//保存
				ReCalculatePassword(LiuCheng1_password);//把结果统计进数组
				DispSetAddress(LiuCheng1_password,LiuCheng1_1_Sign);
				DispPassWord(5,6,7,1,DataBase[0]);//输入显示的x1,x2,x3,y,数值(5.6.7.1.DataBase[0])
				Delay400Ms();
			}
	
			if(KEYA == 0)//按了“停止/返回”键
			{
				DispStoping(); //做下一个的显示

				putchar(0xaa);//发开始码

				putchar(DataSeclete[0]);//发功能号
	
				putchar(DataBase[0]);//发密码
				temp = getchar();//接收密码回馈
				if(temp == Retry)//判断密码
				{
					DispPasswordError();
					Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();
					Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();
					Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();

⌨️ 快捷键说明

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