suncat0504 发表于 2019-6-3 13:36 亏我之前还专门看了全局变量和局部变量的区别,看来还是学习不够扎实啊,谢谢解答了 |
#include <reg52.h> #define uint unsigned int #define uchar unsigned char uint i,x; void delay(uint x); uchar duan[] = {0x06,0x5b,0x4f,0x66}; uchar wei[] = {0xfe,0xfd,0xfb,0xf7}; void main() { while(1) { for(i=0;i<4;i++) { P0 = duan[i]; P2 = wei[i]; delay(500); } } } void delay(uint x) { uint j; while(x--) { for(j=120;j>0;j--); } } 这是修改后的代码。另外提醒你,直接用P2口驱动数码管,有问题。51系列单片机的P2口线最大灌入电流只有20mA,你的电路中,若某个数码管同时点亮2个以上笔段时(按照一个笔段10mA点亮的话),会烧了P2的口线。建议你加三极管驱动。 |
你的代码实际运行时,会死循环在main函数中的for处理里,i永远被执行在0,1。 |
你的代码有问题。i是全局变量,在第一个mian函数中使用,作为循环0-2(i<3是边界条件,只能运行到i=2,范围是i=0,i=1,i=2),如果显示4个字段,需要扩大范围,for(i=0;i<4;i++).在第一个函数执行i=1时,i的值会被第二个延迟用的函数改变为0。这样,在执行完main中的i后,i在延迟处理中又变成了0;回到主循环,i加以处理,i变成1,判断i<3,所以继续处理P0,P2的输出,然后延迟处理使i又回到0;所以你需要在延迟函数中把i声明为局部变量。或者另外使用一个变量。看代码,你需要加强理解C语言中变量的作用范围,以及for循环处理。 |
没电路图,只能看代码猜,好辛苦的,而且问题也没说清楚。问题有两个。 1、i重用了。for(i=0;i<3;i++)这里用了i 然后在delay()里也有用。所以for程序循环第一次。然后进入delay(),结束返回时i=0,然后i++(for循环执行的),然后进入for第二次循环,又进入delay(),返回i=0,如此一来在执行到duan[ i],wei[ i]时,i永远为1,也就是显示第二个数(0x5b和0xfd)。还没办法接收for循环。因此才会出现你说的卡在2,其实是每次循环都输出的是2。把for循环的i改成别的变量就行。 2、即使程序改好了,也只是显示到3,因为for只循环3次
要显示4(0xf7),就要改成:for(i=0;i<4;i++)。 附上改好的程序 ![]() |