SengChuary 发表于 2012-10-31 15:32:08

48路流水灯374扩展流水灯电路仿真,求C怎么控制

有谁写过这个电路的硬件程序,原来的程序是汇编,我看不懂汇编哪位大哥帮帮忙指导一下这个C程序的流水灯程序怎么写,只需要正传15圈后然后反转15圈,可以按扭调流水灯快慢!带仿真和汇编在里面,大家可以仿真一下,这个我是在其它东风找的。

devcang 发表于 2012-10-31 16:15:32

感觉和点阵一样,74154做位选,P0数据

devcang 发表于 2012-10-31 17:40:11

#include<reg51.h>

#define uchar unsigned char
#define uintunsigned int
sbit EN=P3^6;

void delay5ms();
void delay400ms();

void hy4(){//;花样4全亮
        uchar a;
        for(a=0; a<6; a++){
                P2=a;
                P0=0xff;
                P2=0;
        }
}

void hy3(){      //;花样3全灭
        uchar a;
        for(a=0; a<6; a++){
                P2=a;
                P0=0x00;
                P2=0;
        }
}

void hy2(){ //;花样2从左到右亮,然后从右到左灭
                // mov a,#01h
      // mov r6,#6

// hy21:   mov dptr,#0000h
// hy22:   mov r7,#8

// hy2lp:movx @dptr,a
      // setb c
      // rlc a
      // lcall delay5ms
      // djnz r7,hy2lp
      // inc dph
      // djnz r6, hy22
      // lcall delay400ms

      // mov a,#01h
      // mov r6,#6

// hy21a:dec dph
       // ; mov dptr,#0000h
// hy22a:   mov r7,#8

// hy2lpa:movx @dptr,a
      // clr c
      // rrc a
      // lcall delay5ms
      // djnz r7,hy2lpa
      // dec dph
      // djnz r6, hy22a
      // lcall delay400ms
}


void hy1(){//;花样1间隔亮 变换
        uchar a, p;
        for(p=0; p<0x10; p++){
                for(a=0; a<=6; a++){
                        P2=a;
                        if( (p % 2)==0){
                                P0=0xAA;
                        }else{
                                P0=0x55;
                        }
                        P2=0;
                }
                delay400ms();
        }
}

void delay5ms(){ //;延时子程序(5MS)
        uchar i,j;
        for(i=25;i>0;i--){
                for(j=100; j>0; j--){
                        ;
                }
        }
}

//;==============延时400毫秒
void delay400ms(){//;延时子程序(400MS)
        uchar i,j,k;

        for(i=20;i>0;i--){
                for(j=100; j>0; j--){
                        for(k=100; k>0; k--){
                                ;
                        }
                }
        }
}


void main(){
        delay400ms();
        EN=0;
        while(1){
         hy1();         //;间隔亮10次
               delay400ms();
         hy3();         //;全灭
         delay400ms();//;延时
         hy4();         //;全亮
         delay400ms();//;延时
         hy3();         //;全灭
         delay400ms();//;延时
         hy4();         //;全亮
         delay400ms();//
         hy3();         //;全灭
         delay400ms();//
         hy2();         //;从左到右亮,然后从右到左灭
         hy2();         //
        }
}



断断续续修改一下,还有一个函数,没改。

SengChuary 发表于 2012-10-31 18:32:28

devcang 发表于 2012-10-31 17:40 static/image/common/back.gif
#include

#define uchar unsigned char


非常感谢你@@LZ

SengChuary 发表于 2012-10-31 18:41:51

devcang 发表于 2012-10-31 17:40 static/image/common/back.gif
#include

#define uchar unsigned char


不需要按汇编的改为C,可以指导一下就从第1灯开始开始流水死循环15圈完后再反着15圈来回不断的循环怎么写,麻烦你了大哥!

devcang 发表于 2012-10-31 21:43:05

SengChuary 发表于 2012-10-31 18:41 static/image/common/back.gif
不需要按汇编的改为C,可以指导一下就从第1灯开始开始流水死循环15圈完后再反着15圈来回不断的循环怎么写 ...

你按 hy1() 修改一下,差不多了。

SengChuary 发表于 2012-11-1 10:50:21

devcang 发表于 2012-10-31 21:43 static/image/common/back.gif
你按 hy1() 修改一下,差不多了。

想问一下位移应该怎样改,P0口八位移还是按这个片选移,如果选择片选移,是不是每个片选都要按着顺序同步移是吗,不知道我说的对吗?void hy1()
   
        {                     
      uchar a, p;
      for(p=0; p<0x10; p++)
               
                {
                for(a=0; a<=6; a++)
                                {
                        P2=a;
                        if( (p % 2)==0)
                                               
                                {
                        P0=0x00;                                               
                        }
                                                else
                                                {
                         P0=0xff;
                        }
                        P2=0;
                }
                delay400ms();
      }
}

SengChuary 发表于 2012-11-1 16:40:02

devcang 发表于 2012-10-31 21:43 static/image/common/back.gif
你按 hy1() 修改一下,差不多了。

程序改了一下,下面不知道该怎么改了,改的有点不对,也不知道哪里不对:#include<reg51.h>

#define uchar unsigned char
#define uintunsigned int
sbit EN=P3^6;

void delay5ms();
void delay400ms();

void main()
{       
   delay400ms();
      EN=0;
               while(1)
               {
        uint i;
uchar temp,a,p;
P0=temp;
      for(p=0; p<0x10; p++)
                {
         for(a=0; a<=6; a++)
                        {
                           P2=a;
            if( (p % 2)==0)
                               {
                                  temp=0x01;
                for(i=0;i<8;i++)
                   {
                        P0=~temp;
                     delay400ms();
                      //temp<<=1;
                               }
                }
                                }
      }
       }
}

void delay5ms(){ //;延时子程序(5MS)
      uchar i,j;
      for(i=25;i>0;i--){
                for(j=100; j>0; j--){
                        ;
                }
      }
}

//;==============延时400毫秒
void delay400ms(){//;延时子程序(400MS)
      uchar i,j,k;

      for(i=20;i>0;i--){
                for(j=100; j>0; j--){
                        for(k=100; k>0; k--){
                              ;
                        }
                }
      }
}

devcang 发表于 2012-11-2 09:25:07

你还是按 hy1() 修改一下好了,其实,就是使每一个374的灯,从0x1到0xff、延时,再从0xff-(1<<n)(0<n<8)
页: [1]
查看完整版本: 48路流水灯374扩展流水灯电路仿真,求C怎么控制