51单片机,我用自制的试验板,搭好外围元件,插上仿真头,硬件仿真,一般写十几行代码,我就要仿真通过,无非就是设置断点、单步执行、全速执行,只要有错误,很快就发现,AVR单片机用自制的JTAG仿真器仿真,虽然难用一些,也总比没有要好,没有硬件仿真器 |
不管是什么单片机,编程查错效率最高的是硬件仿真,我从来没有用过proteus,像51单片机,我用自制的试验板,搭好外围元件,插上仿真头,硬件仿真,一般写十几行代码,我就要仿真通过,无非就是设置断点、单步执行、全速执行,只要有错误,很快就发现,AVR单片机用自制的JTAG仿真器仿真,虽然难用一些,也总比没有要好,没有硬件仿真器,我宁愿不编程序,查错效率实在是太低了。 |
觉得是你P1=a[n]; 这里出了问题了吧 P1=a[n];这里的话数据只显示了一瞬间就被P0=c[x-1];取代 这两行之间插入一个延时就可以了。 if(j==0) { P1=a[n]; delay5ms(x); } P0=c[x-1]; delay5ms(x); |
既然j=0,那么肯定j==0,被C编译器优化掉不执行这条语句,这是废话语句,C编译器不是傻瓜。你硬要执行,把优化等级降到最低,或者用 volatile定义j。 |
可能是单片机的驱动坏了 |
可能j==0这个条件不符合? |
zhanghyg 发表于 2019-5-25 15:17 这是源程序: #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code KEY_TABLE[]={0x11,0x21,0x12,0x22}; uchar code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code b[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; uchar code c[]={0xfe,0xfd,0xfb,0xf7,0xef}; void delay5ms(uint x) { uchar t,ms; ms=25*x; while(ms--) for(t=0;t<120;t++); } void delays() { uint s=10000;while(s--); } void main() { uchar n,x,temp,key,num,i,j; n=0; x=5; j=0; for(;;) { if(j==0) { P1=a[n]; } P0=c[x-1]; delay5ms(x); n=n+1; if(n==8) n=0; P3=0xf0; if(P3!=0xf0) { delays();P3=0xf0; if(P3!=0xf0) { temp=P3; P3=0x0f; key=temp|P3; key=0xff-key; for(i=0;i<4;i++) { if(key==KEY_TABLE) { num=i; break; } } if(num==0) j=0; if(num==1) j=n; if(num==2) x=x-1; if(num==3) x=x+1; } } } } 为什么这时的P1不能正常输出??? |
f是不是溢出了 |
有可能是变量类型问题。。你试试把变量改成int型。或者改成:j=0x00;if(0x00==j){ P1=0xfe;}。当然,有用到P1,include单片机头文件。 |
这要结合完整程序来看 |