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

📄 mypro.c

📁 这是运用c51单片机测试电压电流的完整工程项目文件
💻 C
📖 第 1 页 / 共 4 页
字号:
		keytmp = namekey();     //读键值
		switch ( keytmp)
		{
			case 1 :     //上键,减少数字
						switch ( KeyPosition )//光标起始位置
						{
							case 0:   //光标在年的十位
									if ( year10 >= 9 )       //9+1=0
										year10 = 0;
									else
										year10++;
									df(4,Yp[0],year10,1);
									utime[0] = year10;
									break;
							case 1:   //光标在年的个位
									if ( year1 >= 9 )
										year1 = 0;
									else
										year1++;

									df(4,Yp[1],year1,1);
									utime[1] = year1;
									break;
							case 2:  //光标在月的十位
									if ( month10 >= 1 )   //月_十位=0,1
										month10 = 0;
									else
										month10++;

									df(4,Yp[2],month10,1);
									utime[2] = month10;
									break;
							case 3:   //光标在月的个位
									if ( month1 >= 9 )
										month1 = 0;
									else
										month1++;
									df(4,Yp[3],month1,1);
									utime[3] = month1;
									break;
							case 4:    //光标在日的十位
									if ( day10 >= 3 )  //日_十位=0,1,2,3
										day10 = 0;
									else
										day10++;

									df(4,Yp[4],day10,1);
									utime[4] = day10;
									break;
							case 5:    //光标在日的个位
									if ( day1 >= 9 )
										day1 = 0;
									else
										day1++;
									df(4,Yp[5],day1,1);
									utime[5] = day1;
									break;
							case 6:    //光标在时的十位
									if ( hour10 >= 2 )    //时_十位=0,1,2
										hour10 = 0;
									else
										hour10++;

									df(4,Yp[6],hour10,1);
									utime[6] = hour10;
									break;
							case 7:       //光标在时的个位
									if ( hour1 >= 9 )
										hour1 = 0;
									else
										hour1++;

									df(4,Yp[7],hour1,1);
									utime[7] = hour1;
									break;
							case 8:     //光标在分的十位
									if ( minute10 >= 5 )   //分_十位=0,1,2,3,4,5
										minute10 = 0;
									else
										minute10++;

									df(4,Yp[8],minute10,1);
									utime[8] = minute10;
									break;
							case 9:     //光标在分的个位
									if ( minute1 >= 9 )
										minute1 = 0;
									else
										minute1++;

									df(4,Yp[9],minute1,1);
									utime[9] = minute1;
									break;
						}
						break;

			case 2 :    //下键,增加数字
						switch ( KeyPosition )
						{
							case 0:   //光标在年的十位
									if ( year10 == 0 )
										year10 = 9;
									else
										year10--;
									df(4,Yp[0],year10,1);
									utime[0] = year10;
									break;
							case 1:   //光标在年的个位
									if ( year1 == 0 )
										year1 = 9;
									else
										year1--;
                                    df(4,Yp[1],year1,1);
									utime[1] = year1;
									break;
							case 2:   //光标在月的十位
									if ( month10 == 0 )        //月_十位=0,1
										month10 = 1;
									else
										month10--;

									df(4,Yp[2],month10,1);
									utime[2] = month10;
									break;
							case 3:    //光标在月的个位
									if ( month1 == 0 )
										month1 = 9;
									else
										month1--;
									df(4,Yp[3],month1,1);
									utime[3] = month1;
									break;
							case 4:  //光标在日的十位
									if ( day10 == 0 )   //日_十位=0,1,2,3
										day10 = 3;
									else
										day10--;

									df(4,Yp[4],day10,1);
									utime[4] = day10;
									break;
							case 5:    //光标在日的个位
									if ( day1 == 0 )
										day1 = 9;
									else
										day1--;
									df(4,Yp[5],day1,1);
									utime[5] = day1;
									break;
							case 6:    //光标在时的十位
									if ( hour10 == 0 )    //时_十位=0,1,2
										hour10 = 2;
									else
										hour10--;

									df(4,Yp[6],hour10,1);
									utime[6] = hour10;
									break;
							case 7:    //光标在时的个位
									if ( hour1 == 0 )
										hour1 = 9;
									else
										hour1--;

									df(4,Yp[7],hour1,1);
									utime[7] = hour1;
									break;
							case 8:   //光标在分的十位
									if ( minute10 == 0 )   //分_十位=0,1,2,3,4,5
										minute10 = 5;
									else
										minute10--;

									df(4,Yp[8],minute10,1);
									utime[8] = minute10;
									break;
							case 9:    //光标在分的个位
									if ( minute1 == 0 )
										minute1 = 9;
									else
										minute1--;

									df(4,Yp[9],minute1,1);
									utime[9] = minute1;
									break;
						}
						break;

			case 3 :      //右移键
						if ( KeyPosition == 9)    //光标停留在分的个位
						{
							df(4,Yp[KeyPosition],utime[KeyPosition],0);  //将该位数字正显
							KeyPosition		=	0;   //该值复0,即将光标移到首位(年之十位)
							df(4,Yp[KeyPosition],utime[KeyPosition],1);//将首位数字反显
							break ;
						}
						else
							df(4,Yp[KeyPosition],utime[KeyPosition],0);  //将该位数字正显
						    KeyPosition++;
                            df(4,Yp[KeyPosition],utime[KeyPosition],1);  //将该位数字反显
                            break;
			case  4:	
			            Time_Dispose_Set();    //返回键,确认已设置的时间,并返回主菜单
				        lcd_init();
				        program_1();     //返回主菜单
			            return;
		}
	}
}

void	Time_Dispose_Set()    //将年、月、日、时、分各位数字显示缓存区的数合并,并保存
{
	P8563_Store[0]  =  minute10<<4 | minute1;   //分=十位分*16+个位分
	P8563_Store[1]  =  hour10<<4  | hour1;       //时=十位时*16+个位时
	P8563_Store[2]  =  day10<<4   | day1;         //日=十位日*16+个位日
	P8563_Store[3]  =  month10<<4  |month1;       //月=十位月*16+个位月
	P8563_Store[4]  =  year10<<4   | year1;        //年=十位年*16+个位年
	P8563_settime();                //数字送器件8563内部寄存器
}

//写时间修改值
void P8563_settime()
{
     ISendByte3(0xa2,0x00,0x00);
	 ISendByte3(0xa2,0x03,P8563_Store[0]);//分
	 ISendByte3(0xa2,0x04,P8563_Store[1]);//时
	 ISendByte3(0xa2,0x05,P8563_Store[2]);//日
	 ISendByte3(0xa2,0x07,P8563_Store[3]);//月
	 ISendByte3(0xa2,0x08,P8563_Store[4]);//年
}

//刷新时间
void time()
{
	  Time_Dispose_Read();                  //读PCF8563万年历时间
	  dxz(0,96,2,0);
	  dxz(0,102,0,0);
	  //dxz(0,100,10,0);
	  dxz(0,108,year10,0);         //显示年月日
		dxz(0,114,year1,0);
		dxz(0,120,10,0);
		dxz(0,126,month10,0);
		dxz(0,132,month1,0);
		dxz(0,138,10,0);
		dxz(0,144,day10,0);
		dxz(0,150,day1,0);

		dxz(0,162,hour10,0);          //显示时分
		dxz(0,168,hour1,0);
		dxz(0,174,11,0);
		dxz(0,180,minute10,0);
		dxz(0,186,minute1,0);
}

//读出的数据分离赋值给各显示缓冲区
void Time_Dispose_Read()
{
	P8563_gettime();
	minute1		=	P8563_Store[0]	& 0x0f;
	minute10	=	P8563_Store[0]>>4 & 0x07;
	hour1		  =	P8563_Store[1] & 0x0f;
	hour10		=	P8563_Store[1]>>4	 & 0x03;
	day1		  =	P8563_Store[2]	 & 0x0f;
	day10		  =	P8563_Store[2]>>4  & 0x03;
	month1		=	P8563_Store[3]  & 0x0f;
	month10		=	P8563_Store[3]>>4  & 0x01;
	year1		  =	P8563_Store[4]	 & 0x0f;
	year10	  = P8563_Store[4]>>4  & 0x0f;
}

//读入时间到内部缓冲区----外部调用
void P8563_gettime()
{
     P8563_Read();
     if(P8563_Store[0]==0)
        P8563_Read(); /*如果为分=0,为防止时间变化,再读一次*/
}

//内部函数,读入时间到内部缓冲区
void P8563_Read()
{   
   	 P8563_Store[0]=IRcvByte2(0xa2,0x03);/*分*/
	 P8563_Store[1]=IRcvByte2(0xa2,0x04);/*时*/
	 P8563_Store[2]=IRcvByte2(0xa2,0x05);/*日*/
	 P8563_Store[3]=IRcvByte2(0xa2,0x07);/*月*/
	 P8563_Store[4]=IRcvByte2(0xa2,0x08);/*年*/   
}

void test() //启动进入测试程序
{
	uchar key = 0;
	
	EX1=1;     //开外部中断,INT1---1mA到,INT0---故障报警
	EX0=1;
	disanping();   //测试中
	//升压
	if ( !daFlag )	 //1mA到,外部中断1响应中断,置flag为1
	{
		while(  daCount < 1024  )      //判断10位DAC寄存器内值是否达到最大值1024,即已到5V
		       {
					if ( read2543(1) < 2048 )    //升压速度以高压电流达到500μA为界限
					{
						daCount = daCount + 16;
						tlc5615(daCount);              //全速升压
						delay1ms(10);
						Shipin_UI_dispose(); //处理电流电压读数 显示
						disanping();
					}
					else
					{
						daCount = daCount + 8;
						tlc5615(daCount);               //半速升压
						delay1ms(10);
						Shipin_UI_dispose();
						disanping();
					}
			   }
		       if(daCount >= 1024)
			       shipin_error_dispose();          //电压到30KV 电流未达1mA 处理程序
}
	delay1ms(255);
 	delay1ms(255);
 	delay1ms(255);
 	delay1ms(255);
 	disiping();   //测试结果
 	do                              //等待返回键被按下
 	{key=namekey();}
 	while(key!=4);

 	program_1();
}

void disanping()                //测试界面
{

		  battery();          //显示电池电量
		  time();           //显示实时时间

		dh(0,0,33,0);               //正在测试中:
		dh(0,16,34,0);
		dh(0,32,10,0);
		dh(0,48,11,0);
		dh(0,64,35,0);
		df(0,80,24,0);
		
		df(3,58,25,0);              //U=XX.XKV
		df(3,70,26,0);              //=
		df(3,98,22,0);             //.
		df(3,118,27,0);             //K
		df(3,126,28,0);             //V

		df(6,58,29,0);              //I=XXXuA
		df(6,70,26,0);              //=
		df(6,118,30,0);             //u
		df(6,126,31,0);             //A
}

void xianshi()  //显示测试过程的电压电流
{
		df(3,82,TmpBuf[0],0);  //显示电压
		df(3,90,TmpBuf[1],0);
		df(3,106,TmpBuf[2],0);
		
		df(6,82,TmpBuf[3],0);  //显示电流
		df(6,90,TmpBuf[4],0);
		df(6,98,TmpBuf[5],0);
		df(6,106,TmpBuf[6],0);
}

void disiping()   //测试结果
{
	     lcd_init() ; //清上一屏
	    	 battery();          //显示电池电量
	   	 time();           //显示实时时间
	     dh(0,0,10,0);               //测试结果:
		dh(0,16,11,0);
		dh(0,32,37,0);
		dh(0,48,38,0);
		df(0,64,24,0);

		df(3,46,25,0);              //U1mA=XX.XKV
		dxz(4,54,12,0);
		dxz(4,62,13,0);
		dxz(4,70,14,0);
		df(3,82,26,0);
		df(3,130,27,0);
		df(3,138,28,0);

		df(6,46,29,0);              //I,I0.75U=      uA
		dxz(7,52,15,0);             //0.
		dxz(7,60,16,0);             //7
		dxz(7,66,17,0);             //5
		dxz(7,72,18,0);             //U
		df(6,82,26,0);             //=
		df(6,130,30,0);             //u
		df(6,138,31,0);             //A
}

void history()//进入历史查询
{
	uchar key = 0;
	ET0 = 0;   //关定时器0中断,不显示时间和电池电量
	Dis_history();//进入历史查询界面
	do                              //等待返回键被按下
 	{key=namekey();}
 	while(key!=4);
    program_1();
}

void Dis_history()  //历史查询显示内容
{
	  	 lcd_init() ; //清上一屏
	   	dh(0,52,24,0);               //历史数据
		dh(0,68,32,0);
		dh(0,76,25,0);
		dh(0,92,32,0);
		dh(0,100,26,0);
		dh(0,116,32,0);
		dh(0,124,27,0);

	//显示8*8点阵数字1. U=27.5KV I=25μA 17:25
		dxz(2,0,1,0);    //1
		dxz(2,8,19,0);//.
	//	dxz(2,16,20,0);//空格
		dxz(2,16,18,0);//U
		dxz(2,24,21,0);//=
		dxz(2,32,2,0);//2
		dxz(2,40,7,0);//7
		dxz(2,48,19,0);//.
		dxz(2,56,5,0);//5
		dxz(2,62,22,0);//K
		dxz(2,70,23,0);//V
		dxz(2,78,20,0);//空格
		dxz(2,86,24,0);//I
		dxz(2,94,21,0);//=
		dxz(2,102,2,0);//2
		dxz(2,110,5,0);//5
		dxz(2,118,25,0);//u
		dxz(2,126,14,0);//A
		dxz(2,132,20,0);//空格
		dxz(2,140,20,0);//空格
		dxz(2,148,1,0);//1
		dxz(2,156,7,0);//7
		dxz(2,164,11,0);//:
		dxz(2,172,2,0);//2
		dxz(2,180,5,0);//5

		//显示8*8点阵数字1. U=27.5KV I=25μA 17:25
		dxz(3,0,2,0);    //1
		dxz(3,8,19,0);//.
	//	dxz(2,16,20,0);//空格
		dxz(3,16,18,0);//U
		dxz(3,24,21,0);//=
		dxz(3,32,2,0);//2
		dxz(3,40,7,0);//7
		dxz(3,48,19,0);//.
		dxz(3,56,5,0);//5
		dxz(3,62,22,0);//K
		dxz(3,70,23,0);//V
		dxz(3,78,20,0);//空格
		dxz(3,86,24,0);//I
		dxz(3,94,21,0);//=
		dxz(3,102,2,0);//2
		dxz(3,110,5,0);//5
		dxz(3,118,25,0);//u
		dxz(3,126,14,0);//A
		dxz(3,132,20,0);//空格
		dxz(3,140,20,0);//空格
		dxz(3,148,1,0);//1
		dxz(3,156,7,0);//7
		dxz(3,164,11,0);//:
		dxz(3,172,2,0);//2
		dxz(3,180,5,0);//5

		//显示8*8点阵数字1. U=27.5KV I=25μA 17:25
		dxz(4,0,3,0);    //1
		dxz(4,8,19,0);//.
	//	dxz(2,16,20,0);//空格
		dxz(4,16,18,0);//U
		dxz(4,24,21,0);//=
		dxz(4,32,2,0);//2
		dxz(4,40,7,0);//7
		dxz(4,48,19,0);//.
		dxz(4,56,5,0);//5
		dxz(4,62,22,0);//K
		dxz(4,70,23,0);//V
		dxz(4,78,20,0);//空格
		dxz(4,86,24,0);//I
		dxz(4,94,21,0);//=
		dxz(4,102,2,0);//2
		dxz(4,110,5,0);//5
		dxz(4,118,25,0);//u
		dxz(4,126,14,0);//A
		dxz(4,132,20,0);//空格
		dxz(4,140,20,0);//空格
		dxz(4,148,1,0);//1
		dxz(4,156,7,0);//7
		dxz(4,164,11,0);//:
		dxz(4,172,2,0);//2
		dxz(4,180,5,0);//5

		//显示8*8点阵数字1. U=27.5KV I=25μA 17:25
		dxz(5,0,4,0);    //1
		dxz(5,8,19,0);//.
	//	dxz(2,16,20,0);//空格
		dxz(5,16,18,0);//U
		dxz(5,24,21,0);//=
		dxz(5,32,2,0);//2
		dxz(5,40,7,0);//7
		dxz(5,48,19,0);//.
		dxz(5,56,5,0);//5
		dxz(5,62,22,0);//K
		dxz(5,70,23,0);//V
		dxz(5,78,20,0);//空格
		dxz(5,86,24,0);//I
		dxz(5,94,21,0);//=
		dxz(5,102,2,0);//2
		dxz(5,110,5,0);//5
		dxz(5,118,25,0);//u
		dxz(5,126,14,0);//A
		dxz(5,132,20,0);//空格
		dxz(5,140,20,0);//空格
		dxz(5,148,1,0);//1
		dxz(5,156,7,0);//7
		dxz(5,164,11,0);//:
		dxz(5,172,2,0);//2
		dxz(5,180,5,0);//5

		//显示8*8点阵数字1. U=27.5KV I=25μA 17:25
		dxz(6,0,5,0);    //1

⌨️ 快捷键说明

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