TLC59284驱动及应用

说明:本程序硬件电路为三个TLC59284串联使用,注意锁存使用否则IO动作会错乱,仅供参考
//定义器件操作IO
#define SPI_SCK(x) (x)?GPIO_SetBits(GPIOB, GPIO_Pin_3):GPIO_ResetBits(GPIOB, GPIO_Pin_3)
#define SPI_MOSI(x) (x)?GPIO_SetBits(GPIOB, GPIO_Pin_5):GPIO_ResetBits(GPIOB, GPIO_Pin_5)
#define SPI_MISO GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_4)
#define TLC59284_LAT(x) (x)?GPIO_SetBits(GPIOB, GPIO_Pin_6):GPIO_ResetBits(GPIOB, GPIO_Pin_6)
#define TLC59284_EN(x) (x)?GPIO_SetBits(GPIOB, GPIO_Pin_7):GPIO_ResetBits(GPIOB, GPIO_Pin_7)
//定义三个TLC59284数据数组,0xAAAA做校验使用
uint16_t TLC59284_Status[4]={0,0,0,0xAAAA};
//定义单个TLC59284根据某一通道转换到16bits的数据和
int TLC59284_Set_Data(uint8_t channel,uint8_t SIN_NUM)
{
uint16_t temp;
temp=1<<channel;
TLC59284_Status[SIN_NUM-1]&=(~temp);
TLC59284_Status[SIN_NUM-1]|=temp;
return TLC59284_Status[SIN_NUM-1];
}
int TLC59284_Reset_Data(uint8_t channel,uint8_t SIN_NUM)
{
uint16_t temp;
temp=1<<channel;
TLC59284_Status[SIN_NUM-1]&=(~temp);
return TLC59284_Status[SIN_NUM-1];
}
//写数据到TLC59284
void TLC59284_SIN(uint16_t SIN_DATA,uint8_t SIN_NUM)
{
uint8_t i,DATA_LAT=3;
uint16_t temp;
TLC59284_Status[SIN_NUM-1]=SIN_DATA;
SPI_SCK(0);
for(i=0;i<64;i++)
{
if(i%16= =0)temp=TLC59284_Status[DATA_LAT–];
if(temp&0x8000)SPI_MOSI(1); //SPI_MOSI
else SPI_MOSI(0);
SPI_SCK(1);
SPI_SCK(0);
temp<<=1;
}
TLC59284_LAT(1); //开锁存
TLC59284_LAT(0);
}
//使用实例
if(Relay_Number<0||Relay_Number>47){printf(“Relay_Number Error\r\n”);TLC59284_EN(1);return -1;}
TLC59284_EN(0);
if(Relay_Number>=0&&Relay_Number<=15)
{
sin_num=1;
if(Relay_Value= =1)sin_data=TLC59284_Set_Data(Relay_Number,sin_num);
else if(Relay_Value= =0)sin_data=TLC59284_Reset_Data(Relay_Number,sin_num);
TLC59284_SIN(sin_data,sin_num);
}
else if(Relay_Number>=16&&Relay_Number<=31)
{
sin_num=2;
if(Relay_Value= =1)sin_data=TLC59284_Set_Data(Relay_Number-16,sin_num);
else if(Relay_Value= =0)sin_data=TLC59284_Reset_Data(Relay_Number-16,sin_num);
TLC59284_SIN(sin_data,sin_num);
}
else if(Relay_Number>=32&&Relay_Number<=47)
{
sin_num=3;
if(Relay_Value= =1)sin_data=TLC59284_Set_Data(Relay_Number-32,sin_num);
else if(Relay_Value==0)sin_data=TLC59284_Reset_Data(Relay_Number-32,sin_num);
TLC59284_SIN(sin_data,sin_num);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TLC6983是一款常见的LED驱动芯片,可以驱动多达16个LED灯。以下是一个简单的TLC6983驱动程序示例,该程序使用Arduino平台。 ```c++ #include <SPI.h> //定义TLC6983寄存器地址 #define REG_CONTROL 0x00 #define REG_PWM 0x01 #define REG_GRAD 0x02 #define REG_BRIGHT 0x03 //定义TLC6983芯片控制引脚 #define TLC6983_LE 10 #define TLC6983_CLK 13 #define TLC6983_SDI 11 //定义TLC6983芯片数据长度 #define TLC6983_DATA_LENGTH 32 //TLC6983控制字节 #define CONTROL_BYTE 0x96 //TLC6983控制字节所在的位置 #define CONTROL_BYTE_INDEX 0 //TLC6983 PWM数据所在的位置 #define PWM_INDEX 1 //TLC6983灰度级数据所在的位置 #define GRAD_INDEX 3 //TLC6983亮度数据所在的位置 #define BRIGHT_INDEX 5 //TLC6983驱动程序初始化函数 void tlc6983_init() { //设置TLC6983控制引脚模式 pinMode(TLC6983_LE, OUTPUT); pinMode(TLC6983_CLK, OUTPUT); pinMode(TLC6983_SDI, OUTPUT); //初始化SPI通信 SPI.begin(); //禁止TLC6983芯片 digitalWrite(TLC6983_LE, HIGH); } //TLC6983芯片数据发送函数 void tlc6983_send_data(uint8_t *data, uint8_t length) { //开始SPI传输 SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0)); //禁止TLC6983芯片 digitalWrite(TLC6983_LE, HIGH); //依次发送每个字节 for (int i = 0; i < length; i++) { SPI.transfer(data[i]); } //使能TLC6983芯片 digitalWrite(TLC6983_LE, LOW); //结束SPI传输 SPI.endTransaction(); } //TLC6983芯片设置函数 void tlc6983_set(uint16_t pwm, uint8_t grad, uint8_t bright) { //定义TLC6983芯片数据缓冲区 uint8_t data[TLC6983_DATA_LENGTH]; //初始化数据缓冲区 for (int i = 0; i < TLC6983_DATA_LENGTH; i++) { data[i] = 0x00; } //设置TLC6983控制字节 data[CONTROL_BYTE_INDEX] = CONTROL_BYTE; //设置TLC6983 PWM数据 data[PWM_INDEX] = (pwm >> 8) & 0xFF; data[PWM_INDEX + 1] = pwm & 0xFF; //设置TLC6983灰度级数据 data[GRAD_INDEX] = grad; //设置TLC6983亮度数据 data[BRIGHT_INDEX] = bright; //发送数据到TLC6983芯片 tlc6983_send_data(data, TLC6983_DATA_LENGTH); } ``` 以上是一个简单的TLC6983驱动程序示例,该程序只是一个基础示例,实际使用时需要根据具体的应用场景进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值