📄 menu.c
字号:
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 + -