是一个带lcd的键盘程序,用的键盘处理芯片是8279,程序在仿真器上调试通过,但是写入单片机运行时,从一个键的处理程序完成后又转到了另一个键的处理上。
相关程序如下:
void keyprocess()
{
uchar i=0;
bit bcheckedin=0;
//char chval[20];
char chpass[pass_max_len];
char chlcdcmd=0;
feeding_dog;
g_fkeyflag=0;
g_uikeyval=0;
while(1) //键盘处理
{
if(g_fkeyflag&&(g_uikeyval!=0)&&g_ftimeflag)
{
g_uctimecount=0;
g_ftimeflag=0;
tr0=0;
tr0=1;
//g_fkeyflag=0;
switch(g_ucsetuplevel)//if(g_ucsetuplevel==0)
{
case 0:
{
switch(g_uikeyval)//if(g_uikeyval==key_setup)
{
case key_setup:
{
i=0;
inputpass();
g_uccurmenu=1;
g_ucsubmenulevel=0;
break;
}
case key_enter://else if(g_uikeyval==key_enter)
{
if(g_uccurmenu==1)
{ if(checkpass(chpass,i)) //从此处检测密码通后,继续运行啊啊啊啊啊啊啊啊啊处程序
{
memset(chpass,0,pass_max_len);
g_ucsetuplevel=10;
codecsetupsel();
g_uccurmenu=0;
}
else
{
i=0;
inputpass();
g_uccurmenu=1;
g_ucsubmenulevel=0;
}
}
break;
}
//case
case key_esc: //跳转到此处运行 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
{
if((g_uccurmenu==1)&&(g_ucsubmenulevel==0))
{
initlcd();
g_ucsetuplevel=0;
g_uccurmenu=0;
g_ucsubmenulevel=0;
}
break;
}
}
if((g_uccurmenu==1)&&(g_ucsubmenulevel==0)&&(g_uikeyval>0x48)&&(g_uikeyval<0x53)) //input is pass
{
if(i<pass_max_len)
{
chpass=(char)g_uikeyval;
chlcdcmd=0x90+i;
lcddata("*",chlcdcmd);
i++;
}
}
break;
}
case 10: //list main menu
{
mainmenuprocess();
break;
}
case 1: //cedec setup menu
{
codecmenuprocess();
break;
}
case 2://decode setup menu
{
decodemenuprocess();
break;
}
case 3: //keyboard setup menu
{
keymenuprocess();
break;
}
case 4: //change passwd setup menu
{
chgpassprocess();
break;
}
case 5: //quit?
{
//initlcd();
//g_ucsetuplevel=0;
//g_uccurmenu=0;
//g_ucsubmenulevel=0;
break;
}
}
//sprintf(chval,"键值为%d",g_uikeyval);
//openlcd();
//lcddata(chval,0x80);
//memset(chval,0,20);
//sprintf(chval,"%d",g_uikeyval);
//sendtoserial(chval,2);
//lcddata(chval,0x90);
//ex0=1;
//tr0=1;
}
g_fkeyflag=0;
g_uikeyval=0;
feeding_dog;
}
}