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

📄 mypro.c

📁 这是运用c51单片机测试电压电流的完整工程项目文件
💻 C
📖 第 1 页 / 共 4 页
字号:
	ET0 	= 0;  //关定时器0中断
	EX0		=	0;  //关外部中断0
	EX1		=	0;  //关外部中断1
	IT0   = 0;  //外部中断0低电平触发,故障报警
	IT1		=	1;  //外部中断1下降沿触发,1mA电流到
	PX1      =  1; //中断优先级顺序:外部中断0(故障)→外部中断1(1mA到)→定时器0(时间电量)
	PX0      =  1;
	TMOD	=	0x01; //定时器0定时方式1
	TH0		=	0xdc; //定时器0置初值
	TL0		=	0x00;
	TR0		=	1;    //启动定时器0

   
	lcd_init() ; //液晶屏初始化,清屏
	diyiping();   //产品信息显示

do                              //等待确定键被按下
 	{key=namekey();}      //扫描键盘,确定键被按下进入主菜单,否则等待
 	while(key!=7);
	lcd_init() ; //清屏
    dierping();   //主菜单
	while(1);
}





void  delay1ms(uint ui) /* 延时函数,晶振为11.0592m*/
{
	uint i,z,j;
	for ( j=0; j< ui; j++)
	for ( i=0; i < 2 ; i++ )
		for ( z=0; z <100; z++);
}

 /*************************************************************************
                         液晶屏初始化,清屏等底层程序
	 1、忙判别——lcd_busy(void);2、设置xy——set_xy(uchar x,uchar y)
	 3、写显示数据——lw(uchar x,uchar y,uchar dd);4、显示初始化——lcd_init()
 *************************************************************************/

 /*忙判别*/
void lcd_busy(void)
{
	 di=0;rw=1;P0=0xff;
	 while (1)
	  {
		en=1;
		if (P0<0x80) break;
		en=0;
	  }
	en=0;
}

 /*设置xy*/
void set_xy(uchar x,uchar y)
 {   y=y%192;
	if (y<64)
		{
			cs1=0;
			cs2=1;
			cs3=1;
		}
	else if(y<128)
		{
			cs1=1;
			cs2=0;
			cs3=1;
		}
		   else
		   	{
		   	 cs1=1;
			 cs2=1;
			 cs3=0;
		   	}
	lcd_busy();
	di=0;
	rw=0;
	P0=0xb8|x;       //设置页地址
    en=1;
	en=0;

	lcd_busy();
	di=0;
	rw=0;
	y=y%64;
	P0=0x40|y;    //设置列地址
	en=1;
	en=0;
	P0=0xff;
}

 /*写显示数据*/
void lw(uchar x,uchar y,uchar dd)
{
	set_xy(x,y);
	lcd_busy();
	di=1;
	rw=0;
	P0=dd;
	en=1;
	en=0;
	P0=0xff;
}

/*显示初始化*/
void lcd_init()
{
	uchar x,y;
	en=0;
	di=0;
	rw=0;
	cs1=1;
	cs2=1;
	cs3=1;

	cs1=0;     //开左屏显示
	P0=0x3f;
	en=1;
	en=0;

	cs1=1;     //开中屏显示
	cs2=0;
	cs3=1;
	en=1;
	P0=0x3f;
	en=0;

	cs1=1;     //开右屏显示
	cs2=1;
	cs3=0;
	en=1;
	P0=0x3f;
	en=0;

	cs1=0;     //设置左半屏起始行为0行
	cs2=1;
	cs3=1;
	lcd_busy();
	di=0;
	rw=0;
	P0=0xc0;
	en=1;
	en=0;

	cs1=1;     //设置中屏起始行为0行
	cs2=0;
	cs3=1;
	lcd_busy();
	di=0;
	rw=0;
	P0=0xc0;
	en=1;
	en=0;

	cs1=1;     //设置右半屏起始行为0行
	cs2=1;
	cs3=0;
	lcd_busy();
	di=0;
	rw=0;
	P0=0xc0;
	en=1;
	en=0;
	for (x=0;x<8;x++)    //全屏清零
	     {
		    for (y=0;y<192;y++)
		          lw(x,y,0x00);
	     }
}

 /****************************************************************************************
	显示底层程序:显示16*16点阵汉字、8*16点阵字符、8*8小字符、16*8点阵图形
***********************************************************************************/

 //显示汉字,fb==1:反白显示,16*16点阵
void dh(uchar x,uchar y,uchar n,uchar fb)
{
	uchar i,bb,dd;
	for (bb=0;bb<2;bb++)
     {
	     for (i=0;i<16;i++)
	           {
				dd=hz[i+16*bb+n*32];
				if (fb)
					dd=~dd;
				lw(x,y,dd);
                    y=y++;
       		   }
          x=x++;
          y=y-16;
      }
}

 //显示字符,fb==1:反白显示,8*16点阵
void df(unsigned char x,unsigned char y,unsigned char n,unsigned char fb)
{
      unsigned char i,bb,dd;
      for (bb=0;bb<2;bb++)
      {
	     for (i=0;i<8;i++)
	           {
				dd=zf[i+8*bb+n*16];
				if (fb)
					dd=~dd;
				lw(x,y,dd);
			     y=y++;
       		  }
          x=x++;
          y=y-8;
      }
}

 //8*8点阵显示,fb==1:反白显示
void dxz(uchar x,uchar y,uchar n,uchar fb)
{
      unsigned char i,bb,dd;
       for (bb=0;bb<1;bb++)
      {
	     for (i=0;i<8;i++)
	           {
				dd=xz[i+8*bb+n*8];
				if (fb)
					dd=~dd;
				lw(x,y,dd);
			     y=y++;
       		  }
          x=x++;
          y=y-8;
      }
}

//16*8 电池图形点阵,fb==1:反白显示
void dtx(uchar x,uchar y,uchar n,uchar fb)
{
      unsigned char i,bb,dd;
       for (bb=0;bb<1;bb++)
      {
	     for (i=0;i<16;i++)
	           {
				dd=tu[i+16*bb+n*16];
				if (fb)
					dd=~dd;
				lw(x,y,dd);
			     y=y++;
       		  }
          x=x++;
          y=y-8;
      }
}

//第一屏,产品厂家信息:欢迎使用氧化锌避雷器测试仪扬州市科发电气有限公司
void diyiping()
{
		dh(0,52,0,0);               
		dh(0,76,1,0);				
		dh(0,100,2,0);						
		dh(0,124,3,0);					
		dh(3,24,4,0);				
		dh(3,40,5,0);				
		dh(3,56,6,0);				
		dh(3,72,7,0);				
		dh(3,88,8,0);			
		dh(3,104,9,0);			
		dh(3,120,10,0);		
		dh(3,136,11,0);			
		dh(3,152,12,0);			
		dh(6,8,13,0);				
		dh(6,24,14,0);
		dh(6,40,15,0);
		dh(6,56,16,0);
		dh(6,72,17,0);
		dh(6,88,18,0);
		dh(6,104,19,0);
		dh(6,120,20,0);
		dh(6,136,21,0);
		dh(6,152,22,0);
		dh(6,168,23,0);
}

//读键值
uchar namekey(void)
{
 uchar   SW;
 uchar   KK ;
 bit flag;

 flag=IRcvByte(0x40,&SW);//读pcf8574数据

 if ( (SW&0xff)!=0xff)   //如果无键按下,则返回键值0
           {
              delay1ms (10) ;     //按键延时10ms
              flag=IRcvByte(0x40,&SW);//读pcf8574数据

              if ( (SW&0xff)!=0xff)     //如果判断无键,则为误抖动,返回0
	                       {
			                          KK = SW;
			                          do( flag=IRcvByte(0x40,&SW));//读pcf8574数据
                                     while ( (SW&0xff)!=0xff);   //等键释放
			                          KK = KK & 0xff ;
			                          switch(KK)
			                            {
											case  0xfe:return(1);break;  //上
											case  0xfd:return(2);break;  //下
											case  0xfb:return(3);break; //右
											case  0xf7:return(4);break;  //返回
											case  0xef:return(5);break;  //存储
											case  0xdf:return(6);break;  //打印
											case  0xbf:return(7);break; //确定

			                            }

	                       }
            }
     return (0);
}

// 第二屏,主菜单显示
void dierping()         //主菜单
{
		uchar key = 0;
		EA=1;      //开定时器0中断
		ET0=1;
		battery();          //显示电池电量
	  time();           //显示实时时间
		dh(2,52,10,1);               //反白显示,“测试”
		dh(2,68,32,1);
		dh(2,84,32,1);
		dh(2,100,32,1);
		dh(2,108,32,1);
		dh(2,124,11,1);


		dh(4,52,24,0);               //历史数据
		dh(4,76,25,0);
		dh(4,100,26,0);
		dh(4,124,27,0);

		dh(6,52,28,0);              //时钟设置
		dh(6,76,29,0);
		dh(6,100,30,0);
		dh(6,124,31,0);
//扫描键盘,判断下一步操作
smkey:
  do                             //等待有键被按下
     {
     	
     	key=namekey();
    }
     while(!key);      //key=0,表示无键按下,继续扫描键盘
     key_chuli_1(key);           //有键被按下,转键盘处理1
    
    goto smkey;

}

//主菜单下读取键值1(上)、2(下)、7(确定键)
void key_chuli_1(uchar key)   //按键处理1,键值为3、4、5、6均不起作用
{
  switch(key)
         {
			 case 1: 	if( KeyCount > 0 )
							KeyCount--;
						else
							KeyCount = 2;
						program_1();   break;         //光标上移
			 case 2: if( KeyCount < 2 )
							KeyCount++;
						else
							KeyCount = 0;
						program_1();
						break;                            //光标下移
			 case 7:program_7();   break;          //确定
         }
}

//主菜单上下键处理程序
void program_1()
{
	lcd_init() ; //清上一屏
	ET0=1;      //开定时器0,显示时间、电量
	battery();          //显示电池电量
	time();           //显示实时时间

	if ( KeyCount	==	0 )
	{
		          //反白显示,测试
		dh(2,52,10,1);
		dh(2,68,32,1);
		dh(2,84,32,1);
		dh(2,100,32,1);
		dh(2,108,32,1);
		dh(2,124,11,1);

		dh(4,52,24,0);               //历史数据
		dh(4,68,32,0);
		dh(4,76,25,0);
		dh(4,92,32,0);
		dh(4,100,26,0);
		dh(4,116,32,0);
		dh(4,124,27,0);

		dh(6,52,28,0);              //时钟设置
		dh(6,68,32,0);
		dh(6,76,29,0);
		dh(6,92,32,0);
		dh(6,100,30,0);
		dh(6,116,32,0);
		dh(6,124,31,0);
	}
	if ( KeyCount	==	1 )
	{
		dh(4,52,24,1);               //反显历史数据
		dh(4,68,32,1);
		dh(4,76,25,1);
		dh(4,92,32,1);
		dh(4,100,26,1);
		dh(4,116,32,1);
		dh(4,124,27,1);
		                               // 测试
		dh(2,52,10,0);
		dh(2,68,32,0);
		dh(2,84,32,0);
		dh(2,100,32,0);
		dh(2,108,32,0);
		dh(2,124,11,0);

		dh(6,52,28,0);              //时钟设置
		dh(6,68,32,0);
		dh(6,76,29,0);
		dh(6,92,32,0);
		dh(6,100,30,0);
		dh(6,116,32,0);
		dh(6,124,31,0);
	}
	if ( KeyCount	==	2 )
	{
		dh(6,52,28,1);              //反显时钟设置
		dh(6,68,32,1);
		dh(6,76,29,1);
		dh(6,92,32,1);
		dh(6,100,30,1);
		dh(6,116,32,1);
		dh(6,124,31,1);

		dh(4,52,24,0);               //历史数据
		dh(4,68,32,0);
		dh(4,76,25,0);
		dh(4,92,32,0);
		dh(4,100,26,0);
		dh(4,116,32,0);
		dh(4,124,27,0);
		                               // 测试
		dh(2,52,10,0);
		dh(2,68,32,0);
		dh(2,84,32,0);
		dh(2,100,32,0);
		dh(2,108,32,0);
		dh(2,124,11,0);
	}

}

//主菜单下按确定键处理程序
void program_7()
{
	switch(KeyCount)
	       {
        case 0: test(); break;//启动进入测试程序
        case 1: history(); break;//进入历史查询
        case 2:
				Dis_settime();  //进入时钟设置
				time_mod();      //修改时间函数
				break;
	       }

}

void Dis_settime()  //进入时钟设置
{
	lcd_init() ; //清上一屏
	ET0=0;      //关定时器0,不显示时间、电量
	dh(0,52,28,0);              //显示"时 钟 设 置"标题
  	dh(0,68,32,0);
	dh(0,76,29,0);
	dh(0,92,32,0);
	dh(0,100,30,0);
	dh(0,116,32,0);
	dh(0,124,31,0);
	disset();     //显示设定前初始值
}

//显示设定前初始值
void disset()
{
	  	df(4,16,year10,1);          //设置年、月、日、时、分
		df(4,24,year1,0);
		dh(4,32,39,0);
		df(4,48,month10,0);
		df(4,56,month1,0);
		dh(4,64,40,0);
		df(4,80,day10,0);
		df(4,88,day1,0);
		dh(4,96,41,0);
		df(4,112,hour10,0);
		df(4,120,hour1,0);
		dh(4,128,42,0);
		df(4,144,minute10,0);
		df(4,152,minute1,0);
		dh(4,160,43,0);
}

void time_mod()  //修改时间函数

{
	uchar	 KeyPosition = 0;  //该数据值 保存着要修改的 数值信息,光标起始位置在0列
	uchar keytmp= 0;
	utime[0] = year10;
	utime[1] = year1;
	utime[2] = month10;
	utime[3] = month1;
	utime[4] = day10;
	utime[5] = day1;
	utime[6] = hour10;
	utime[7] = hour1;
	utime[8] = minute10;
	utime[9] = minute1;
	while (1)
	{

⌨️ 快捷键说明

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