Thông báo

Collapse
No announcement yet.

Giúp em code keil c 16 led sáng dồn tuần tự.

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giúp em code keil c 16 led sáng dồn tuần tự.

    Có ai biết xin chỉ dùm. Mình muốn led 1 sáng rùi chạy đến led 16 sáng, các led còn lại tắt
    led 1 sáng rùi chạy đến led 15, led 16 vẫn sáng. các led còn lại tắt
    .....cứ như vậy rùi sáng hết 16 led.
    Mình viết như vậy mà nó chạy ko đúng :

    unsigned char code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,
    0xbf,0x7f,0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f,0x3e,
    0x3d,0x3b,0x37,0x2f,0x1f,0x1e,0x1d,0x1b,0x17,0x0f,
    0x0e,0x0d,0x0b,0x07,0x06,0x05,0x03,0x02,0x01,0x00} ;
    for(i=0;i<8;i++)
    {
    P1=code[i];
    delay();

    }

  • #2
    m vẫn chưa hiểu í bạn, có phải bạn muốn led sáng đuổi nhau , hay là sáng dồn.

    Comment


    • #3
      có lẽ theo ý bạn ấy là led 1 sáng các led khác tắt
      sau đó led 2 sáng các led khác tắt
      tiếp tục chạy qua 3 rồi 4....đến 16
      sau đó tiếp tục led 1 sáng... chạy nhưng chỉ đến 15 thôi
      tiếp ... đến 14
      ....
      phải không nào
      nếu muốn 16 led thì bạn phải dùng tới 2 cổng chứ
      giả sử dùng P1 và P3 chẳng hạn

      Comment


      • #4
        Mỗi Port có bao nhiêu bit vậy bạn . Còn 0xfe là nhiêu bit ?

        Comment


        • #5
          Nguyên văn bởi Vinhanboy Xem bài viết
          Mỗi Port có bao nhiêu bit vậy bạn . Còn 0xfe là nhiêu bit ?
          Một port 8 bít, 0xfe cũng 8 bít viết dưới dạng hexa.

          Comment


          • #6
            Ý của bạn là dùng 1 mảng để quét led đúng ko?nhưng t biết thì mỗi port có 8 bit.tức là 1 mảng gồm 1 chiều gồm 8 phần tử,bạn đưa dữ liệu mạng vào dưới dạng mã hex.rồi quét từng port một.ví dụ
            unsigned char ma[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
            ........................
            for(i=0;i<8;i++)
            {
            P0=ma[i];
            delay(thoi gian tre);
            }
            điều khiển các port như vậy.bạn sẽ có tối đa 32 led.
            có cách khác bạn dùng lệnh >> dịch phải,<< dịch trái cũng đc.
            ví dụ :
            count =255;

            for (i=1;i<=8;++i)
            {
            P0= count;
            count =count >> 1;
            delay();
            }
            bạn thử xem sao.

            Comment


            • #7
              Nguyên văn bởi Thái Tuế_vy Xem bài viết
              Ý của bạn là dùng 1 mảng để quét led đúng ko?nhưng t biết thì mỗi port có 8 bit.tức là 1 mảng gồm 1 chiều gồm 8 phần tử,bạn đưa dữ liệu mạng vào dưới dạng mã hex.rồi quét từng port một.ví dụ
              unsigned char ma[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
              ........................
              for(i=0;i<8;i++)
              {
              P0=ma[i];
              delay(thoi gian tre);
              }
              điều khiển các port như vậy.bạn sẽ có tối đa 32 led.
              có cách khác bạn dùng lệnh >> dịch phải,<< dịch trái cũng đc.
              ví dụ :
              count =255;

              for (i=1;i<=8;++i)
              {
              P0= count;
              count =count >> 1;
              delay();
              }
              bạn thử xem sao.
              được bằng niềm tin à

              Comment


              • #8
                bạn thử xem nhé
                Code:
                #include <reg51.h>
                //Ngo Hung Cuong
                unsigned char a,c,d;
                unsigned char i,j,t,k;
                void delay(void);
                void delay50ms(void);
                void main()
                {
                	//khoi tao cho bo dinh thoi 0
                	//dau tien tat tat ca cac led
                	TMOD=1;
                	tiep:
                	P1=0xff;
                	a=0xff;//tat ca cac led tat
                	delay();
                	for(i=0;i<8;++i)
                	{
                		d=0xff;
                		for(j=0;j<i;++j)
                			d>>=1;
                		a=0xff;
                		for(j=0;j<8-i;++j)
                		{
                			a<<=1;
                			c=0;
                			for(k=0;k<j;++k)
                			{
                				c<<=1;
                				c|=1;
                			}
                			a|=c;
                			a&=d;
                			P1=a;
                			delay();
                		}
                	}
                	goto tiep;
                }
                void delay50ms(void)
                {
                	//tre khoang 50ms
                	TR0=0;
                	TL0=0xb0;
                	TH0=0x3c;
                	TF0=0;
                	TR0=1;
                	while(!TF0);
                	TR0=0;
                	TF0=0;
                }
                void delay(void)
                {
                	//tre 500ms
                	for(t=0;t<10;++t)
                		delay50ms();
                }
                code thử với 8 led
                với 16 led bạn làm tương tự nha
                hi
                Last edited by kidteam; 16-03-2012, 00:47.

                Comment


                • #9
                  code với 16 led luôn nhé
                  sử dụng P1 và P3
                  Code:
                  #include <reg51.h>
                  //Ngo Hung Cuong
                  unsigned int a,c,d,b;
                  unsigned char vp1,vp3;
                  unsigned char i,j,t,k;
                  void delay(void);
                  void delay50ms(void);
                  void main()
                  {
                  	//khoi tao cho bo dinh thoi 0
                  	//dau tien tat tat ca cac led
                  	TMOD=1;
                  	tiep:
                  	P1=0xff;
                  	P3=0xff;
                  	a=0xffff;//tat ca cac led tat
                  	delay();
                  	for(i=0;i<16;++i)
                  	{
                  		d=0xffff;
                  		for(j=0;j<i;++j)
                  			d>>=1;
                  		a=0xffff;
                  		for(j=0;j<16-i;++j)
                  		{
                  			a<<=1;
                  			c=0;
                  			for(k=0;k<j;++k)
                  			{
                  				c<<=1;
                  				c|=1;
                  			}
                  			a|=c;
                  			a&=d;
                  			vp1=(char)a;
                  			b=a;
                  			b>>=8;
                  			vp3=(char)b;
                  			P1=vp1;
                  			P3=vp3;
                  			
                  			delay();
                  		}
                  	}
                  	goto tiep;
                  }
                  void delay50ms(void)
                  {
                  	//tre khoang 50ms
                  	TR0=0;
                  	TL0=0xb0;
                  	TH0=0x3c;
                  	TF0=0;
                  	TR0=1;
                  	while(!TF0);
                  	TR0=0;
                  	TF0=0;
                  }
                  void delay(void)
                  {
                  	//tre 500ms
                  	for(t=0;t<10;++t)
                  		delay50ms();
                  }

                  Comment


                  • #10
                    Nguyên văn bởi kidteam Xem bài viết
                    bạn thử xem nhé
                    Code:
                    #include <reg51.h>
                    //Ngo Hung Cuong
                    unsigned char a,c,d;
                    unsigned char i,j,t,k;
                    void delay(void);
                    void delay50ms(void);
                    void main()
                    {
                    	//khoi tao cho bo dinh thoi 0
                    	//dau tien tat tat ca cac led
                    	TMOD=1;
                    	tiep:
                    	P1=0xff;
                    	a=0xff;//tat ca cac led tat
                    	delay();
                    	for(i=0;i<8;++i)
                    	{
                    		d=0xff;
                    		for(j=0;j<i;++j)
                    			d>>=1;
                    		a=0xff;
                    		for(j=0;j<8-i;++j)
                    		{
                    			a<<=1;
                    			c=0;
                    			for(k=0;k<j;++k)
                    			{
                    				c<<=1;
                    				c|=1;
                    			}
                    			a|=c;
                    			a&=d;
                    			P1=a;
                    			delay();
                    		}
                    	}
                    	goto tiep;
                    }
                    void delay50ms(void)
                    {
                    	//tre khoang 50ms
                    	TR0=0;
                    	TL0=0xb0;
                    	TH0=0x3c;
                    	TF0=0;
                    	TR0=1;
                    	while(!TF0);
                    	TR0=0;
                    	TF0=0;
                    }
                    void delay(void)
                    {
                    	//tre 500ms
                    	for(t=0;t<10;++t)
                    		delay50ms();
                    }
                    code thử với 8 led
                    với 16 led bạn làm tương tự nha
                    hi
                    Anh có thể nói rõ hơn về thuật toán của bài này không! Tại em quy định 0 là tắt nên không hiểu lắm. Với lại kí hiệu nàya|=c;
                    a&=d;d>>=1; là gì! Em mới viết nên mới biết dùng mảng viết những cái đơn giản thôi! Còn cái này thì thua!

                    Comment


                    • #11
                      trời
                      mình quy định 0 là bật (VĐK hút dòng)
                      a|=c đây là phép or
                      a&=d đây là phép and
                      còn d>>=1 đây là phép dịch phải

                      Comment


                      • #12
                        Cam on tat ca moi nguoi. dac biet bai viet cua Kidteam rat de hieu. quan trong la viet 2 port chay lien tiep.

                        Comment


                        • #13
                          Nguyên văn bởi kidteam Xem bài viết
                          trời
                          mình quy định 0 là bật (VĐK hút dòng)
                          a|=c đây là phép or
                          a&=d đây là phép and
                          còn d>>=1 đây là phép dịch phải
                          Vậy mình muốn thêm 1 port nữa mình sửa vậy đúng ko bạn:

                          #include <reg51.h>
                          //Ngo Hung Cuong
                          unsigned int a,c,d,b,l;
                          unsigned char vp1,vp3,vp2;
                          unsigned char i,j,t,k;
                          void delay(void);
                          void delay50ms(void);
                          void main()
                          {
                          //khoi tao cho bo dinh thoi 0
                          //dau tien tat tat ca cac led
                          TMOD=1;
                          tiep:
                          P1=0xff;
                          P3=0xff;
                          P2=0xff;
                          a=0xffffff;//tat ca cac led tat
                          delay();
                          for(i=0;i<24;++i)
                          {
                          d=0xffffff;
                          for(j=0;j<i;++j)
                          d>>=1;
                          a=0xffffff;
                          for(j=0;j<24-i;++j)
                          {
                          a<<=1;
                          c=0;
                          for(k=0;k<j;++k)
                          {
                          c<<=1;
                          c|=1;
                          }
                          a|=c;
                          a&=d;
                          vp1=(char)a;
                          b=a;
                          b>>=8;
                          vp3=(char)b;
                          l=b;
                          l>>=8;
                          vp2=(char)l;

                          P1=vp1;
                          P3=vp3;
                          P2=vp2;
                          delay();

                          Comment


                          • #14
                            1 port nữa thì bạn làm tương tự thôi
                            dùng kiểu long
                            ok

                            Comment


                            • #15
                              Nguyên văn bởi kidteam Xem bài viết
                              1 port nữa thì bạn làm tương tự thôi
                              dùng kiểu long
                              ok
                              mjnh da lam dc rui. cam oin ban. ma hjnh nhu muon cho no chay nguoc lai tu led 24 ve led1 thi phai doi nhu nao ban nhj?

                              Comment

                              Về tác giả

                              Collapse

                              phongxh Tìm hiểu thêm về phongxh

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X