lcd: Add support to Holtek HT16K33 as 14-segment display controller

This commit is contained in:
Alan C. Assis 2021-06-05 17:16:02 -03:00 committed by Xiang Xiao
parent 68f19a6290
commit 54134507ff
4 changed files with 1408 additions and 0 deletions

View File

@ -1451,6 +1451,36 @@ config LCD_ST7032
connected to a pull-up resistor and the pin SHLC is connected to connected to a pull-up resistor and the pin SHLC is connected to
the ground. So only I2C pins SDA and SCL are used by NuttX. the ground. So only I2C pins SDA and SCL are used by NuttX.
config LCD_HT16K33
bool "Holtek HT16K32 4 Digits 14-Segment Display"
default n
depends on I2C
---help---
Enable support for Holtek HT16K33 (and Vinka VK16K33) 4 Digits
14-Segment module: 0.54" 14-segment LED HT16K32 Backpack.
if LCD_HT16K33
config LCD_HT16K33_MULT_MODULE
bool "Enable support to multiple modules as a single display"
default n
depends on I2C
---help---
It is possible to connect many HT16K33 modules with sequencial
I2C addresses to work as a single display to support lenght
text strings. The device at the I2C address 0x70 will display the
4 more significant characters, the device 0x71 will display the
previous 4 more significant characters and so on.
config LCD_HT16K33_NUMBER_MODULES
int "Quantity of HT16K33 modules to be used as a single display"
range 1 8
depends on LCD_HT16K33_MULT_MODULE
---help---
Quantity of sequential modules to be used to create a single
display. We can have up to 8 to I2C Addresses: 0x70 - 0x77.
endif # LCD_HT16K33
endif # SLCD endif # SLCD
comment "Other LCD-related Devices" comment "Other LCD-related Devices"

View File

@ -146,6 +146,10 @@ endif
ifeq ($(CONFIG_LCD_ST7032),y) ifeq ($(CONFIG_LCD_ST7032),y)
CSRCS += st7032.c CSRCS += st7032.c
endif endif
ifeq ($(CONFIG_LCD_HT16K33),y)
CSRCS += ht16k33_14seg.c
endif
endif # CONFIG_SLCD endif # CONFIG_SLCD
# Other LCD-related devices # Other LCD-related devices

1153
drivers/lcd/ht16k33_14seg.c Normal file

File diff suppressed because it is too large Load Diff

221
include/nuttx/lcd/ht16k33.h Normal file
View File

@ -0,0 +1,221 @@
/****************************************************************************
* include/nuttx/lcd/ht16k33.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __INCLUDE_NUTTX_LEDS_HT16K33_H
#define __INCLUDE_NUTTX_LEDS_HT16K33_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/fs/ioctl.h>
/* Configuration
* CONFIG_I2C - Enables support for SPI drivers
* CONFIG_LCD_HT16K33 - Enables support for the HT16K33 driver
*/
#if defined(CONFIG_I2C) && defined(CONFIG_LCD_HT16K33)
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* HT16K33 Address */
#define HT16K33_I2C_ADDR 0x70
/* Default contrast */
#define DEFAULT_CONTRAST 0xf
#define HT16K33_CONTRAST_MIN 0
#define HT16K33_CONTRAST_MAX 15
/* HT16K33 register addresses */
#define HT16K33_DISP_DATA_ADDR 0x00 /* Display Data Address Pointer: 0x00-0x0f */
#define HT16K33_SYSTEM_SETUP 0x20 /* System Setup: bit 0 = System Oscilator */
#define HT16K33_KEY_DATA_ADDR 0x40 /* Key Data Address Pointer: 0x00-0x07 */
#define HT16K33_INT_FLAG_ADDR 0x60 /* INT Flag Address */
#define HT16K33_DISPLAY_SETUP 0x80 /* DISPLAY Setup */
#define HT16K33_ROW_INT_SET 0xa0 /* ROW/INT set */
#define HT16K33_DIMMING_SET 0xe0 /* Dimming set */
#define HT16K33_TEST_MODE 0xd9 /* Holtek Test Mode */
/* Bits and flags definitions */
#define SYSTEM_SETUP_OSC_ON (1 << 0) /* Turn ON the Oscillator */
#define DISPLAY_SETUP_DISP_ON (1 << 0) /* Display ON */
#define DISPLAY_SETUP_BLINK_SHIFT 1
#define DISPLAY_SETUP_BLINK_MASK (3 << DISPLAY_SETUP_BLINK_SHIFT)
# define DISPLAY_SETUP_BLINK_OFF (0 << DISPLAY_SETUP_BLINK_SHIFT)
# define DISPLAY_SETUP_BLINK_2HZ (1 << DISPLAY_SETUP_BLINK_SHIFT)
# define DISPLAY_SETUP_BLINK_1HZ (2 << DISPLAY_SETUP_BLINK_SHIFT)
# define DISPLAY_SETUP_BLINK_0P5HZ (3 << DISPLAY_SETUP_BLINK_SHIFT)
#define DIMMING_SHIFT 0
#define DIMMING_MASK (0xf << DIMMING_SHIFT)
#define DIMMING_DUTY(N) ((N - 1) << DIMMING_SHIFT)
/* This 14-segment mapping comes from Dave Madison's LED-Segment-ASCII
* released under MIT license:
* https://github.com/dmadison/LED-Segment-ASCII
*/
static const uint16_t asciito14seg[96] =
{
0x0000, /* (space) */
0x4006, /* ! */
0x0202, /* " */
0x12ce, /* # */
0x12ed, /* $ */
0x3fe4, /* % */
0x2359, /* & */
0x0200, /* ' */
0x2400, /* ( */
0x0900, /* ) */
0x3fc0, /* * */
0x12c0, /* + */
0x0800, /* , */
0x00c0, /* - */
0x4000, /* . */
0x0c00, /* / */
0x0c3f, /* 0 */
0x0406, /* 1 */
0x00db, /* 2 */
0x008f, /* 3 */
0x00e6, /* 4 */
0x2069, /* 5 */
0x00fd, /* 6 */
0x0007, /* 7 */
0x00ff, /* 8 */
0x00ef, /* 9 */
0x1200, /* : */
0x0a00, /* ; */
0x2440, /* < */
0x00c8, /* = */
0x0980, /* > */
0x5083, /* ? */
0x02bb, /* @ */
0x00f7, /* A */
0x128f, /* B */
0x0039, /* C */
0x120f, /* D */
0x0079, /* E */
0x0071, /* F */
0x00bd, /* G */
0x00f6, /* H */
0x1209, /* I */
0x001e, /* J */
0x2470, /* K */
0x0038, /* L */
0x0536, /* M */
0x2136, /* N */
0x003f, /* O */
0x00f3, /* P */
0x203f, /* Q */
0x20f3, /* R */
0x00ed, /* S */
0x1201, /* T */
0x003e, /* U */
0x0c30, /* V */
0x2836, /* W */
0x2d00, /* X */
0x00ee, /* Y */
0x0c09, /* Z */
0x0039, /* [ */
0x2100, /* \ */
0x000f, /* ] */
0x2800, /* ^ */
0x0008, /* _ */
0x0100, /* ` */
0x1058, /* a */
0x2078, /* b */
0x00d8, /* c */
0x088e, /* d */
0x0858, /* e */
0x14c0, /* f */
0x048e, /* g */
0x1070, /* h */
0x1000, /* i */
0x0a10, /* j */
0x3600, /* k */
0x0030, /* l */
0x10d4, /* m */
0x1050, /* n */
0x00dc, /* o */
0x0170, /* p */
0x0486, /* q */
0x0050, /* r */
0x2088, /* s */
0x0078, /* t */
0x001c, /* u */
0x0810, /* v */
0x2814, /* w */
0x2d00, /* x */
0x028e, /* y */
0x0848, /* z */
0x0949, /* { */
0x1200, /* | */
0x2489, /* } */
0x0cc0, /* ~ */
0x0000, /* (del) */
};
/****************************************************************************
* Public Types
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Name: ht16k33_register
*
* Description:
* Initialize the HT16K33 device as a LEDS interface.
*
* Input Parameters:
* spi - An instance of the SPI interface to use to communicate
* with the HT16K33.
* devno - Device number to identify current display.
*
* Returned Value:
* Zero (OK) on success; a negated errno value on failure.
*
****************************************************************************/
struct i2c_master_s; /* Forward reference */
int ht16k33_register(int devno, FAR struct i2c_master_s *i2c);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* CONFIG_I2C && CONFIG_HT16K33 */
#endif /* __INCLUDE_NUTTX_LEDS_HT16K33_H */