89C52单片机网球计分程序, 差一点点解不通, 麻烦大大们帮帮忙

下面是我打的C编程, 但有一点是有问题, 使用两位数码管

当红:蓝是40:40时, 红队赢一球, 红队加分不是显示"A:40", 是显示"19:40"(下面红队加分的第二个if), 然后当蓝队再赢一球, 红队是可以正常由"19:40" 变回"40:40", 问题是出在哪呢?
怎样改才可以当40:40时, 再赢一球是显示"A"
谢谢大大们啊

if(key_red_add==1) 红队加分

{
key_red_add=0;
if(red_mark==0x28 && blue_mark == 0x77)
{
blue_mark = 0x28;
}
else
if(red_mark==0x28 && blue_mark==0x28)
{
red_mark = 0x77;
}
else
if(red_mark==0x77 &&blue_mark==0x28)
{
red_mark == 0x00;
blue_mark == 0x00;
}
else
if(red_mark==0x28 && blue_mark<0x28)
{
red_mark == 0x00;
blue_mark == 0x00;
}
else
if(red_mark==0x1e)
{
red_mark+=10;
}
else
if(red_mark<0x1e)
{
red_mark+=15;
}
}
if(key_red_mul==1) 红队减分

{
key_red_mul=0;
if(red_mark==0x77)
{
red_mark = 0x28;
}
else
if(red_mark==0x28)
{
red_mark-=10;
}
else
if(red_mark==0x1e)
{
red_mark-=15;
}
if(red_mark<0x1e)
{
red_mark-=15;
}
}
if(key_blue_add==1)//蓝队加分

{
key_blue_add=0;
if(blue_mark==0x28 && red_mark==0x77)

{
red_mark = 0x28;

}
else
if(blue_mark==0x28&& red_mark==0x28)
{
blue_mark = 0x77;
}
else
if(blue_mark==0x28 && red_mark<0x28)
{
red_mark==0x00;
blue_mark==0x00;
}
else
if(blue_mark==0x77 &&red_mark==0x28)
{
red_mark == 0x00;
blue_mark == 0x00;
}
else
if(blue_mark==0x1e)
{
blue_mark+=10;
}
else
if(blue_mark<0x1e)
{
blue_mark+=15;
}
}
if(key_blue_mul==1)//蓝队减分
{
key_blue_mul=0;
if(blue_mark==0x77)
{
blue_mark = 0x28;
}
else
if(blue_mark==0x28)
{
blue_mark-=10;
}
else
if(blue_mark==0x1e)
{
blue_mark-=15;
}
if(blue_mark<0x1e)
{
blue_mark-=15;
}
}

0x28是40,0x1e是30,小于30,得分+15 ,等于 30 ,得分+10 ,都是40时,得分变为 A

但你的 A 是 0x77,也就是 119,所以恰好显示出了后两位,就是 19 了,呵呵

我建议你这里别用十六进制,直接用十进制写吧,方便阅读和修改

你的编码数组必须包含 A 的编码,比如

uchar  code  tab [] = {0,1,2,3,4,5,6,7,8,9,A,不显示};

显示的时候,先显示十位 red_mark / 10 ,再显示个位 red_mark % 10

显示A时,只要显示 tab[10] 就行了,有一位不显示,也就是显示 tab[11]

if(key_red_add==1) //红队加分
{
    key_red_add=0;
    
    if(red_mark==40 && blue_mark == 50)
        blue_mark = 40;
    else if(red_mark==40 && blue_mark==40)
        red_mark = 50;
    else if(red_mark==50 &&blue_mark==40)
    {    red_mark == 0;
         blue_mark == 0;
    }
    else if(red_mark==40 && blue_mark<40)
    {
        red_mark == 0;
        blue_mark == 0;
    }
    else if(red_mark==30)
        red_mark+=10;
    else if(red_mark<30)
        red_mark+=15;
}
if(key_red_mul==1)   //红队减分
{
    key_red_mul=0;
    if(red_mark==50)
        red_mark = 40;
    else if(red_mark==40)
        red_mark-=10;
    else if(red_mark==30)
        red_mark-=15;
    else if(red_mark<30)
        red_mark-=15;
}
if(key_blue_add==1)//蓝队加分
{
    key_blue_add=0;
    
    if(blue_mark==40 && red_mark==50)
        red_mark = 40;
    else if(blue_mark==40 && red_mark==40)
        blue_mark = 50;
    else if(blue_mark==40 && red_mark<40)
    {
        red_mark==0;
        blue_mark==0;
    }
    else if(blue_mark==50 &&red_mark==40)
    {
        red_mark == 0;
        blue_mark == 0;
    }
    else if(blue_mark==30)
        blue_mark+=10;
    else if(blue_mark<30)
        blue_mark+=15;
}
if(key_blue_mul==1) //蓝队减分
{
    key_blue_mul=0;
    if(blue_mark==50)
        blue_mark = 40;
    else if(blue_mark==40)
        blue_mark-=10;
    else if(blue_mark==30)
        blue_mark-=15;
    else if(blue_mark<30)
        blue_mark-=15;
}

显示的时候再做处理

if( red_mark == 50 ) 显示A,就是十位显示 tab[10] ,个位不显示( 显示 tab[11] )

else 先显示十位 tab [ red_mark / 10 ] ,再显示个位 tab [ red_mark % 10 ]

蓝方同理

我没有改你的算法,但是我觉得你的算法有点复杂

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-03-16
发突然核桃仁土回填热高富帅

Warning: Invalid argument supplied for foreach() in /www/wwwroot/aolonic.com/skin/templets/default/contents.html on line 45
相似回答
大家正在搜