optical/NxFuncs/keyled/tm1637.h
2025-09-04 09:45:08 +08:00

135 lines
3.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __TM1637_H__
#define __TM1637_H__
#include "config.h"
#ifndef LEDKEY_TM1637
#define LEDKEY_TM1637 0
#endif
// tm1637 提供 8x2键盘 和 6 个8段数码管 的控制
//-----------------------------------------------------------------
/*
-------------------------------------------------------------------------------------------------
| bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
| 命令类型 | 保留为0 | 不同模式定义 |
|-----------------------|-----------------------|-----------------------------------------------|
| | | | | 0 | 0 | 写数据到显示寄存器
| 数据设置 | | | | 1 | 0 | 读键扫数据
| 0 1 | | | 0 | | | 自动地址增加
| | | | 1 | | | 固定地址
| | | 0 | | | | 普通模式
| | | 1 | | | | 测试模式(内部使用)
|-----------------------|-----------------------|-----------------------------------------------|
| | | 0 | 0 | 0 | 0 | 显示地址0
| 地址设置 | | 0 | 0 | 0 | 1 | 显示地址1
| 1 1 | | 0 | 0 | 1 | 0 | 显示地址2
| | | 0 | 0 | 1 | 1 | 显示地址3
| | | 0 | 1 | 0 | 0 | 显示地址4
| | | 0 | 1 | 0 | 1 | 显示地址5
|-----------------------|-----------------------|-----------------------------------------------|
| | | | 0 | 0 | 0 | 设置脉冲宽度为 1/16
| 显示控制 | | | 0 | 0 | 1 | 设置脉冲宽度为 2/16
| 1 0 | | | 0 | 1 | 0 | 设置脉冲宽度为 4/16
| | | | 0 | 1 | 1 | 设置脉冲宽度为 10/16
| | | | 1 | 0 | 0 | 设置脉冲宽度为 11/16
| | | | 1 | 0 | 1 | 设置脉冲宽度为 12/16
| | | | 1 | 0 | 0 | 设置脉冲宽度为 13/16
| | | | 1 | 0 | 1 | 设置脉冲宽度为 14/16
| | | 0 | | | | 显示关
| | | 1 | | | | 显示开
|-----------------------|-----------------------|-----------------------------------------------|
由于该芯片的控制时序和接口协议和标准I2C有差别没有地址字段每个字节的传输顺序不一样 LSB 标准是 MSB,所以本芯片采用软件模拟I2C实现。
*/
//--------------------------
// bit7 bit6 命令类型
#define DATA_CMD_BITS 0x40 // 数据设置命令
#define ADDR_CMD_BITS 0xC0 // 地址设置命令(显示寄存器地址)
#define DISP_CTRL_BITS 0x80 // 显示控制
//--------------------------
// 数据设置命令的定义
// 数据设置命令 bit1 bit0
#define WRITE_LED_REG 0x00 // 写数据到显示寄存器
#define READ_KEY_VAL 0x02 // 读按键命令
// 数据设置命令 bit2
#define ADDR_AUTO_INC 0x00 // 地址自动增加
#define ADDR_FIXED 0x04 // 地址固定
//--------------------------
// 地址设置命令的定义
#define LED_REG_BEG_ADDR 0x00
#define LED_REG1_ADDR (LED_REG_BEG_ADDR+0x00)
#define LED_REG2_ADDR (LED_REG_BEG_ADDR+0x01)
#define LED_REG3_ADDR (LED_REG_BEG_ADDR+0x02)
#define LED_REG4_ADDR (LED_REG_BEG_ADDR+0x03)
#define LED_REG5_ADDR (LED_REG_BEG_ADDR+0x04)
#define LED_REG6_ADDR (LED_REG_BEG_ADDR+0x05)
//--------------------------
// 显示设置命令的定义
#define DISP_OFF 0x00
#define DISP_ON 0x08
#define DISP_LEV(lev) ((lev)&0x07)
//---------------------------------------
// 按键数据, 键值定义 16个按键
#define KEY_NONE 0xFF
#define KEY_K1SG1 0xF7
#define KEY_K1SG2 0xF6
#define KEY_K1SG3 0xF5
#define KEY_K1SG4 0xF4
#define KEY_K1SG5 0xF3
#define KEY_K1SG6 0xF2
#define KEY_K1SG7 0xF1
#define KEY_K1SG8 0xF0
#define KEY_K2SG1 0xEF
#define KEY_K2SG2 0xEE
#define KEY_K2SG3 0xED
#define KEY_K2SG4 0xEC
#define KEY_K2SG5 0xEB
#define KEY_K2SG6 0xEA
#define KEY_K2SG7 0xE9
#define KEY_K2SG8 0xE8
//------------------------------------------------------------------------------
// 读取键值
u8 TM1637ReadKey(void);
// 写显示寄存器(地址自增)
void TM1637WriteLedData(u8 baddr, u8 * pBuff, u8 disp);
// 设置显示模式(开关和亮度)
void TM1637SetLedDisp(u8 disp);
//------------------------------------------------------------------------------
//
#endif