การต่อใช้งาน Arduino กับ IC 7HC595 เพื่อแสดงผล 7-segment

ตัวอย่างการต่อใช้งาน การขยายพอร์ต I/O ด้วยการใช้ IC 7HC595 4 ตัวเพื่อรับค่า input เป็นตัวเลข ด้วย Serail Monitor มาแสดงผลด้วย 7-segment 4 หลัก ซึ่งจะคุมด้วยไอซี 7HC595 4 ตัวด้วยกัน ของใครของมัน

การต่อใช้งาน

การต่อ IC 7HC595 เข้ากับ 7-segment

โค้ตที่ใช้


    const int  g_pinCommLatch = 6;
    const int  g_pinClock     = 7;
    const int  g_pinData    = 4;
    byte g_digits [10];
    int g_numberToDisplay = 0;
    const int g_registers = 4;
    byte g_registerArray [g_registers];

    void setup()
    {
      pinMode (g_pinCommLatch, OUTPUT);
      pinMode (g_pinClock, OUTPUT);
      pinMode (g_pinData, OUTPUT);
     
      Serial.begin (56600);
     
      // กำหนดค่าอาร์เรย์หลัก
      // a = 8 b = 4 c = 2 d = 64 e = 32 f = 1 g = 16
      g_digits [0] = 8 + 4 + 2 + 64 + 32 + 1;
      g_digits [1] = 4 + 2;
      g_digits [2] = 8 + 4 + 16 + 32 + 64;
      g_digits [3] = 8 + 4 + 16 + 2 + 64;
      g_digits [4] = 1 + 16 + 4 + 2;
      g_digits [5] = 8 + 1 + 16 + 2 + 64;
      g_digits [6] = 8 + 1 + 16 + 2 + 64 + 32;
      g_digits [7] = 8 + 4 + 2;
      g_digits [8] = 8 + 4 + 2 + 64 + 32 + 1 + 16;
      g_digits [9] = 8 + 4 + 2 + 1 + 16 + 64;
    } 

    // ฟังก์ชั่นง่ายๆในการส่งข้อมูลอนุกรมไปยังรีจิสเตอร์กะอย่างน้อยหนึ่งตัวโดยทำซ้ำย้อนกลับผ่านอาร์เรย์
    // แม้ว่าจะมี g_registers อยู่ แต่อาจไม่ได้ถูกใช้ทั้งหมดดังนั้นจึงเป็นพารามิเตอร์อินพุต
    void sendSerialData (
      byte registerCount, 
      byte *pValueArray)   // อาร์เรย์ของไบต์ที่มี LSByte ในอาร์เรย์ [0]
    {
      // ส่งสัญญาณไปยังยุค 595 เพื่อรับฟังข้อมูล
      digitalWrite (g_pinCommLatch, LOW);
     
      for (byte reg = registerCount; reg > 0; reg--)
      {
        byte value = pValueArray [reg - 1];
  
        for (byte bitMask = 128; bitMask > 0; bitMask >>= 1)
        {
          digitalWrite (g_pinClock, LOW);
          digitalWrite (g_pinData, value & bitMask ? HIGH : LOW); 
          digitalWrite (g_pinClock, HIGH);
        }
      }
      // Signal to the 595s that I'm done sending
      digitalWrite (g_pinCommLatch, HIGH);
    }  // sendSerialData

    // พิมพ์ข้อความระบุอินพุตที่ถูกต้องตามจำนวนรีจิสเตอร์ที่กำหนดจากนั้นใช้อินพุตปัจจุบันทั้งหมด
    void badNumber ()
    {
      int dummy;
     
      Serial.print ("Please enter a number from 0 to ");
      for (int loop = 0; loop < g_registers; loop++)
      {
        Serial.print ("9");
      }
      Serial.println (" inclusive.");
     
      while (Serial.available () > 0)
      {
        dummy = Serial.read ();
       
        // ต้องรับข้อมูลทั้งหมดในครั้งเดียว
        delay (10);
      }
    } //badNumber

    // อ่านตัวเลขจากพีซีโดยไม่มีตัวเลขเกินกว่าจำนวนการลงทะเบียนที่กำหนด
    // หากมีการใส่ค่าตัวเลขไม่ถูกต้องให้แสดงค่าเดิม
    int readNumberFromPC ()
    {
      byte incomingByte;
      int  numberRead;
      byte incomingCount;
     
      if (Serial.available () > 0)
      {
        numberRead = 0;
        incomingCount = 0;
         
        while (Serial.available () > 0)
        {
          incomingByte = Serial.read () - 48;
          incomingCount++;
          if (incomingByte < 0 || incomingByte > 9 || incomingCount > g_registers)
          {
            badNumber ();
            return g_numberToDisplay;
          }
         
          numberRead = 10 * numberRead + incomingByte;
          delay (10);
        }

        Serial.print ("Now displaying: ");
        Serial.println (numberRead, DEC);
        return numberRead;
      }
     
      return g_numberToDisplay;
    } 

    void loop()
    {

      g_numberToDisplay = readNumberFromPC ();
      if (g_numberToDisplay < 10)
      {
        g_registerArray [3] = g_digits [0];
        g_registerArray [2] = g_digits [0];
        g_registerArray [1] = g_digits [0];
        g_registerArray [0] = g_digits [g_numberToDisplay];
      }
      if (g_numberToDisplay < 100)
      {
        g_registerArray [3] = g_digits [0];
        g_registerArray [2] = g_digits [0];
        g_registerArray [1] = g_digits [g_numberToDisplay / 10];
        g_registerArray [0] = g_digits [g_numberToDisplay % 10];
      }
      else if (g_numberToDisplay < 1000)
      {
        g_registerArray [3] = g_digits [0];
        g_registerArray [2] = g_digits [g_numberToDisplay / 100];
        g_registerArray [1] = g_digits [(g_numberToDisplay % 100) / 10];
        g_registerArray [0] = g_digits [g_numberToDisplay % 10];
      }
      else
      {
        g_registerArray [3] = g_digits [g_numberToDisplay / 1000];
        g_registerArray [2] = g_digits [(g_numberToDisplay % 1000) / 100];
        g_registerArray [1] = g_digits [(g_numberToDisplay % 100) / 10];
        g_registerArray [0] = g_digits [g_numberToDisplay % 10];
      }

      sendSerialData (g_registers, g_registerArray);
    } 

การทำงาน

Simulate


อ้างอิง