急!急!急!关于LCD12864显示的问题。用矩阵式键盘进行加减1。程序如下,请各位大侠指点迷津!不甚感激!
急!急!急!当通过按键进行加一或减一操作后,开始会在指定的显示单元显示,但多按几次后,偶尔会跑到别的显示单元显示,搞了一天啦,都还没弄明白,请各位大侠多多相助啊!说一说可...
急!急!急!当通过按键进行加一或减一操作后,开始会在指定的显示单元显示,但多按几次后,偶尔会跑到别的显示单元显示,搞了一天啦,都还没弄明白,请各位大侠多多相助啊!说一说可能出现该现象的原因,尽量详细点。液晶的初始化设置和键扫程序没问题。
程序如下:
while(1)
{uchar v; v=keyscan(); //调键扫
if(v==0x41||v==0x81||v==0x12||v==0x22)
{switch(v)
case 0x41:{ hpoint++; //主队加分
point_lcd(0x00,hpoint); } //分数显示更新
while(v==0x41) v=keyscan();
break;
case 0x81:{ hpoint--;
point_lcd(0x00,hpoint);
while(v==0x81) v=keyscan();}
break;
case 0x12:{ rpoint++; //客队加分
point_lcd(0x03,rpoint);} //分数显示更新
while(v==0x12) v=keyscan();
break;
case 0x22: { rpoint--;
point_lcd(0x03,rpoint);}
while(v==0x22) v=keyscan();
break;
/*************分数显示更新函数********/
void point_lcd(uchar add,uchar dat)
{
write(0x8b+add);
read(0x30+dat/100);
read(0x30+(dat%100)/10);
read(0x30+dat%10);
} 展开
程序如下:
while(1)
{uchar v; v=keyscan(); //调键扫
if(v==0x41||v==0x81||v==0x12||v==0x22)
{switch(v)
case 0x41:{ hpoint++; //主队加分
point_lcd(0x00,hpoint); } //分数显示更新
while(v==0x41) v=keyscan();
break;
case 0x81:{ hpoint--;
point_lcd(0x00,hpoint);
while(v==0x81) v=keyscan();}
break;
case 0x12:{ rpoint++; //客队加分
point_lcd(0x03,rpoint);} //分数显示更新
while(v==0x12) v=keyscan();
break;
case 0x22: { rpoint--;
point_lcd(0x03,rpoint);}
while(v==0x22) v=keyscan();
break;
/*************分数显示更新函数********/
void point_lcd(uchar add,uchar dat)
{
write(0x8b+add);
read(0x30+dat/100);
read(0x30+(dat%100)/10);
read(0x30+dat%10);
} 展开
1个回答
展开全部
你设计的程序有问题:
1:每次执行while(1)时,v都会被重新定义一次,这样很不好,应该将变量定义放到while(1)外面。
2:case里面的 while(v==0x**) v=keyscan();有问题,例如第一个case里面的while(v==0x41) v=keyscan(); ,你的意思是按一次键就加1,防止被加多次,但是你这个while语句退出的条件是下一个按键必须与当前按键不同,这与现实情况相符吗?主队不能连续得分吗?这个你自己考虑一下,也许你设置的比赛规则是这样的。
3:还是 while(v==0x**) v=keyscan();这句,你的意思就是case语句退出的条件是检测到下一个按键必须与当前按键不同,但是你的while(1)循环第一句也是扫面键盘,这样就有可能出错。
建议你如下修改:
1:v的定义放到while(1)外面。
2:删除每一个case语句中的while(v==0x**) v=keyscan();,在执行完case语句后,将v的值赋成0x00,或者一个不可能的键盘值即可,然后直接退出case语句。
case 0x41:
{
hpoint++; //主队加分
point_lcd(0x00,hpoint);
v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。
} //分数显示更新
break;
case 0x81:
{
hpoint--;
point_lcd(0x00,hpoint);
v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。
}
break;
case 0x12:
{
rpoint++; //客队加分
point_lcd(0x03,rpoint); //分数显示更新
v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。
}
break;
case 0x22:
{
rpoint--;
point_lcd(0x03,rpoint);
v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。
}
break;
1:每次执行while(1)时,v都会被重新定义一次,这样很不好,应该将变量定义放到while(1)外面。
2:case里面的 while(v==0x**) v=keyscan();有问题,例如第一个case里面的while(v==0x41) v=keyscan(); ,你的意思是按一次键就加1,防止被加多次,但是你这个while语句退出的条件是下一个按键必须与当前按键不同,这与现实情况相符吗?主队不能连续得分吗?这个你自己考虑一下,也许你设置的比赛规则是这样的。
3:还是 while(v==0x**) v=keyscan();这句,你的意思就是case语句退出的条件是检测到下一个按键必须与当前按键不同,但是你的while(1)循环第一句也是扫面键盘,这样就有可能出错。
建议你如下修改:
1:v的定义放到while(1)外面。
2:删除每一个case语句中的while(v==0x**) v=keyscan();,在执行完case语句后,将v的值赋成0x00,或者一个不可能的键盘值即可,然后直接退出case语句。
case 0x41:
{
hpoint++; //主队加分
point_lcd(0x00,hpoint);
v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。
} //分数显示更新
break;
case 0x81:
{
hpoint--;
point_lcd(0x00,hpoint);
v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。
}
break;
case 0x12:
{
rpoint++; //客队加分
point_lcd(0x03,rpoint); //分数显示更新
v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。
}
break;
case 0x22:
{
rpoint--;
point_lcd(0x03,rpoint);
v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。
}
break;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询