Thông báo

Collapse
No announcement yet.

Giúp đỡ quét led 7 (loại 4 con liền - 12 chân) - có hình minh họa! ^^

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

  • Giúp đỡ quét led 7 (loại 4 con liền - 12 chân) - có hình minh họa! ^^

    Các bác nào có kinh nghiệm quét led 7 đoạn giải thích hộ em kái này!
    Có phải vấn đề nằm ở transistor C1815 không!
    Nếu hiển thị bình thường thì sáng đều 4 con, nếu dùng phương pháp quét led thì chỉ có con thứ tư là sáng nhiều!
    Em pó tay rồi! ?????????
    Attached Files

  • #2
    Đưa code xem thử đi bạn.

    Comment


    • #3
      #include "string.h"
      #include "msp430g2553.h"
      #include <intrinsics.h>

      union reg {
      struct bit {
      unsigned char b0:1;
      unsigned char b1:1;
      unsigned char b2:1;
      unsigned char b3:1;
      unsigned char b4:1;
      unsigned char b5:1;
      unsigned char b6:1;
      unsigned char b7:1;
      }_BIT;
      unsigned char _BYTE;
      };
      union reg* _P1_DIR = (union reg*)0x22 ;
      union reg* _P1_OUT = (union reg*)0x21 ;
      union reg* _P1_IN = (union reg*)0x20 ;

      union reg* _P2_DIR = (union reg*)0x2A ;
      union reg* _P2_OUT = (union reg*)0x29 ;
      union reg* _P2_IN = (union reg*)0x28 ;

      #define GIAY 0x00
      #define PHUT 0x01
      #define GIO 0x02

      #define SCLOUT _P2_OUT->_BIT.b0
      #define SDAIN _P2_IN->_BIT.b1
      #define SDAOUT _P2_OUT->_BIT.b1

      #define L1 _P2_OUT->_BIT.b2
      #define L2 _P2_OUT->_BIT.b3
      #define L3 _P2_OUT->_BIT.b4
      #define L4 _P2_OUT->_BIT.b5

      #define Led _P1_OUT->_BIT.b4

      #define delay_1 nop()
      void nop(void)
      {
      int i=20;
      while(i--);
      }
      volatile unsigned int giay,gio,phut;
      unsigned char maled[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x0 9};
      unsigned int a=0;
      //================================== GIAO TIEP DS1307 ==========================
      void I2C_start(void)
      {
      _P2_DIR->_BIT.b0 =1;
      _P2_DIR->_BIT.b1 =1;
      SDAOUT = 1; SCLOUT = 1;
      delay_1;
      SDAOUT = 0; delay_1;
      SCLOUT = 0; delay_1;
      }
      //--------------------------------------
      void I2C_stop(void)
      {
      _P2_DIR->_BIT.b0 =1;
      _P2_DIR->_BIT.b1 =1;
      SCLOUT = 1; SCLOUT = 0;
      SDAOUT = 0; delay_1;
      SCLOUT = 1; delay_1;
      SDAOUT = 1;
      }
      //-------------------------------------
      unsigned char I2C_write(unsigned char dat)
      {
      _P2_DIR->_BIT.b0 =1;
      _P2_DIR->_BIT.b1 =1;
      unsigned char i;
      for (i=0;i<8;i++)
      {
      SDAOUT = (dat & 0x80) ? 1:0;
      SCLOUT=1;SCLOUT=0;
      dat<<=1;
      }
      SCLOUT = 1; delay_1;
      SCLOUT = 0;
      return dat;
      }
      //--------------------------------------
      unsigned char I2C_read(void)
      {
      _P2_DIR->_BIT.b0 =1;
      _P2_DIR->_BIT.b1 =0;
      char rd_bit;
      unsigned char i, dat;
      dat = 0x00;
      for(i=0;i<8;i++) // Vong lap doc 1 byte du lieu
      {
      delay_1;
      SCLOUT = 1; delay_1;
      rd_bit = SDAIN; // Kiem tra ACK
      dat = dat<<1;
      dat = dat | rd_bit;
      SCLOUT = 0;
      }
      return dat;
      }
      //--------------------------------
      // CAC CHUONG TRINH CON CHO DS1307
      unsigned char DS1307_Read(unsigned char addr)
      {
      unsigned int temp,ret;
      I2C_start(); /* Start i2c bus */
      I2C_write(0xD0); /* Connect to DS1307 */
      I2C_write(addr); /* Request RAM address on DS1307 */
      I2C_start(); /* Start i2c bus */
      I2C_write(0XD1); /* Connect to DS1307 for Read */
      ret = I2C_read(); /* Receive data */
      I2C_stop();
      //************************************************** ********
      temp = ret; //BCD to HEX
      ret = (((ret/16)*10)+ (temp & 0x0f)); //for Led 7seg
      //************************************************** ********
      return ret;
      }
      //--------------------------------------
      void DS1307_Write(unsigned char addr,unsigned char dat)
      {
      unsigned int temp;
      //**********************************************
      temp = dat ; //HEX to BCD
      dat = (((dat/10)*16)|(temp %10)); //for Led 7seg
      //**********************************************
      I2C_start(); /* Start i2c bus */
      I2C_write(0XD0); /* Connect to DS1307 */
      I2C_write(addr); /* Request RAM address on DS1307 */
      I2C_write(dat); /* Connect to DS1307 for Read */
      I2C_stop();
      }
      //--------------------------------------
      void Read_DS1307()
      {
      giay = DS1307_Read(GIAY);
      phut = DS1307_Read(PHUT);
      gio = DS1307_Read(GIO);
      }
      //--------------------------------------
      void Write_DS1307()
      {
      DS1307_Write(GIAY,giay);
      DS1307_Write(PHUT,phut);
      DS1307_Write(GIO,gio);
      }
      //================================== HIEN THI ==================================
      void Hienthi()
      {
      Read_DS1307();
      if(giay%2==0) a=0;
      else a=1;

      L1=0;L2=0;L3=0;L4=0;
      P1OUT=gio/10;
      L1=1;
      __delay_cycles(1000);

      L1=0;L2=0;L3=0;L4=0;
      P1OUT=gio%10;
      Led=a;
      L2=1;
      __delay_cycles(1000);

      L1=0;L2=0;L3=0;L4=0;
      P1OUT=phut/10;
      L3=1;
      __delay_cycles(1000);

      L1=0;L2=0;L3=0;L4=0;
      P1OUT=phut%10;
      L4=1;
      __delay_cycles(1000);
      }
      //========================== CHUONG TRINH CHINH ================================
      void main(void)
      {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;
      BCSCTL1 = CALBC1_1MHZ;
      DCOCTL = CALDCO_1MHZ;

      _P1_DIR->_BYTE = 0xFF;

      _P2_DIR->_BIT.b2 = 1;
      _P2_DIR->_BIT.b3 = 1;
      _P2_DIR->_BIT.b4 = 1;
      _P2_DIR->_BIT.b5 = 1;
      while(1)
      {
      Hienthi();
      }
      }

      Comment


      • #4
        À, mình đã test thử khả năng có thể xảy ra!
        Lạ lùng là với trường hợp đếm từ 0000 đến 9999 với phương pháp quét led thì led 7 sáng đủ 4 con! có nghĩa là trường hợp quét led bị vấn đề là không thể!
        Vậy chả lẻ nào liên quan đến DS1307???
        Thế thì chả biết khắc phục thế nào!

        Comment


        • #5
          Nguyên văn bởi ga_kon Xem bài viết
          Các bác nào có kinh nghiệm quét led 7 đoạn giải thích hộ em kái này!
          Có phải vấn đề nằm ở transistor C1815 không!
          Nếu hiển thị bình thường thì sáng đều 4 con, nếu dùng phương pháp quét led thì chỉ có con thứ tư là sáng nhiều!
          Em pó tay rồi! ?????????
          cái sai đầu tiên là dùng loại bjt pnp chứ ko phải npn . cái thứ 2 là phải có tở 470-1k nối từ vđk ra chân b của bjt . và cái thứ 3 là phải có R330 nối từ chân vđk đến các chân a.b.c.d, của led.




          facebook:

          Comment


          • #6
            quét có tính chu kỳ sao không dùng mảng và vòng lặp cho nó đơn giản hơn không . Vừa dễ đồng bộ vừa dễ kiểm soát !

            --- Hàm đọc ds1307 có thời gian trễ quá dài ... Led 4 được om lâu nên nó sáng nhất cũng là phải thôi !

            ( còn mấy cái sai về mạch điện - transistor , điện trở ... thì chưa nói )
            Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            Đang tải...
            X