硬件环境是伟福V8/T仿真器。本来设置上想选用89S51,但总有问题就设置为AT89C51.原本是想写一个LED条屏显示汉字。 先把于问题有关的部分程序列出来。 #define clk P1_7 /*移位时钟脚 */ #define st P1_6 /*锁存脚 */ #define r1 P1_5 //红色数据脚 unsigned char code m1[]= { 0x00,0x3F,0x00,0x08,0x08,0x08,0x08,0x0F, 0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, 0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0xFC, 0x04,0x04,0xF4,0x04,0x04,0x34,0x08,0x00, } void teit_cycle(unsigned char code *p) { unsigned char i=1,j,temp,k; st=0; for(k=0;k<16;k++) { P0=k&0x0f; temp=*p; for(i=0;i<8;i++) { r1=(temp&0x01); clk=0; _nop_(); clk=1; _nop_(); temp=temp>>1; } st=0; _nop_(); st=1; p++; } } void main(void) { while(1) { teit_cycle(m1); }
}
上面程序中我想问的问题有2个,一个是关于取m1中数组的值,我用上面的方法是一个正确的数也没取到。必须要改成下面这个样子才能正确取数 void main(void) { unsigned char i; while(1) { i=0; for(i=0;i<32;i++) { teit_cycle(m1); } }
} 我想问上面的方法为什么行不通,有什么错误。
第2个问题是关于取位变量,也就是第一个程序的r1,按我最上面的程序,r1始终是低电平,把程序改成下面可以按照预计的变化 for(i=0;i<8;i++) { if (temp&0x01) r1=1; else r1=0; clk=0; _nop_(); clk=1; _nop_(); temp=temp>>1; } 我还是想问第一中方法位什么不行? 我这里所说的行还是不行是通过示波器显示在仿真器的引脚上的波形。
希望给予指点。
|