# Import the base class from ht16k33.ht16k33 import HT16K33 class HT16K33SegmentBig(HT16K33): """ Micro/Circuit Python class for the Adafruit 1.2-in 4-digit, 7-segment LED matrix backpack and equivalent Featherwing. Bus: I2C Author: Tony Smith (@smittytone) License: MIT Copyright: 2023 """ # *********** CONSTANTS ********** HT16K33_SEGMENT_COLON_ROW = 0x04 HT16K33_SEGMENT_MINUS_CHAR = 0x10 HT16K33_SEGMENT_DEGREE_CHAR = 0x11 HT16K33_SEGMENT_SPACE_CHAR = 0x13 COLON_CENTRE = 0x02 COLON_LEFT_UPPER = 0x04 COLON_LEFT_LOWER = 0x08 COLON_LEFT = 0x0C DECIMAL_POINT = 0x10 # The positions of the segments within the buffer POS = (0, 2, 6, 8) # Bytearray of the key alphanumeric characters we can show: # 0-9, A-F, minus, degree CHARSET = b'\x3F\x06\x5B\x4F\x66\x6D\x7D\x07\x7F\x6F\x5F\x7C\x58\x5E\x7B\x71\x40\x63\x00' # *********** CONSTRUCTOR ********** def __init__(self, i2c, i2c_address=0x70): self.buffer = bytearray(16) self.point_pattern = 0x00 super(HT16K33SegmentBig, self).__init__(i2c, i2c_address) # *********** PUBLIC METHODS ********** def set_colon(self, pattern=0x02): """ Set or unset the segment LED display's colon and decimal point lights. This method updates the display buffer, but does not send the buffer to the display itself. Call 'draw()' to render the buffer on the display. Args: patter (int) An integer indicating which elements to light (OR the values required). Default: 0x00 0x00: no colon 0x02: centre colon 0x04: left colon, lower dot 0x08: left colon, upper dot 0x10: decimal point (upper) Returns: The instance (self) """ # Bail on incorrect pattern values assert 0 <= pattern < 0x1F, "ERROR - bad patter passed to set_colon()" self.point_pattern = pattern self.buffer[self.HT16K33_SEGMENT_COLON_ROW] = pattern return self def set_glyph(self, glyph, digit=0): """ Present a user-defined character glyph at the specified digit. Glyph values are 8-bit integers representing a pattern of set LED segments. The value is calculated by setting the bit(s) representing the segment(s) you want illuminated. Bit-to-segment mapping runs clockwise from the top around the outside of the matrix; the inner segment is bit 6: 0 _ 5 | | 1 | | - <----- 6 4 | | 2 | _ | 3 This method updates the display buffer, but does not send the buffer to the display itself. Call 'update()' to render the buffer on the display. Args: glyph (int): The glyph pattern. digit (int): The digit to show the glyph. Default: 0 (leftmost digit). Returns: The instance (self) """ # Bail on incorrect row numbers or character values assert 0 <= digit < 4, "ERROR - Invalid digit (0-3) set in set_glyph()" assert 0 <= glyph < 0x80, "ERROR - Invalid glyph (0x00-0xFF) set in set_glyph()" self.buffer[self.POS[digit]] = glyph & 0x7F return self def set_number(self, number, digit=0): """ Present single decimal value (0-9) at the specified digit. This method updates the display buffer, but does not send the buffer to the display itself. Call 'update()' to render the buffer on the display. Args: number (int): The number to show. digit (int): The digit to show the number. Default: 0 (leftmost digit). Returns: The instance (self) """ # Bail on incorrect row numbers or character values assert 0 <= digit < 4, "ERROR - Invalid digit (0-3) set in set_number()" assert 0 <= number < 10, "ERROR - Invalid value (0-9) set in set_number()" return self.set_character(str(number), digit) def set_character(self, char, digit=0): """ Present single alphanumeric character at the specified digit. Only characters from the class' character set are available: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d ,e, f, -. Other characters can be defined and presented using 'set_glyph()'. This method updates the display buffer, but does not send the buffer to the display itself. Call 'draw()' to render the buffer on the display. Args: char (string): The character to show. digit (int): The digit to show the number. Default: 0 (leftmost digit). has_dot (bool): Whether the decimal point to the right of the digit should be lit. Default: False. Returns: The instance (self) """ # Bail on incorrect row numbers assert 0 <= digit < 4, "ERROR - Invalid digit set in set_character()" char = char.lower() char_val = 0xFF if char == "deg": char_val = self.HT16K33_SEGMENT_DEGREE_CHAR elif char == '-': char_val = self.HT16K33_SEGMENT_MINUS_CHAR elif char == ' ': char_val = self.HT16K33_SEGMENT_SPACE_CHAR elif char in 'abcdef': char_val = ord(char) - 87 elif char in '0123456789': char_val = ord(char) - 48 # Bail on incorrect character values assert char_val != 0xFF, "ERROR - Invalid char string set in set_character()" self.buffer[self.POS[digit]] = self.CHARSET[char_val] return self