.. note:: Hello, welcome to the SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community on Facebook! Dive deeper into Raspberry Pi, Arduino, and ESP32 with fellow enthusiasts. **Why Join?** - **Expert Support**: Solve post-sale issues and technical challenges with help from our community and team. - **Learn & Share**: Exchange tips and tutorials to enhance your skills. - **Exclusive Previews**: Get early access to new product announcements and sneak peeks. - **Special Discounts**: Enjoy exclusive discounts on our newest products. - **Festive Promotions and Giveaways**: Take part in giveaways and holiday promotions. 👉 Ready to explore and create with us? Click [|link_sf_facebook|] and join today! 1.1.4 7-segment Display ============================= Introduction -------------- Let's try to drive a 7-segment display to show a figure from 0 to 9 and A to F. Components ---------------- .. image:: img/list_7_segment.png Schematic Diagram --------------------- Connect pin ST_CP of 74HC595 to Raspberry Pi GPIO18, SH_CP to GPIO27, DS to GPIO17, parallel output ports to 8 segments of the LED segment display. Input data in DS pin to shift register when SH_CP (the clock input of the shift register) is at the rising edge, and to the memory register when ST_CP (the clock input of the memory) is at the rising edge. Then you can control the states of SH_CP and ST_CP via the Raspberry Pi GPIOs to transform serial data input into parallel data output so as to save Raspberry Pi GPIOs and drive the display. .. image:: img/schematic_7_segment.png Experimental Procedures -------------------------- **Step 1:** Build the circuit. .. image:: img/image73.png **Step 2:** Go to the folder of the code. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/nodejs/ **Step 3:** Run the code. .. raw:: html .. code-block:: sudo node 7-segment_display.js After the code runs, you'll see the 7-segment display display 0-9, A-F. **Code** .. code-block:: js const Gpio = require('pigpio').Gpio; const segCode = [0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71]; const SDI = new Gpio(17, { mode: Gpio.OUTPUT }); const RCLK = new Gpio(18, { mode: Gpio.OUTPUT }); const SRCLK = new Gpio(27, { mode: Gpio.OUTPUT }); function hc595_shift(dat) { for (let j = 0; j < 8; j++) { let code = 0x80 & (dat << j); if (code != 0) { code = 1; } SDI.digitalWrite(code); SRCLK.trigger(1,1); } RCLK.trigger(1,1); } let index = -1; setInterval(() => { index = (index+1)%16; hc595_shift(segCode[index]); }, 1000); **Code Explanation** .. code-block:: js const segCode = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71]; Define a hexadecimal (common cathode) segment code array from 0 to F. .. code-block:: js const SDI = new Gpio(17, { mode: Gpio.OUTPUT }); const RCLK = new Gpio(18, { mode: Gpio.OUTPUT }); const SRCLK = new Gpio(27, { mode: Gpio.OUTPUT }); Initialize pins 17, 18, and 27 as output mode, and copy them to ``SDI``, ``RCLK``, and ``SRCLK`` respectively. .. code-block:: js function hc595_shift(dat) { for (let j = 0; j < 8; j++) { let code = 0x80 & (dat << j); if (code != 0) { code = 1; } SDI.digitalWrite(code); SRCLK.trigger(1,1); } RCLK.trigger(1,1); } Implement a ``hc595_shift`` function to convert the fields in the array ``segCode`` into numbers and display them on the digital tube. .. code-block:: js let code = 0x80 & (dat << j); if (code != 0) { code = 1; } SDI.digitalWrite(code); Assign the dat data to SDI(DS) by bits. Here we assume dat=0x3f(0011 1111, when j=2, 0x3f will shift right(<<) 2 bits. 1111 1100 (0x3f << 2) & 1000 0000 (0x80) = 1000 0000, is true. At this time, 1 is written to SDI. .. code-block:: js SRCLK.trigger(1,1); Generate a rising edge pulse and move the DS data to the shift register. ``trigger(pulseLen, level)`` * pulseLen - pulse length in microseconds (1 - 100) * level - 0 or 1 Sends a trigger pulse to the GPIO. The GPIO is set to level for pulseLen microseconds and then reset to not level. .. code-block:: js RCLK.trigger(1,1); Generate a rising edge pulse and move the data from the shift register to the storage register. .. code-block:: js let index = -1; setInterval(() => { index = (index+1)%16; hc595_shift(segCode[index]); }, 1000); Finally, use the function ``hc595_shift()`` to convert the fields in ``segCode`` and display them through the digital tube. Phenomenon Picture --------------------------- .. image:: img/image74.jpeg