PT6315驱动源码
本文将讲解和分享下PT6315这款专业VFD驱动芯片的时序驱动代码。
1. PT6315是什么?
PT6315是一种常用的集成电路(IC),主要用于数字控制的LED显示驱动。它被广泛应用于各种VFD显示应用中,特别是在数字仪表板、计时器、电子钟表、家电和汽车仪表等领域。
以下是关于PT6315的一些主要特点和功能:
VFD LED驱动:PT6315具有12个数字输出通道,每个通道最多可以驱动4个共阳极(common-anode)LED或8个共阴极(common-cathode)LED。这使得它适用于各种LED显示需求。
数字控制:该IC内置了数字控制电路,可以轻松控制LED的亮度、闪烁和显示模式。它支持多种显示效果,例如渐变、闪烁、静态显示等。
串行通信接口:PT6315采用串行通信接口与主控器通信。这样的设计简化了控制过程,并减少了所需的引脚数量。
节能特性:该IC采用低功耗设计,具有较高的效率和低待机电流,有助于节约能源和延长电池寿命。
内置RC振荡器:PT6315内部集成了RC振荡器,因此不需要外部晶体振荡器,简化了设计和布局。
2. 时序与命令
驱动代码的操作流程需要根据官方文档的要求去配置实现
从图中可以看出初始化的操作实际上是建议清空缓存区,之后再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
方法说明:
需要先定义三个引脚的配置
Arduino系列的可以直接用上述代码,其他单片机需要自己控制电平饭翻转代码
程序首次执行初始化引脚执行的方法: ptInitGPIO
ptSetDisplayLight 设置亮度方法有两个参数:onOff是否开启灯光,brightnessVal亮度调节 0~7
setModeWirteDisplayMode 地址模式选择配置,默认0为地址自制模式,1为固定地址模式
setDisplayMode 设置段位分配,详见Command1描述的二进制值,传入16进制数
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;
在上图中给出了,连续自增模式和固定地址模式的时序命令顺序。
如果您对上面的代码有些疑问请加入我们的交流群沟通。
评论区