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

📄 menu.c

📁 本菜单程序基于单片机8051和液晶1602
💻 C
📖 第 1 页 / 共 2 页
字号:
	zd = 0;						
   
	while(!zd)
	{
       // spk = 0;
		usbserve();						
		if(bEPPflags.bits.configuration == 1 && zd == 0)  
		{
			if (bEPPflags.bits.ep1_rxdone == 1 && zd == 0 )					
			{											
				DISABLE();
				bEPPflags.bits.ep1_rxdone = 0;			
				ENABLE();

				SEp1Buf[0]=0;
			
				SEp1Buf[1]=ckey;
				SEp1Buf[2]=0;
				D12_WriteEndpoint(3, 3, SEp1Buf);		
			
				spk=GenEpBuf[1];//x10 or x5
               keyprocess1();
							
			}
              keyprocess1();
		}
          keyprocess1();
	}
      break;
default: 
	  item_num = RS232;
     break;
}

}


void second2esc()   //返回上一级菜单
{
    ptrstru = &M_FIRST;
	item_num = CONVERTERNUM;
    lcddisplay(CONVERLAB,COMLAB); 
    lcd_wcmd(0x02);
}




//第三级菜单ADCONVERTER下操作函数
void third1turn()   //在同级菜单中翻转
{
 item_num = (item_num)%THIRD1SUN +1;
  switch(item_num)
  {
 case  Other :
	  lcddisplay(OTHERLAB,AD590LAB);
      lcd_wcmd(0x02);
	  break;
 case  AD590: 
      lcddisplay(AD590LAB,FCVLAB); 
      lcd_wcmd(0x02);
	  break;
 case  FCV:
	  lcddisplay(FCVLAB,PT100LAB); 
      lcd_wcmd(0x02);
       break;
 case  PT100:
	  lcddisplay(PT100LAB,OTHERLAB); 
      lcd_wcmd(0x02);
	   break;
 default: 
      item_num=0;
	  break;
  }  

}


void third1enter()  //进入下一级菜单(处理各类传感器转换)
{//
   unsigned char  advl,advh;  //接收M1单元发送的AD采样数据
   float  voltage ;           //转换得到的电压值
   esclock = 0;
   enterlock = 1;
   turnlock  =  1;
   pauselock = 0;
   samplelock = 0;
   reback = 1;
   EX1 = 1;              // 允许外部中断INT1
  
switch(item_num)
 {///
case Other:
     
      while(reback)
   {
    if(adready)
	{
	// spk = 0;
	 EX1 = 0;   
     advl = xdadl;
     advh = xdadh;
     advl = advl & 0x0f;  //使5到8位为0
	 adready = 0;
     voltage = AD12to10(advl,advh);
     voltage = 200*voltage/4096;
     voltage =ceil(voltage);
     lcddisplayint1(voltage);
     lcd_wdat(0x56);    //写入电压V
     keyprocess1();
	 delay(chanV);
	 EX1 = 1; 
	 }
    } 
  

     break;
case AD590 :
      //数值处理
	 
    while(reback)
   {
    if(adready)
	{
	// spk = 0;
	 EX1 = 0;   
     advl = xdadl;
     advh = xdadh;
     advl = advl & 0x0f;  //使5到8位为0
	 adready = 0;
     voltage = AD12to10(advl,advh);
     voltage = 2000*voltage/4096;
     voltage =ceil(voltage);
     lcddisplayint1(voltage);
     lcd_wdat(0x43);    //写入温度 C
     keyprocess1();
	 delay(chanV);
	 EX1 = 1; 
	 }
    }
      break;
case FCV:
       
	 //数值处理
      while(reback)
   {
     if(adready)
	{
	 EX1 = 0;   
     advl = xdadl;
     advh = xdadh;
     advl = advl & 0x0f;  //使5到8位为0
	 adready = 0;
     voltage = AD12to10(advl,advh);
     voltage = 2000*voltage/4096/13.62;   //单位为KHZ
     voltage =ceil(voltage);
     lcddisplayint1(voltage);
     lcd_wdat(0x4b); 
     lcd_wdat(0x48); 
     lcd_wdat(0x7a); 
     keyprocess1();
	 delay(chanV);
	 EX1 = 1; 
	 }
    }

	 break;

case PT100:
	/////////////////////////////////////////////////////////////////
    	 //数值处理
	 
      while(reback)
   {
      if(adready)
	{
	 EX1 = 0;   
     advl = xdadl;
     advh = xdadh;
     advl = advl & 0x0f;  //使5到8位为0
	 adready = 0;
     voltage = AD12to10(advl,advh);
     voltage = 2*voltage/4096;     //PT100接收到的电压要转为原来的十分之一  再利用下面公式
	 voltage =-247.703 + 2399.380*voltage - 68.165*voltage*voltage + 460.117*voltage*voltage*voltage;
     voltage =10 * voltage;
     voltage =ceil(voltage);
     lcddisplayint1(voltage);
     lcd_wdat(0x43);
     keyprocess1();
     delay(chanV);
	 EX1 = 1; 
	 }
    }


	/////////////////////////////////////////////////////////////////////////////////////////// 
	 break;

default: 
	  item_num = Other ;
     break;
}///

}//

void third1esc()    //返回上一级菜单
{
    ptrstru = &M_SECOND1;
    item_num = ADconverter;
    lcddisplay(ADLAB,DALAB);  
    lcd_wcmd(0x02); 
  

}






// 本程序处理按键响应,并根据键值转向相应的处理函数 
void  keyprocess()
{
unsigned char j,r,s;

r=1;
j=GetKeyStatus(); // 取键值,0xff为无效键,即无按键
if(j!=0xff)       //等待键弹起
{
while(r)
{
 mHorizontalAllLow; // 行输出为0    
 mJugeVertical(s); // 判断是否有按键
 if(s==0xff)
{
 r=0;
}
else
{
r=1;
}
}
}
_nop_(); _nop_();  //两个时钟周期的延迟

switch(j)
{
   case 0xee: break;   //第4行第1列
   case 0xed: break;   //第4行第2列
   case 0xeb: break;   //第4行第3列
   case 0xe7: break;   //第4行第4列
   case 0xde: changeV(); break;   //第3行第1列
   case 0xdd: break;   //第3行第2列
   case 0xdb: break;   //第3行第3列
   case 0xd7: break;   //第3行第4列
   case 0xbe: pause();break;  //第2行第1列
   case 0xbd: zero();break;  //第2行第2列
   case 0xbb: one();break;   //第2行第3列
   case 0xb7: delete();break;   //第2行第4列
   case 0x7e: esc();break;   //第1行第1列
   case 0x7d: enter();break;   //第1行第2列
   case 0x7b: turn();break;   //第1行第3列
   case 0x77: turn();break;   //第1行第4列
   default:           break;          //缺省

}
}

// 本程序判断运行时是否按下ESC PAUSE  changeV  键     待修改
void  keyprocess1()
{
unsigned char j,r,s;

r=1;
j=GetKeyStatus(); // 取键值,0xff为无效键,即无按键
if(j!=0xff)       //等待键弹起
{
while(r)
{
 mHorizontalAllLow; // 行输出为0    
 mJugeVertical(s); // 判断是否有按键
 if(s==0xff)
{
 r=0;
}
else
{
r=1;
}
}
}

if(j == 0xbe)
{
 pause();
}
else if(j == 0x7e )
{
 esc();
}
else if (j == 0xde)
{
changeV();

}

}




// 判断按键状态
unsigned char GetKeyStatus()      // 读取键的状态
{
unsigned char c;
_nop_(); _nop_();

mHorizontalAllLow; // 行输出为0   
mJugeVertical(c); // 判断是否有按键
_nop_(); _nop_();
if(c==0xff)    //无按键
{
 return 0xff; // 无按键
}
else
{
if(c!=0xff)
delayms(20);
c=GetKeyCode(); // 扫描键值
return c;
}
}


// 本程序读按键的行列号值,若读键错误,或没按键均返回0xff
unsigned char GetKeyCode()
{
 unsigned char i,j,ucH_Value;
_nop_(); _nop_();
ucH_Value=mH_InitValue;     //mH_InitValue=0xfe 

for(i=0;i<mVerticalNumber;i++)
{
//j=ucH_Value;
mReadVertical(j); // 输出一行低电平后,读列值
if(j<mKeyOff)
//#define mKeyOff 0xff
{
//j=(~j)&mKeyOff;
//ucH_Value=(~ucH_Value);
ucH_Value<<=4;
ucH_Value|=0x0f;

return(j&ucH_Value); // 返回高四位行值,低四位列值
}
ucH_Value<<=1; ucH_Value|=0x01; // 下一行输出低电平
}
return 0xff;
}

// 延时子程序
void delayms(unsigned char ms)	

{						
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}


void zero()
{



}


void one()
{


}







//改变LCD显示速率
void changeV()   
{

  if(samplelock == 0)   //当该键打开时

  {
   if (chanV <= 2)
  {
      chanV++;     //调整采样AD速率

  }
  else 
      chanV = 0;
  
  }
 
}



//同级菜单下翻滚
 void turn()  
{ 
   if(turnlock == 0)
   {
   
   (*ptrstru->turn)();
   }
   
   
}


//进入下级菜单或启动具体功能
void enter()  
{

   if(enterlock == 0)
   {
    (*ptrstru->enter)();  
   }

}

//返回上一级菜单
void esc()    
{

    if(esclock == 0)
	{
	enterlock = 0;
	turnlock = 0;
	pauselock = 1;
	samplelock = 1;
    reback = 0;
    zd =  1;  //跳出USB处理程序
    EX0 = 0;  //关中断0

	 spk = 1;
    (*ptrstru->esc)();
	}
     spk = 1;  
}


//结束具体功能
void pause() 
{
   if(pauselock == 0) 
   {

    pauselock = 1 ;  //关闭PAUSE键  0为打开  1为闭合
	esclock = 0;
	enterlock = 0;
	turnlock = 0;
	samplelock = 1;
    reback = 0;
	 spk = 1;
  zd =  1;  //跳出USB处理程序
    EX0 = 0;  //关中断0

    
    
    if (ptrstru ==&M_SECOND1)
    {
    lcddisplay(ADLAB,DALAB); 
    lcd_wcmd(0x02); 
  
   
    }
    else if(ptrstru ==&M_SECOND2)
    {
    lcddisplay(RS232LAB,RS485LAB); 
    lcd_wcmd(0x02);
   
    }
    else if(ptrstru ==&M_THIRD1)
    {   
     lcddisplay(AD590LAB,PT100LAB); 
     lcd_wcmd(0x02); 
    }
   
   }
   
   

}  


//数字逐个删除  
void delete() 
{



}




//LCD部分操作函数

//检测忙状态
bit lcd_busy()               
{
 bit result;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 P0=XBYTE[rc];
 result=(bit)(P0&0x80);
 return result;
}



//写命令
void lcd_wcmd(unsigned char cmd)     
{
	while(lcd_busy());        	
    XBYTE[wc]=cmd;

}

 //设定显示位置
void lcd_pos(unsigned char pos)     
{

    lcd_wcmd(pos | 0x80);
}


//写数据
void lcd_wdat(unsigned char dat)     
{
    while(lcd_busy());
     XBYTE[wd] = dat;
}

//LCD初始化
void lcd_init()	        
{
    lcd_wcmd(0x38);			//
	delay(1);
	lcd_wcmd(0x0f);			//
	delay(1);
	lcd_wcmd(0x06);			//
	delay(1);
	lcd_wcmd(0x01);			//清除LCD的显示内容
	delay(1);


}

//LCD显示函数
void lcddisplay(unsigned char code menuitem1[],unsigned char code menuitem2[]) 
{
   unsigned char i;
  	lcd_init();				// 初始化LCD			
	delay(10);
	lcd_pos(2);				// 设置显示位置为第一行的第2个字符  
	i = 0;
	while(menuitem1[i] != '\0')
	{
		lcd_wdat(menuitem1[i]);
		i++;
	}
   
	lcd_pos(0x42);			// 设置显示位置为第二行第二个字符
	i = 0;

	while(menuitem2[i] != '\0')
	{
           
        
		lcd_wdat(menuitem2[i]);	
		i++;
	}
   
}



//下面是外部中断INT0的中断服务程序,使用第3组寄存器,外部中断 INT1 的中断号为 1
void Int1IrqHandler (void) interrupt 2  using  3
{
     
   adready = 1;
   //spk = 0;
}






/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////
void Usb_i(void) 	interrupt 0 using 2
{
   // spk = 0;
	DISABLE();	
	Usb_Exception();
	ENABLE();
}
/////////////////////////////////////////////////////////////









  
























⌨️ 快捷键说明

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