Thông báo

Collapse
No announcement yet.

Ai có thể chỉ giúp em cách dùng 74hc595 để quét LED 7 thanh

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

  • Ai có thể chỉ giúp em cách dùng 74hc595 để quét LED 7 thanh

    Em muốn dùng 595 để quét 6 con LED 7 nhưng loay hoay ko biết làm cách nào để on rồi off trên từng chân 595 nối với LED 7.Các bác giúp cho em đoạn Code on off chắc em hiểu luôn.
    Mobile: 0914.658.856
    Yahoo: quang85_2004

  • #2
    Nguyên văn bởi vuquangpsoc Xem bài viết
    Em muốn dùng 595 để quét 6 con LED 7 nhưng loay hoay ko biết làm cách nào để on rồi off trên từng chân 595 nối với LED 7.Các bác giúp cho em đoạn Code on off chắc em hiểu luôn.
    Tưởng gì! chip AT đây mà! Dễ ợt!

    Nhưng mà mình không biết!

    Bạn xem cái file kèm theo nhé!

    Nó trong cái này:
    http://www.attiny.com/7segments.htm
    Attached Files

    Comment


    • #3
      Nguyên văn bởi mrgiang99 Xem bài viết
      Tưởng gì! chip AT đây mà! Dễ ợt!

      Nhưng mà mình không biết!

      Bạn xem cái file kèm theo nhé!

      Nó trong cái này:
      http://www.attiny.com/7segments.htm
      cảm ơn anh nhiều.
      Mobile: 0914.658.856
      Yahoo: quang85_2004

      Comment


      • #4
        Dùng 6 con 595.
        Cách kết nối:
        - Các chân shcp và stcp nối chung với nhau và nối vào vi điều khiển.
        - Chân DS của 595 đầu tiên nối vào một chân của vi điều khiển để đưa dữ liệu dạng nối tiếp ra ngoài.
        - Chân DS của 595 thứ 2 nối vào chân D7' của 595 thứ nhất.
        - Chân DS của 595 thứ 3 nối vào chân D7' của 595 thứ 2.
        ....................
        - Chân DS của 595 thứ 6 nối vào chân D7' của 595 thứ 5.
        Đây là một ví dụ để dịch giá trị của biến data ra các chân D0-->D7 của 595.
        void shift_out(unsigned char data)
        {
        unsigned char i;
        unsigned int k;
        k=128;
        for(i=0;i<8;i++)
        {
        if((data & k)==k)
        DS=1;
        else
        DS=0;
        SHCP=0;
        SHCP=1;

        STCP=1;
        STCP=0;
        k >>= 1;
        }
        }

        Comment


        • #5
          Nguyên văn bởi hungnp Xem bài viết
          Dùng 6 con 595.
          Cách kết nối:
          - Các chân shcp và stcp nối chung với nhau và nối vào vi điều khiển.
          - Chân DS của 595 đầu tiên nối vào một chân của vi điều khiển để đưa dữ liệu dạng nối tiếp ra ngoài.
          - Chân DS của 595 thứ 2 nối vào chân D7' của 595 thứ nhất.
          - Chân DS của 595 thứ 3 nối vào chân D7' của 595 thứ 2.
          ....................
          - Chân DS của 595 thứ 6 nối vào chân D7' của 595 thứ 5.
          Đây là một ví dụ để dịch giá trị của biến data ra các chân D0-->D7 của 595.
          Anh hungnp cho em hỏi em làm như sau có đúng ko.
          shift_out(dữ liệu cho LED 6);
          shift_out(dữ liệu cho LED 5);
          shift_out(dữ liệu cho LED 4);
          shift_out(dữ liệu cho LED 3);
          shift_out(dữ liệu cho LED 2);
          shift_out(dữ liệu cho LED 1);
          led6=1;delay_us(500);led6=0;
          led5=1;delay_us(500);led5=0;
          led4=1;delay_us(500);led4=0;
          led3=1;delay_us(500);led3=0;
          led2=1;delay_us(500);led2=0;
          led1=1;delay_us(500);led1=0;
          với led6,....,led1 là các chân Anode chung của các led.Em nghĩ là phải xuất dữ liệu cho 595 liên tục như trên mới đc và dữ liệu đầu tiên xuất sẽ nằm ở con 595 cuối cùng đúng ko anh.
          với 595 thì ko làm theo kiểu này đc đúng ko anh?
          shift_out(dữ liệu cho LED 6);
          led6=1;delay_us(500);led6=0;
          shift_out(dữ liệu cho LED 5);
          led5=1;delay_us(500);led5=0;
          ..........................
          led1=1;delay_us(500);led1=0;
          shift_out(dữ liệu cho LED 1);
          Rất mong anh cho ý kiến.
          Mobile: 0914.658.856
          Yahoo: quang85_2004

          Comment


          • #6
            Không hiểu bạn định quét led hay cấp nguồn cố định?
            Nếu cấp nguồn cố định led bạn dùng phải là led đơn. Các Anode của led được nối lên nguồn qua một trở hạn dòng còn 7 Katot của led và dot được nối vào 8 chân song song của 595.
            Nếu dùng pp Quét led thì mạch in sẽ đơn giản hơn, Không cần dùng 595, Nhưng viết code sẽ vất vả hơn nếu chip phải làm nhiều nhiệm vụ.

            Comment


            • #7
              Nguyên văn bởi hungnp Xem bài viết
              Không hiểu bạn định quét led hay cấp nguồn cố định?
              Nếu cấp nguồn cố định led bạn dùng phải là led đơn. Các Anode của led được nối lên nguồn qua một trở hạn dòng còn 7 Katot của led và dot được nối vào 8 chân song song của 595.
              Nếu dùng pp Quét led thì mạch in sẽ đơn giản hơn, Không cần dùng 595, Nhưng viết code sẽ vất vả hơn nếu chip phải làm nhiều nhiệm vụ.
              Vì em muốn quét LED 7 thanh mà anh em muốn quét 20 con LED 7 thanh cơ nếu ko dùng 595 thì ko đủ chân vì em còn fải dùng chân VĐK làm việc khác nữa.Lần trước em cứ nghĩ là dùng 595 nối vào Anode hoặc Cathode chung của LED 7 thanh để on/off cơ nhưng em thấy mọi người toàn hướng dẫn là dùng 595 để xuất dữ liệu nếu xuất dữ liệu thì cũng tiết kiệm được chân.Anh xem kỹ lại thắc mắc của em bên trên.Em rất cảm ơn anh.Em nghĩ anh có thể giúp đc em mà.
              Mobile: 0914.658.856
              Yahoo: quang85_2004

              Comment


              • #8
                Nguyên văn bởi vuquangpsoc Xem bài viết
                Vì em muốn quét LED 7 thanh mà anh em muốn quét 20 con LED 7 thanh cơ nếu ko dùng 595 thì ko đủ chân vì em còn fải dùng chân VĐK làm việc khác nữa.Lần trước em cứ nghĩ là dùng 595 nối vào Anode hoặc Cathode chung của LED 7 thanh để on/off cơ nhưng em thấy mọi người toàn hướng dẫn là dùng 595 để xuất dữ liệu nếu xuất dữ liệu thì cũng tiết kiệm được chân.Anh xem kỹ lại thắc mắc của em bên trên.Em rất cảm ơn anh.Em nghĩ anh có thể giúp đc em mà.
                Thế này bạn ạ, thường đã dùng 595 để hiển thị LED 7 thanh thì ít ai dùng PP quét cả. Vì mỗi con 595 - 8 cổng ra nối luôn 8 LED của LED 7 thanh rồi, 20 con LED 7 thanh thì hết 20 con 595. Nối tiếp data 3 con này lại , CLK và STR nối chung. Như vậy VĐK chỉ tốn có 3 chân mà code lại gọn, trong lúc hiển thị giá trị hiện tại thì VĐK vẫn làm được việc khác.

                Còn nếu bạn vẫn muốn dùng 595 để quét LED - giảm chân nối với VĐK thì bạn làm như sau:
                -1 con 595 nối 8 cổng ra // với 8 LED của 20 con LED 7 thanh.
                -3 con 595 có 24 cổng ra - bạn dùng 20 cổng để làm on-off chọn LED ( có thể thêm transitor).
                cả 4 con này nối tiếp nhau, con 595 để nối // với 20 LED 7 thanh có thể đặt ở đầu hoặc cuối dẫy 595.
                trong VĐK bạn làm bộ đệm 4 byte, Mỗi lần quét bạn đặt lại byte dữ liệu và các byte chọn LED (on-off) và dùng 4 lần shift_out để đưa dữ liệu ra. Bạn lặp 20 lần là quét đủ 20 LED-hix tốn thời gian lắm đấy.
                Ví dụ: con 595 để nối // với 20 LED 7 thanh đặt ở đầu
                cho sáng con LED đầu- dữ liệu xếp như sau:
                10101010b(dữ liệu),0,0,00000001b
                cho sáng con LED 2- dữ liệu xếp như sau:
                10101000b(dữ liệu),0,0,00000010b

                ....

                email:mahaco@fpt.vn

                Comment


                • #9
                  Nguyên văn bởi hoctro89xxx Xem bài viết
                  Thế này bạn ạ, thường đã dùng 595 để hiển thị LED 7 thanh thì ít ai dùng PP quét cả. Vì mỗi con 595 - 8 cổng ra nối luôn 8 LED của LED 7 thanh rồi, 20 con LED 7 thanh thì hết 20 con 595. Nối tiếp data 3 con này lại , CLK và STR nối chung. Như vậy VĐK chỉ tốn có 3 chân mà code lại gọn, trong lúc hiển thị giá trị hiện tại thì VĐK vẫn làm được việc khác.

                  ....
                  Vậy cách thông thường mà anh nói là cách này đúng ko anh?
                  Dùng 6 con 595.
                  Cách kết nối:
                  - Các chân shcp và stcp nối chung với nhau và nối vào vi điều khiển.
                  - Chân DS của 595 đầu tiên nối vào một chân của vi điều khiển để đưa dữ liệu dạng nối tiếp ra ngoài.
                  - Chân DS của 595 thứ 2 nối vào chân D7' của 595 thứ nhất.
                  - Chân DS của 595 thứ 3 nối vào chân D7' của 595 thứ 2.
                  ....................
                  - Chân DS của 595 thứ 6 nối vào chân D7' của 595 thứ 5.
                  Đây là một ví dụ để dịch giá trị của biến data ra các chân D0-->D7 của 595.
                  Vậy còn chân Anode/Cathode chung thì vẫn sử dụng như phương pháp quét thông thường hả anh mỗi chân chung nối với Tranzitor rồi nối với VĐK hả anh?
                  Mobile: 0914.658.856
                  Yahoo: quang85_2004

                  Comment


                  • #10
                    Bạn xem hình vẽ nhé.
                    Attached Files

                    Comment


                    • #11
                      e hiểu ý a là dùng tín hiệu nối tiếp (qua 1 chân) để hiển thị led nhưng vẫn dùng phương pháp quét chứ gì, làm thế làm gì cho phức tạp, sợ thiếu chân thì gắn thêm con mega8 nữa vào thực hiện riêng việc quét led cho thoải mái mà tốc độ lại nhanh, hơn nữa mình dễ dàng thay đổi (mềm)
                      Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

                      Comment


                      • #12
                        Anh hungnp ơi
                        Em đã hiểu cách nối anh nói rồi như vậy là bi h em chỉ cần dùng shift_out() để xuất dữ liệu ra thôi đúng ko anh.
                        nếu dùng con 6 LED 7thanh thì xuất dữ liệu như thế này ạ
                        shift_out(dữ liệu cho LED 1);
                        delay_ms(100);//chẳng hạn
                        shift_out(dữ liệu cho LED 2);
                        delay_ms(100);
                        shift_out(dữ liệu cho LED 3);
                        delay_ms(100);
                        shift_out(dữ liệu cho LED 4);
                        delay_ms(100);
                        shift_out(dữ liệu cho LED 5);
                        delay_ms(100);
                        shift_out(dữ liệu cho LED 6);
                        delay_ms(100);
                        dữ liệu cho LED1 sẽ nằm ở con 595 cuối cùng còn dữ liệu cho LED6 sẽ nằm ở con 595 đầu tiên có chân DS nối với VĐK.Em hiểu thế này đã đúng chưa các anh.Em là người mới nên hỏi hơi nhiều mong mọi người thông cảm.Rất cảm ơn mọi người về sự giúp đỡ.
                        Last edited by vuquangpsoc; 25-10-2008, 22:18.
                        Mobile: 0914.658.856
                        Yahoo: quang85_2004

                        Comment


                        • #13
                          Nguyên văn bởi vuquangpsoc Xem bài viết
                          Anh hungnp ơi
                          Em đã hiểu cách nối anh nói rồi như vậy là bi h em chỉ cần dùng shift_out() để xuất dữ liệu ra thôi đúng ko anh.
                          nếu dùng con 6 LED 7thanh thì xuất dữ liệu như thế này ạ
                          shift_out(dữ liệu cho LED 1);
                          delay_ms(100);//chẳng hạn
                          shift_out(dữ liệu cho LED 2);
                          delay_ms(100);
                          shift_out(dữ liệu cho LED 3);
                          delay_ms(100);
                          shift_out(dữ liệu cho LED 4);
                          delay_ms(100);
                          shift_out(dữ liệu cho LED 5);
                          delay_ms(100);
                          shift_out(dữ liệu cho LED 6);
                          delay_ms(100);
                          dữ liệu cho LED1 sẽ nằm ở con 595 cuối cùng còn dữ liệu cho LED6 sẽ nằm ở con 595 đầu tiên có chân DS nối với VĐK.Em hiểu thế này đã đúng chưa các anh.Em là người mới nên hỏi hơi nhiều mong mọi người thông cảm.Rất cảm ơn mọi người về sự giúp đỡ.
                          để dễ hiểu thì bạn nên làm cách này, dùng 1 port của VDK dể out data, còn mấy con 959 thì bạn cho nối vào chân anod hoặc catot của led 7 thanh, nếu bạn quét 20 led thì cần 3 con 595, cách quét thế này, đầu tiên bạn xuất data của led 1 ra port trước rồi sau đó cho dịch bit chọn led (có thể là 0 hoặc 1) vào rồi delay khoảng 50ms. rồi tiép tục xuất data của led 2 rồi cấp xung cho 959 dịch tiếp 1 lần rồi lại delay, rồi tiếp tục xuất data của led 3 rồi cấp xung cho 595 dịch tiếp...... đến con led thứ 20 xong bạn chỉ cần xóa dữ liệu trên các con 595 là được. thế là có thể quét được 20 con rồi. nếu bạn muón tiết kiệm chân của VDK nữa thì bạn thay việc xuất data ra port bằng cách thêm 1 con 959 rồi xuất data nối tiếp như cách xuất ở trên như vậy bạn cần tất cả 4 con 595 để quét được 20 con led 7 thanh và 4 chân của VDk, đây là cách tiết kiệm nhất rồi đấy. có thể thay con 595 bằng con 4094, con này dễ sử dụng và dễ mua hơn. chúc bạn thành công nhé.
                          hãy cố gắng dù vướn phải thất bại!!!!!!!!

                          Comment


                          • #14
                            Nguyên văn bởi vuquangpsoc Xem bài viết
                            Anh hungnp ơi
                            Em đã hiểu cách nối anh nói rồi như vậy là bi h em chỉ cần dùng shift_out() để xuất dữ liệu ra thôi đúng ko anh.
                            nếu dùng con 6 LED 7thanh thì xuất dữ liệu như thế này ạ
                            shift_out(dữ liệu cho LED 1);
                            delay_ms(100);//chẳng hạn
                            shift_out(dữ liệu cho LED 2);
                            delay_ms(100);
                            shift_out(dữ liệu cho LED 3);
                            delay_ms(100);
                            shift_out(dữ liệu cho LED 4);
                            delay_ms(100);
                            shift_out(dữ liệu cho LED 5);
                            delay_ms(100);
                            shift_out(dữ liệu cho LED 6);
                            delay_ms(100);
                            dữ liệu cho LED1 sẽ nằm ở con 595 cuối cùng còn dữ liệu cho LED6 sẽ nằm ở con 595 đầu tiên có chân DS nối với VĐK.Em hiểu thế này đã đúng chưa các anh.Em là người mới nên hỏi hơi nhiều mong mọi người thông cảm.Rất cảm ơn mọi người về sự giúp đỡ.
                            Trong hình vẽ của mình không sử dụng cho phương pháp quét led mà là cấp áp cố định cho led vì thế trong code cũng không delay_ms(100) mà dữ liệu được xuất ra liên tục. Byte đầu tiên sẽ được dịch ra con IC 595 cuối cùng.
                            Nếu chương trình của bạn phải làm nhiều nhiệm vụ khác thì nên sử dụng pp này, nó vừa tiết kiệm chân cho vi điều khiển, vi điều khiển làm các việc khác mà không ảnh hưởng đến led(Led không nháy). Tuy nhiên, sẽ tốn nhiều IC và mạch cũng cồng kềnh hơn, Tùy vào ứng dụng của bạn để chọn pp nào cho hợp lý. Nếu dùng pp quét thì làm như bài viết phía trên.

                            Comment


                            • #15

                              mình làm theo mạch vẽ bên trên, code đơn giản thử cái cho nó hiện từ 0..9 rồi quay lại 0
                              Code:
                              /*****************************************************
                              This program was produced by the
                              CodeWizardAVR V1.25.9 Standard
                              Automatic Program Generator
                              © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
                              http://www.hpinfotech.com
                              
                              Project : 
                              Version : 
                              Date    : 4/6/2009
                              Author  : HoangNQ                         
                              Company : hn                              
                              Comments: 
                              
                              
                              Chip type           : ATmega8
                              Program type        : Application
                              Clock frequency     : 8.000000 MHz
                              Memory model        : Small
                              External SRAM size  : 0
                              Data Stack size     : 256
                              *****************************************************/
                              
                              #include <mega8.h>
                              #include <delay.h>                   
                              #define DS	PORTC.0
                              #define SHCP	PORTC.1
                              #define STCP	PORTC.2
                              
                              void shift_out(unsigned char data)
                              {
                              	unsigned char i;
                              	unsigned int k;
                              	k=128;     //k=1000 0000
                              	for(i=0;i<8;i++)
                              	{
                              		if((data & k)==0)
                              			DS=0;
                              		else
                              			DS=1;
                              			
                              		SHCP=0;
                              		//delay_us(100);
                              		SHCP=1;
                              		
                              		k>>=1;
                              		
                              	} 
                              	STCP=0;
                              	//delay_us(100);      
                                      STCP=1;	
                              }
                              
                              void shift_number(unsigned char x)// Ham dua chu so ra led
                              { 
                                      switch(x) // Tuy thuoc vao bien dau vao ma dua du lieu ra tu 0...9 
                                      {       
                                              case 0: { shift_out(0xC0); break; }  // So 0 
                                              case 1: { shift_out(0xF9); break; }  // So 1 
                                              case 2: { shift_out(0xA4); break; }  // So 2 
                                              case 3: { shift_out(0xB0); break; }  // So 3 
                                              case 4: { shift_out(0x99); break; }  // So 4 
                                              case 5: { shift_out(0x92); break; }  // So 5 
                                              case 6: { shift_out(0x82); break; }  // So 6 
                                              case 7: { shift_out(0xF8); break; }  // So 7 
                                              case 8: { shift_out(0x80); break; }  // So 8 
                                              case 9: { shift_out(0x90); break; }  // So 9                                     
                                      } 
                              }
                              // Declare your global variables here
                              
                              void main(void)
                              {
                              // Declare your local variables here
                                   unsigned char count = 0;
                              // Input/Output Ports initialization
                              // Port B initialization
                              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out 
                              // State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0 
                              PORTB=0x00;
                              DDRB=0x00;
                              
                              // Port C initialization
                              // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                              // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                              PORTC=0x00;
                              DDRC=0x07;
                              
                              // Port D initialization
                              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                              PORTD=0x00;
                              DDRD=0x00;
                              
                              // Timer/Counter 0 initialization
                              // Clock source: System Clock
                              // Clock value: Timer 0 Stopped
                              TCCR0=0x00;
                              TCNT0=0x00;
                              
                              // Timer/Counter 1 initialization
                              // Clock source: System Clock
                              // Clock value: Timer 1 Stopped
                              // Mode: Normal top=FFFFh
                              // OC1A output: Discon.
                              // OC1B output: Discon.
                              // Noise Canceler: Off
                              // Input Capture on Falling Edge
                              // Timer 1 Overflow Interrupt: Off
                              // Input Capture Interrupt: Off
                              // Compare A Match Interrupt: Off
                              // Compare B Match Interrupt: Off
                              TCCR1A=0x00;
                              TCCR1B=0x00;
                              TCNT1H=0x00;
                              TCNT1L=0x00;
                              ICR1H=0x00;
                              ICR1L=0x00;
                              OCR1AH=0x00;
                              OCR1AL=0x00;
                              OCR1BH=0x00;
                              OCR1BL=0x00;
                              
                              // Timer/Counter 2 initialization
                              // Clock source: System Clock
                              // Clock value: Timer 2 Stopped
                              // Mode: Normal top=FFh
                              // OC2 output: Disconnected
                              ASSR=0x00;
                              TCCR2=0x00;
                              TCNT2=0x00;
                              OCR2=0x00;
                              
                              // External Interrupt(s) initialization
                              // INT0: Off
                              // INT1: Off
                              MCUCR=0x00;
                              
                              // Timer(s)/Counter(s) Interrupt(s) initialization
                              TIMSK=0x00;
                              
                              // Analog Comparator initialization
                              // Analog Comparator: Off
                              // Analog Comparator Input Capture by Timer/Counter 1: Off
                              ACSR=0x80;
                              SFIOR=0x00;
                              
                              while (1)
                                    {
                                    // Place your code here         
                                    count++;
                                    if(count>9)
                                      count = 0;
                                    shift_number(count);
                                    delay_ms(100);  
                                    };
                              }
                              chạy trên Proteus thì ok, ko hiểu sao lúc lắp mạch thật nó ko thể hiện đúng được số,thi thoảng mới hiện được 1 số. đã check đi check lại, bảo đảm ko lắp sai chân. Ko biết có phải do linh kiện mua chợ zời nó thế ko (thử 2 con 74HC595 rồi vẫn ko được)

                              nghi ngờ tần số con 595 ko tương thích với cái đoạn lật chân SHCP,STCP , cho thêm cái delay vào nhưng mà tình hình vẫn thế

                              ai chỉ giúp mình với
                              |

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X