mothercup/mcm-ddc-ble/inc/app_display.h
evan.liu fb681a4b69 数码管手动管脚控制: dispauto 开关 + dispset 命令 (APP V1.00.33)
- dispauto [on|off]: 关掉自动显示扫描, 7 脚置高阻, 供手动控制
- dispset <pin1-7> [0|1|z]: 手工驱动数码管 pin1~7 (pin1=PB0..pin7=PA6)
- app_display.c: g_disp_auto + display_auto_set/get + display_pin_map,
  display_task 自动关时释放管脚并让出
- 仅 APP 改动, Boot 不动 (仍 V1.00.07)
- docs/开发日志.md: 新增 §61
2026-09-13 09:12:02 +08:00

71 lines
2.1 KiB
C

/**
* @file app_display.h
* @brief YF30137 7-segment display driver.
*
* The YF30137 is a 7-pin Charlieplexed LED module:
* - 5 seven-segment digits (DIG1..DIG5, segments A..G)
* - DIG6 holds two single indicators: A6 = "deg F", B6 = decimal point
*
* A dedicated FreeRTOS task (display_task) scans the module continuously.
* Every other task updates the display simply by calling display_set();
* the scan task only reads the global state and never blocks callers.
*/
#ifndef __APP_DISPLAY_H__
#define __APP_DISPLAY_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include "n32wb03x.h"
/* Display type / unit (controls the DIG6 "deg F" indicator A6) */
#define DISP_TYPE_CELSIUS 0u /* degree C: A6 off */
#define DISP_TYPE_FAHRENHEIT 1u /* degree F: A6 on */
/* Number base for the displayed value */
#define DISP_BASE_DECIMAL 10u
#define DISP_BASE_HEX 16u
/**
* @brief Update what the display should show (read by the scan task).
* @param value floating value to display
* @param type DISP_TYPE_CELSIUS / DISP_TYPE_FAHRENHEIT
* @param base DISP_BASE_DECIMAL (1 decimal place) / DISP_BASE_HEX
* @note Non-blocking; may be called from any task context.
*/
void display_set(float value, uint8_t type, uint8_t base);
/**
* @brief Display driver FreeRTOS task: Charlieplexing scan loop, never returns.
*/
void display_task(void *pvParameters);
/**
* @brief Enable (1) / disable (0) the automatic Charlieplexing scan.
* When disabled the scan task releases all 7 pins to high-impedance
* so another task (e.g. the "dispset" CLI) can drive them manually.
*/
void display_auto_set(uint8_t on);
/**
* @brief @return 1 when the automatic scan is enabled.
*/
uint8_t display_auto_get(void);
/**
* @brief Map a display pin number (1..7) to its GPIO port + pin mask.
* @param pin_no display pin number 1..7 (pin1=PB0 ... pin7=PA6)
* @param port out: GPIO port
* @param pin out: GPIO pin mask
* @return 1 on success, 0 when pin_no is out of range.
*/
int display_pin_map(uint8_t pin_no, GPIO_Module** port, uint16_t* pin);
#ifdef __cplusplus
}
#endif
#endif /* __APP_DISPLAY_H__ */