【AT-START-L021测评】点个组合RGB点灯-2
本帖最后由 trucyw 于 2024-12-25 16:41 编辑P9813驱动RGB led,示意图来一波
使用AT32L021的PB7和PA9
#define RGBLED_SCL_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_7)
#define RGBLED_SCL_Set() gpio_bits_set(GPIOB,GPIO_PINS_7)
#define RGBLED_SDA_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_9)
#define RGBLED_SDA_Set() gpio_bits_set(GPIOA,GPIO_PINS_9)
IO已经确认了接下来就需要了解P9813怎么来控制
以上图示可以看出我们显示一个颜色需要发送96个clk,具体解析如下
① 前32 位“0”为起始帧,在Cin 上升沿时打入,并且时序DIN要先于CIN;
② 标志位为两个“1”;
③ 校验数据“B7’”与“B6’”为蓝色灰度数据的“B7”与“B6”的反码;
④ 灰度级数据要高位先入,并且是蓝绿红顺序。
由此可得,MCU需要发送的数据
32位0起始信号: 0000 0000 0000 0000 0000 0000 0000 0000
第一点32位灰度数据: 11B7’B6’ G7’G6’R7’R6’ xxxx xxxx xxxx xxxx xxxx xxxx
第二点32位灰度数据: 11B7’B6’ G7’G6’R7’R6’ xxxx xxxx xxxx xxxx xxxx xxxx
void RGBLED_Show(uint8_t r,uint8_t g,uint8_t b)
{
RGBLED_Send32Zero();//发送前32bit “0”起始帧
RGBLED_DataDealWithAndSend(r, g, b);//第一个32bit灰度数据
RGBLED_DataDealWithAndSend(r, g, b);//第二个32bit灰度数据
}
废话少一些,直接上波形
红色就出来了
其他颜色依此方法同样操作即可
P9813驱动RGB到此就完成了
代码贴一下呗 #ifndef __RGBLED_H
#define __RGBLED_H
#include "at32l021_gpio.h"
//#include "Delay.h"
//////////////////////////////////////////////////////////////////////////////////
//������
//RGBLED��������
//////////////////////////////////////////////////////////////////////////////////
#define RGBLED_SCL_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_7)
#define RGBLED_SCL_Set() gpio_bits_set(GPIOB,GPIO_PINS_7)
#define RGBLED_SDA_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_9)
#define RGBLED_SDA_Set() gpio_bits_set(GPIOA,GPIO_PINS_9)
void RGBLED_config(void);
void RGBLED_SHOW(void);//RGB��IO��ʼ��
void RGBLED_Show(uint8_t r,uint8_t g,uint8_t b);//RGB����ɫ����
#endif
#include "rgbled.h"
#include "Delay.h"
void RGBLED_config(void)
{
gpio_init_type gpio_initstructure;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
//gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_0);
//gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_0);
gpio_default_para_init(&gpio_initstructure);
//RGBLED�ܽų�ʼ��
//din data
gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure.gpio_pins =GPIO_PINS_9;
gpio_initstructure.gpio_pull = GPIO_PULL_DOWN;
gpio_init(GPIOA,&gpio_initstructure);
//cin
gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure.gpio_pins =GPIO_PINS_7;
gpio_initstructure.gpio_pull = GPIO_PULL_UP;
gpio_init(GPIOB,&gpio_initstructure);
RGBLED_SCL_Set();
RGBLED_SDA_Set();
}
//////////////////////////////////////////////////////////////////////////////////
//MB-024
//RGBLED��������
//����ǰ32λ'0'��ʼ֡
void RGBLED_Send32Zero(void)
{
uint8_t i;
RGBLED_SDA_Clr();
for(i=0;i<32;i++)
{
RGBLED_SCL_Clr();//Delay_us(200);
RGBLED_SCL_Set();//Delay_us(200);
}
}
//��תǰ��λ�ĻҶ�ֵ
uint8_t RGBLED_TakeAntiCode(uint8_t dat)
{
uint8_t tmp = 0;
tmp = ((~dat) & 0xC0) >> 6;
return tmp;
}
//���ͻҶ�����
void RGBLED_DatSend(uint32_t dx)
{
uint8_t i;
for(i=0;i<32;i++)
{
if((dx & 0x80000000) !=0)
RGBLED_SDA_Set();
else
RGBLED_SDA_Clr();
dx<<=1;
RGBLED_SCL_Clr();//Delay_us(200);
RGBLED_SCL_Set();///Delay_us(200);
}
}
//���ݴ����뷢��
//r;��ɫֵ 0~255
//g:��ɫֵ 0~255
//b:��ɫֵ 0~255
void RGBLED_DataDealWithAndSend(uint8_t r,uint8_t g,uint8_t b)
{
uint32_t dx=0;
dx |= (uint32_t)0x03 << 30;//ǰ��λ'1'λ��־λ
dx |= (uint32_t)RGBLED_TakeAntiCode(b) << 28;
dx |= (uint32_t)RGBLED_TakeAntiCode(g) << 26;
dx |= (uint32_t)RGBLED_TakeAntiCode(r) << 24;
dx |= (uint32_t)b << 16;
dx |= (uint32_t)g << 8;
dx |= r;
RGBLED_DatSend(dx);//��������
}
//RGB�ƿ��ƺ���
//r;��ɫֵ 0~255
//g:��ɫֵ 0~255
//b:��ɫֵ 0~255
void RGBLED_Show(uint8_t r,uint8_t g,uint8_t b)
{
RGBLED_Send32Zero();//����ǰ32λ'0'��ʼ֡
RGBLED_DataDealWithAndSend(r, g, b);//���͵�һ��32bit�Ҷ�����
RGBLED_DataDealWithAndSend(r, g, b);//���͵ڶ���32bit�Ҷ�����
}
//RGB�Ƴ�ʼ������
void RGBLED_SHOW(void)
{
// RGBLED_config();
RGBLED_Show(255,0,0);//R
Delay_ms(100);
RGBLED_Show(0,255,0);//G
Delay_ms(100);
RGBLED_Show(0,0,255);//B
Delay_ms(100);
RGBLED_Show(255,255,255);//W
Delay_ms(100);
RGBLED_Show(0,0,0);//�ر�RGB��
//while(1);
}
页:
[1]