本帖最后由 小学僧啊 于 2019-4-3 16:21 编辑
部分程序如下:
char KeyValue=0; //矩阵键盘键值,根据不同的值执行不同的子程序
char grade=0,a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,z;
char score=1; //这个值可以通过按键改变(1~9)
void display(void) //显示有问题的一段显示程序,不过应该不是这段程序的问题
{
if(over_flag==1)
{
PA=tabledu[z/10];
PB=0x0A;
delay(2);
PA=0x00;
PA=tabledu[z%10];
PB=0x0B;
delay(2);
PA=0x00;
}
else
{
PA=tabledu[num];
PB=0x08;
delay(2);
PA=0x00;
PA=tabledu[grade/10]; //这的显示开始出问题了
PB=0x0A;
delay(2);
PA=0X00;
PA=tabledu[grade%10];
PB=0x0B;
delay(2);
PA=0X00;
}
}
}
void main(void) //主程序的一部分,关于显示出错的部分
{
if((ask_flag==1)&(KeyValue==4)) //假设这个条件满足,执行if中的语句
{
end_flag=1;
TR0=0;
TR1=0;
KeyValue=0;
switch(num)
{
case(1):grade=a;break;
case(2):grade=b;break;
case(3):grade=c;break;
case(4):grade=d;break;
case(5):grade=e;break;
case(6):grade=f;break;
case(7):grade=g;break;
case(8):grade=h;break;
}
}
if((end_flag==1)&(KeyValue==5))
{
KeyValue=0;
switch(num)
{
case(1):a=a+score;grade=a;break;
case(2):b=b+score;grade=b;break;
case(3):c=c+score;grade=c;break;
case(4):d=d+score;grade=d;break;
case(5):e=e+score;grade=e;break;
case(6):f=f+score;grade=f;break;
case(7):g=g+score;grade=g;break;
case(8):h=h+score;grade=h;break;
}
grade_flag=1;
}
display();
}
这段程序可以正常运行,在变量grade,a,b,c,d,e,f,g,h没有改变时,显示正常,但当执行一遍switch之后,被改变的量显示的不是预期的数字,比如说score=5,num=5,执行之后e=0+5,grade=5。
数码管十位应该显示0,各位显示5,可是在这里的显示就出现问题了,不知道是哪里出了问题。(我试过将其中一个变量改为非零值,在没有执行switch时可以正常显示,但执行后就出问题了)
已退回3积分
2019-4-3 16:11:39
if((end_flag==1)&(KeyValue==5))这里面的&应该是两个吧,另外大括号的配对好像也有问题,在display();下面多了一个
if((end_flag==1)&(KeyValue==5))这里面的&应该是两个吧,另外大括号的配对好像也有问题,在display();下面多了一个
1
举报
-
张敬国:
&这个符号没有问题,小括号中的表达式不是为1就是为0,单个&是按位与,还有}的问题,使我的疏忽,主程序开始的地方没有打{其实,if中的条件和程序应该没有问题,调试没有错误没有警告,只是显示的值有些问题。
2019-4-3 18:35:59
void display(void)的最后多了一个大括号,
case(8):h=h+score;grade=h;break;这段执行后,a到h没有清零,所以第一次跟你举例的一样,第二次开始就不一样了,假设第二次还是score=5,num=5,执行之后e=5+5,grade=10。
这只是一部分代码,并不一定代表错误就在这段代码里
void display(void)的最后多了一个大括号,
case(8):h=h+score;grade=h;break;这段执行后,a到h没有清零,所以第一次跟你举例的一样,第二次开始就不一样了,假设第二次还是score=5,num=5,执行之后e=5+5,grade=10。
这只是一部分代码,并不一定代表错误就在这段代码里
2
举报
-
张敬国:
谢谢啊,这个问题出在了条件的判定上,程序本身没有问题,我按下按键后再松开,在这个过程if的条件一直满足,所以switch执行了许多次,所以如果debug的话程序没有问题,仿真的过程就出问题了,我在条件的判定中加了一句,只有当按键按下并弹起后,才会执行开关语句,这样就和我预想的一样了。
然后关于case中的语句,a到h是作为全局变量存在的,在复位前不用做清零处理。
-
张敬国:
因为程序没有完整的贴出来,才造成了您出现这样的判断,实在是不好意思哈。。。
2019-4-3 22:19:03
这个程序本身没有太大的问题,之所以显示乱码,或者说显示的不是我预想的值,是因为if中的条件在一直被满足,所以语句执行了许多次,因此变量的值会不是预想的结果。
这个程序本身没有太大的问题,之所以显示乱码,或者说显示的不是我预想的值,是因为if中的条件在一直被满足,所以语句执行了许多次,因此变量的值会不是预想的结果。
举报
2019-4-4 14:13:48
显示程序这样写才合理
void display(void)
{
if(over_flag==1)
{
PA=0x00;
PB=0x0A;
PA=tabledu[z/10];
delay(2);
PA=0x00;
PB=0x0B;
PA=tabledu[z%10];
delay(2);
}
else
{
PA=0x00;
PB=0x08;
PA=tabledu[num];
delay(2);
PA=0X00;
PB=0x0A;
PA=tabledu[grade/10];
delay(2);
PA=0X00;
PB=0x0B;
PA=tabledu[grade%10];
delay(2);
}
}
if((ask_flag==1)&(KeyValue==4)) 和 if((end_flag==1)&(KeyValue==5))这两条判断语句肯定是错的!
正确写法:if((ask_flag==1)&&(KeyValue==4)) 和 if((end_flag==1)&&(KeyValue==5))
显示程序这样写才合理
void display(void)
{
if(over_flag==1)
{
PA=0x00;
PB=0x0A;
PA=tabledu[z/10];
delay(2);
PA=0x00;
PB=0x0B;
PA=tabledu[z%10];
delay(2);
}
else
{
PA=0x00;
PB=0x08;
PA=tabledu[num];
delay(2);
PA=0X00;
PB=0x0A;
PA=tabledu[grade/10];
delay(2);
PA=0X00;
PB=0x0B;
PA=tabledu[grade%10];
delay(2);
}
}
if((ask_flag==1)&(KeyValue==4)) 和 if((end_flag==1)&(KeyValue==5))这两条判断语句肯定是错的!
正确写法:if((ask_flag==1)&&(KeyValue==4)) 和 if((end_flag==1)&&(KeyValue==5))
2
举报
-
-
张敬国:
我想问下,如果使用74HC138译码器控制共阴数码管的位选,做实物的时候有什么需要注意的吗?还是说可直接通过端口控制之后,Y0~Y7直接与位选端连接就可以了。
比如说我使用8255做了扩展,PA控制段选,PB8个位接两个138,低四位接A0A1A2以及E3(E3是138的一个使能端,高电平触发),当PB=0X08时,电亮Y0控制的数码管,当PB=0X09时,电亮Y1控制的数码管,以此类推。但是我做的实物,只能电亮Y0Y2Y4Y6四个控制的数码管,其余的都不亮,不知道是什么原因。
再有一个问题就是,如果不使用138,直接使用单片机的端口与数码管的位选端连接,在端口为零时点亮对应的数码管,不知道这个方法可以吗。还是说要通过电阻以及三极管的配合来驱动数码管。