侧边栏壁纸
博主头像
塞塞哇 博主等级

开源创客

  • 累计撰写 38 篇文章
  • 累计创建 9 个标签
  • 累计收到 11 条评论

目 录CONTENT

文章目录

PT6315驱动时序代码

塞塞蛙
2023-07-24 / 0 评论 / 0 点赞 / 697 阅读 / 0 字

PT6315驱动源码

本文将讲解和分享下PT6315这款专业VFD驱动芯片的时序驱动代码。

1. PT6315是什么?

PT6315是一种常用的集成电路(IC),主要用于数字控制的LED显示驱动。它被广泛应用于各种VFD显示应用中,特别是在数字仪表板、计时器、电子钟表、家电和汽车仪表等领域。

以下是关于PT6315的一些主要特点和功能:

  1. VFD LED驱动:PT6315具有12个数字输出通道,每个通道最多可以驱动4个共阳极(common-anode)LED或8个共阴极(common-cathode)LED。这使得它适用于各种LED显示需求。

  2. 数字控制:该IC内置了数字控制电路,可以轻松控制LED的亮度、闪烁和显示模式。它支持多种显示效果,例如渐变、闪烁、静态显示等。

  3. 串行通信接口:PT6315采用串行通信接口与主控器通信。这样的设计简化了控制过程,并减少了所需的引脚数量。

  4. 节能特性:该IC采用低功耗设计,具有较高的效率和低待机电流,有助于节约能源和延长电池寿命。

  5. 内置RC振荡器:PT6315内部集成了RC振荡器,因此不需要外部晶体振荡器,简化了设计和布局。

2. 时序与命令

pt6315-pin-cp.webp

驱动代码的操作流程需要根据官方文档的要求去配置实现

从图中可以看出初始化的操作实际上是建议清空缓存区,之后再main的循环中不断刷新写入RAM数据。特别注意的是一定要按照图中的command编号去操作。

2.1 Command2-数据设置命令

数据设置命令执行PT6315的数据写入或数据读取模式。数据设置命令

这个命令是告诉寄存器我们要读取数据还是写入数据,操作LED还是读取KEY按键,如果写的话是连续自增地址写还是固定地址写?

  • b3 设置0为普通模式,1为测试模式。我们选择普通模式设置0

  • b2 设置0为地址自增模式,1为固定地址模式。 没特殊要求我们选择0自增模式

  • b1、b0两位设置读写,00代表写数据操作段位,01写数据操作led、10读取按键数据、11不做任何操作

2.2 Command3-地址设置命令

这个命令是指定要操作的起始地址。 要配合地址表去看

2.3 Command1-显示模式设置命令

这个命令是配置段位的数量 如下说明:

0000 : 4位, 24段

0001 :5位, 23段

0010 : 6位, 22段

0011 : 7位, 21段

0100 : 8位, 20段

0101 : 9位, 19段

0110 : 10位, 18段

0111 : 11位, 17段

1XXX : 12位, 16段

2.4 Command4-显示亮度控制设置命令

  • b3 控制是否打开灯光

  • b2,b1,b0 三位共同控制亮度的占空比 占空比越高亮度越高

3. 代码实操

3.1 头文件定义API方法

/*
 * @Description:
 * @Author: chenzedeng
 * @Date: 2023-07-04 14:33:25
 * @LastEditTime: 2023-07-14 16:17:17
 */

//blog-address: saisaiwa.com

#ifndef __PT6315__
#define __PT6315__

#define PT_PLATFORM ESPMCU

#if PT_PLATFORM == ESPMCU
#include <Arduino.h>
#endif

#define CLK_PIN_GROUP 0
#define CLK_PIN 14
#define DIN_PIN_GROUP 0
#define DIN_PIN 12
#define STB_PIN_GROUP 0
#define STB_PIN 16

#if PT_PLATFORM == ESPMCU

#define CLK_1 digitalWrite(CLK_PIN, HIGH)
#define CLK_0 digitalWrite(CLK_PIN, LOW)
#define DIN_1 digitalWrite(DIN_PIN, HIGH)
#define DIN_0 digitalWrite(DIN_PIN, LOW)
#define STB_1 digitalWrite(STB_PIN, HIGH)
#define STB_0 digitalWrite(STB_PIN, LOW)

#define delay_us(us) delayMicroseconds(us)

#endif

#if PT_PLATFORM == STM32
//todo 自己配置STM32的宏定义
#endif

/**
 * 初始化GPIO
 */
void ptInitGPIO(void);

/**
 * 显示控制命令  COMMANDS 4
 * @param onOff 0显示关闭,1开启显示
 * @param brightnessVal 亮度占空比 0~7调整
 * 000:脉冲宽度= 1/16 0
 * 001:脉冲宽度= 2/16 1
 * 010 :脉冲宽度= 4/16 0x2
 * 011 :脉冲宽度= 10/16 3
 * 100:脉冲宽度= 11/16  4
 * 101 :脉冲宽度= 12/16 0x5
 * 110:脉冲宽度= 13/16 6
 * 111:脉冲宽度= 14/16 0x7
 */
void ptSetDisplayLight(uint8_t onOff, uint8_t brightnessVal);
void setModeWirteDisplayMode(uint8_t addressMode = 0);
void setDisplayMode(uint8_t digit);
void sendDigAndData(uint8_t dig, const uint8_t* data, size_t len);
#endif

方法说明:

  1. 需要先定义三个引脚的配置

  2. Arduino系列的可以直接用上述代码,其他单片机需要自己控制电平饭翻转代码

  3. 程序首次执行初始化引脚执行的方法: ptInitGPIO

  4. ptSetDisplayLight 设置亮度方法有两个参数:onOff是否开启灯光,brightnessVal亮度调节 0~7

  5. setModeWirteDisplayMode 地址模式选择配置,默认0为地址自制模式,1为固定地址模式

  6. setDisplayMode 设置段位分配,详见Command1描述的二进制值,传入16进制数

  7. sendDigAndData 发送显示的RAM数据,dig为选择的段起始地址(详见Command3中的表格),data为要传入的数据数组,len为数组长度

3.2 API实现

/*
 * @Description:
 * @Author: chenzedeng
 * @Date: 2023-07-04 14:33:32
 * @LastEditTime: 2023-07-14 16:12:49
 */
#include "pt6315.h"

void ptInitGPIO(void) {
#if PT_PLATFORM == ESPMCU
    pinMode(CLK_PIN, OUTPUT);
    pinMode(DIN_PIN, OUTPUT);
    pinMode(STB_PIN, OUTPUT);
#endif
}

void writeData(uint8_t data, int delayState = 1) {
    // CLK 上升沿将会读取串行数据,DIN 为低位开始LSB
    // CLK PWCLK (Clock Pulse Width) ≥ 400 ns
    // DIN保持(Data Hold Time) ≥ 100 ns,tsetup (Data Setup Time) ≥ 100 ns  time
    // > 200ns
    CLK_0;
    for (int i = 0; i < 8; i++) {
        delay_us(10);
        if (data & 0x01) {
            DIN_1;
        } else {
            DIN_0;
        }
        delay_us(10);
        CLK_1;
        delay_us(10);
        CLK_0;
        data >>= 1;
    }
    if (delayState) {
        delay_us(10);
    }
}

/**
 * DATA SETTING COMMANDS 2
 * @param addressMode 地址模式 0自增, 1固定地址模式
 */
void setModeWirteDisplayMode(uint8_t addressMode) {
    uint8_t command = 0x40;
    if (addressMode) {
        command |= 0x4;
    }
    STB_1;
    delay_us(10);
    STB_0;
    delay_us(10);
    writeData(command);
    delay_us(10);
    STB_1;
}

/**
 * COMMANDS 1 显示模式设置命令
 * 0000 : 4位, 24段
 * 0001 :5位, 23段
 * 0010 : 6位数字, 22段
 * 0011 : 7位, 21段
 * 0100 : 8位, 20段
 * 0101 : 9位, 19段
 * 0110 : 10位, 18段
 * 0111 : 11位, 17段
 * 1XXX : 12位, 16段
 */
void setDisplayMode(uint8_t digit) {
    STB_1;
    delay_us(10);
    STB_0;
    delay_us(10);
    writeData(digit);
    delay_us(10);
    STB_1;
}

/**
 * 显示控制命令  COMMANDS 4
 * @param onOff 0显示关闭,1开启显示
 * @param brightnessVal 亮度占空比 0~7调整
 * 000:脉冲宽度= 1/16 0
 * 001:脉冲宽度= 2/16 1
 * 010 :脉冲宽度= 4/16 0x2
 * 011 :脉冲宽度= 10/16 3
 * 100:脉冲宽度= 11/16  4
 * 101 :脉冲宽度= 12/16 0x5
 * 110:脉冲宽度= 13/16 6
 * 111:脉冲宽度= 14/16 0x7
 */
void ptSetDisplayLight(uint8_t onOff, uint8_t brightnessVal) {
    uint8_t command = 0x80 | brightnessVal;
    if (onOff) {
        command |= 0x8;
    }
    STB_1;
    delay_us(10);
    STB_0;
    delay_us(10);
    writeData(command);
    delay_us(10);
    STB_1;
}

void sendDigAndData(uint8_t dig, const uint8_t* data, size_t len) {
    STB_1;
    delay_us(10);
    STB_0;
    delay_us(10);
    writeData(0xc0 | dig);
    delay_us(10);
    // 写入数据
    for (size_t i = 0; i < len; i++) {
        writeData(data[i],0);
        // delay_us(10);
    }
    delay_us(10);
    STB_1;
}

注意地址自增模式下单次传输不要局限于8位哦,多少位和你分配多少段位中的位为准,要传满不足要补0;

在上图中给出了,连续自增模式和固定地址模式的时序命令顺序。

如果您对上面的代码有些疑问请加入我们的交流群沟通。

0

评论区