问几个单片机C语言菜鸟级问题

[复制链接]
3046|13
 楼主| lanbaobao 发表于 2007-10-26 18:05 | 显示全部楼层 |阅读模式
硬件环境是伟福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;      
               }    
我还是想问第一中方法位什么不行?
我这里所说的行还是不行是通过示波器显示在仿真器的引脚上的波形。

希望给予指点。
 楼主| lanbaobao 发表于 2007-10-26 18:08 | 显示全部楼层

第2种方法中m1取数中,函数中的指针定义变成变量的定义了

第2种方法中m1取数中,函数中的指针定义变成变量的定义了。
grady1125 发表于 2007-10-26 21:00 | 显示全部楼层

^^^^

P1_7 P1_6 P1_5定义了没有?
如果没定义建议用sbit clk=P1^7;sbit st=P1^6;sbit r1=P1^5;
因为r1是定义成位就必须赋以位值了r1=(temp&0x01)&&1:因为temp&0x01貌似一个unsigned char 赋给r1不太合理;
hkap 发表于 2007-10-27 09:20 | 显示全部楼层

r1=(bit)(temp&0x01);



hkap 发表于 2007-10-27 09:22 | 显示全部楼层

teit_cycle(&m1[0]);

 楼主| lanbaobao 发表于 2007-10-27 09:50 | 显示全部楼层

俺这里谢谢各位了

俺这里谢谢各位了。
 楼主| lanbaobao 发表于 2007-10-27 09:53 | 显示全部楼层

回5楼

5楼: teit_cycle(&m1[0]);
书上不是说数组的符号可以代替首地址吗?
hkap 发表于 2007-10-27 10:39 | 显示全部楼层

teit_cycle(&m1[0]);teit_cycle(m1);二者都可以,前者更直观些

ayb_ice 发表于 2007-10-27 15:25 | 显示全部楼层

数组的符号是可以代替首地址,我就用teit_cycle(m1);

赤铸 发表于 2007-10-28 00:25 | 显示全部楼层

数组名作为指针常量指向首地址

不明白这个
void teit_cycle(unsigned char code *p)
……
teit_cycle(m1);
怎么能编译通过?
hotpower 发表于 2007-10-28 00:33 | 显示全部楼层

teit_cycle(m1);teit_cycle(&m1[16]);teit_cycle(&m1[i]);

xqhe 发表于 2007-10-28 00:49 | 显示全部楼层

数组定义错误

  哥哥,你的程序不知有没有编译过,m1定义错误了……………………
还有r1=(bit)(temp&0x01); 应该r1=(temp&0x01);就可以,应该会强行转换的
 楼主| lanbaobao 发表于 2007-10-29 09:29 | 显示全部楼层

编译都能通过,要不怎么仿真呀。

编译都能通过,要不怎么仿真呀。
正确的数组应该怎么定义呀?

12楼: 数组定义错误 

  哥哥,你的程序不知有没有编译过,m1定义错误了……………………
还有r1=(bit)(temp&0x01); 应该r1=(temp&0x01);就可以,应该会强行转换的
 
 
我分析也应该能够强制转换,但仿真器R1脚就是不变化,只有变成上面我说的那样才变化。所以才上来问呀,以上2个问题都疑惑,也可能是仿真器的问题吧。
ayb_ice 发表于 2007-10-29 09:58 | 显示全部楼层

r1=(bit)(temp&0x01); 其中(bit)多此一举

您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部