samples: drivers: Add auxdisplay_digits sample
This commit introduces a new sample for the Auxiliary display driver. The sample demonstrates counting from 0 to 1000, with an interval of 100ms between each increment. This sample primarily serves to demonstrate the capabilities of segment displays. Signed-off-by: Chen Xingyu <hi@xingrz.me>
This commit is contained in:
parent
5be38c6996
commit
dc4e259dde
7 changed files with 205 additions and 0 deletions
8
samples/drivers/auxdisplay_digits/CMakeLists.txt
Normal file
8
samples/drivers/auxdisplay_digits/CMakeLists.txt
Normal file
|
@ -0,0 +1,8 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
cmake_minimum_required(VERSION 3.20.0)
|
||||
|
||||
find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
|
||||
project(auxdisplay_digits)
|
||||
|
||||
target_sources(app PRIVATE src/main.c)
|
33
samples/drivers/auxdisplay_digits/README.rst
Normal file
33
samples/drivers/auxdisplay_digits/README.rst
Normal file
|
@ -0,0 +1,33 @@
|
|||
.. zephyr:code-sample:: auxdisplay_digits
|
||||
:name: Auxiliary digits display
|
||||
:relevant-api: auxdisplay_interface
|
||||
|
||||
Output increasing numbers to an auxiliary display.
|
||||
|
||||
Overview
|
||||
********
|
||||
|
||||
This sample demonstrates the use of the
|
||||
:ref:`auxiliary display driver <auxdisplay_api>` for digit-based displays, such
|
||||
as 7-segment displays.
|
||||
|
||||
Building and Running
|
||||
********************
|
||||
|
||||
Note that this sample requires a board with a 7-segment display setup. You can
|
||||
build your own setup by fly-wiring a 7-segment display to any board you have.
|
||||
|
||||
A sample overlay is provided for the ``native_sim`` target. See the overlay file
|
||||
:zephyr_file:`samples/drivers/auxdisplay_digits/boards/native_sim.overlay` for a
|
||||
demonstration.
|
||||
|
||||
.. zephyr-app-commands::
|
||||
:zephyr-app: samples/drivers/auxdisplay_digits
|
||||
:host-os: unix
|
||||
:board: native_sim
|
||||
:goals: build
|
||||
:compact:
|
||||
|
||||
If successful, the display first lights up all segments (e.g., 8.8.8. on a
|
||||
3-digit display), blinks once, sequentially lights up each digit from left to
|
||||
right, and then counts up from 0 to the maximum number that can be displayed.
|
1
samples/drivers/auxdisplay_digits/boards/native_sim.conf
Normal file
1
samples/drivers/auxdisplay_digits/boards/native_sim.conf
Normal file
|
@ -0,0 +1 @@
|
|||
CONFIG_GPIO=y
|
30
samples/drivers/auxdisplay_digits/boards/native_sim.overlay
Normal file
30
samples/drivers/auxdisplay_digits/boards/native_sim.overlay
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* Copyright (c) 2024-2025 Chen Xingyu <hi@xingrz.me>
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
&gpio0 {
|
||||
ngpios = <11>;
|
||||
};
|
||||
|
||||
/ {
|
||||
auxdisplay_0: auxdisplay {
|
||||
compatible = "gpio-7-segment";
|
||||
status = "okay";
|
||||
columns = <3>;
|
||||
rows = <1>;
|
||||
segment-gpios = <&gpio0 0 0>, /* A */
|
||||
<&gpio0 1 0>, /* B */
|
||||
<&gpio0 2 0>, /* C */
|
||||
<&gpio0 3 0>, /* D */
|
||||
<&gpio0 4 0>, /* E */
|
||||
<&gpio0 5 0>, /* F */
|
||||
<&gpio0 6 0>, /* G */
|
||||
<&gpio0 7 0>; /* DP */
|
||||
digit-gpios = <&gpio0 8 0>, /* DIG1 */
|
||||
<&gpio0 9 0>, /* DIG2 */
|
||||
<&gpio0 10 0>; /* DIG3 */
|
||||
refresh-period-ms = <1>;
|
||||
};
|
||||
};
|
2
samples/drivers/auxdisplay_digits/prj.conf
Normal file
2
samples/drivers/auxdisplay_digits/prj.conf
Normal file
|
@ -0,0 +1,2 @@
|
|||
CONFIG_AUXDISPLAY=y
|
||||
CONFIG_LOG=y
|
11
samples/drivers/auxdisplay_digits/sample.yaml
Normal file
11
samples/drivers/auxdisplay_digits/sample.yaml
Normal file
|
@ -0,0 +1,11 @@
|
|||
sample:
|
||||
description: Demonstration of auxdisplay driver for segment displays
|
||||
name: Auxiliary (segment) display sample
|
||||
tests:
|
||||
sample.drivers.auxdisplay_digits:
|
||||
tags: auxdisplay
|
||||
platform_allow:
|
||||
- native_sim
|
||||
integration_platforms:
|
||||
- native_sim
|
||||
build_only: true
|
120
samples/drivers/auxdisplay_digits/src/main.c
Normal file
120
samples/drivers/auxdisplay_digits/src/main.c
Normal file
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* Copyright (c) 2023 Jamie McCrae
|
||||
* Copyright (c) 2024-2025 Chen Xingyu <hi@xingrz.me>
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zephyr/device.h>
|
||||
#include <zephyr/drivers/auxdisplay.h>
|
||||
#include <zephyr/logging/log.h>
|
||||
|
||||
LOG_MODULE_REGISTER(auxdisplay_sample, LOG_LEVEL_DBG);
|
||||
|
||||
#define AUXDISPLAY_NODE DT_NODELABEL(auxdisplay_0)
|
||||
#define AUXDISPLAY_DIGIT_COUNT DT_PROP_LEN(AUXDISPLAY_NODE, digit_gpios)
|
||||
|
||||
static const struct device *const dev = DEVICE_DT_GET(AUXDISPLAY_NODE);
|
||||
static uint8_t data[AUXDISPLAY_DIGIT_COUNT * 2];
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int rc;
|
||||
int i, len;
|
||||
|
||||
if (!device_is_ready(dev)) {
|
||||
LOG_ERR("Auxdisplay device is not ready.");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Light up all segments */
|
||||
for (i = 0; i < AUXDISPLAY_DIGIT_COUNT; i++) {
|
||||
data[i * 2] = '8';
|
||||
data[i * 2 + 1] = '.';
|
||||
}
|
||||
rc = auxdisplay_write(dev, data, strlen(data));
|
||||
if (rc != 0) {
|
||||
LOG_ERR("Failed to write data: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
k_msleep(500);
|
||||
|
||||
/* Blinks it once */
|
||||
|
||||
rc = auxdisplay_display_off(dev);
|
||||
if (rc != 0) {
|
||||
LOG_ERR("Failed to turn display off: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
k_msleep(500);
|
||||
|
||||
rc = auxdisplay_display_on(dev);
|
||||
if (rc != 0) {
|
||||
LOG_ERR("Failed to turn display on: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
k_msleep(500);
|
||||
|
||||
/* Clear the display */
|
||||
|
||||
rc = auxdisplay_clear(dev);
|
||||
if (rc != 0) {
|
||||
LOG_ERR("Failed to clear display: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
k_msleep(500);
|
||||
|
||||
/* Test cursor movement by filling each digit with a number */
|
||||
|
||||
for (i = 0; i < AUXDISPLAY_DIGIT_COUNT; i++) {
|
||||
snprintf(data, sizeof(data), "%d", i);
|
||||
rc = auxdisplay_write(dev, data, strlen(data));
|
||||
if (rc != 0) {
|
||||
LOG_ERR("Failed to write data: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
k_msleep(500);
|
||||
}
|
||||
|
||||
k_msleep(500);
|
||||
|
||||
/* Count from 0 up to fill all digits */
|
||||
|
||||
for (i = 0;; i = (i + 1) % (int)pow(10, AUXDISPLAY_DIGIT_COUNT)) {
|
||||
snprintk(data, sizeof(data), "%d", i);
|
||||
len = strlen(data);
|
||||
|
||||
rc = auxdisplay_clear(dev);
|
||||
if (rc != 0) {
|
||||
LOG_ERR("Failed to clear display: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Right-align the number */
|
||||
rc = auxdisplay_cursor_position_set(dev, AUXDISPLAY_POSITION_ABSOLUTE,
|
||||
AUXDISPLAY_DIGIT_COUNT - len, 0);
|
||||
if (rc != 0) {
|
||||
LOG_ERR("Failed to set cursor position: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = auxdisplay_write(dev, data, len);
|
||||
if (rc != 0) {
|
||||
LOG_ERR("Failed to write data: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
k_msleep(100);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue