|
帖子链接http://bbs.elecfans.com/forum.ph ... eid%26typeid%3D1185
帖子作者:qq416296378
仔细了解了看了下电路图0.0
对RGBled进行了一下了解,之前使用的3色led是都是引脚直接引出 接在板子上的那种,当然也有自己焊的小玩具0.0呃
而在gokit 上是使用P9813,P9813是一款全彩点光源 LED 驱动芯片
电路图如下:
P9813的规格书,(PS:找到规格书但是没有太多的资料,不过也很简单0.0)
P9813规格书_普_.pdf (335.5 KB, 下载次数: 0)
首先看下手册里的资料
先是引脚图
引脚作用
时序图
这也就说明这个led芯片很好控制0.0
按找时序也不用做什么设置 操作就好了
下面看下代码0.0呃也没什么难度
void ClkProduce(void)
{
SCL_LOW; // SCL=0
LED_delay(40);
SCL_HIGH; // SCL=1
LED_delay(40);
}
目的是产生一个上升沿,手册规定,DIN要在CIN上升沿写入,
void Send32Zero(void)
{
unsigned char i;
SDA_LOW; // SDA=0
for (i=0; i<32; i++)
ClkProduce();
}
发送32位的0 起始帧
uint8_t TakeAntiCode(uint8_t dat)
{
uint8_t tmp = 0;
tmp=((~dat) & 0xC0)>>6;
return tmp;
}
这个也函数也只是取下反码,呃前两位的反码,芯片设计的时序就是 先起始位(俩1)然后
RGB各个前两位的反码然后才是RGB的灰度值
void DatSend(uint32_t dx)
{
uint8_t i;
for (i=0; i<32; i++)
{
if ((dx & 0x80000000) != 0)
{
SDA_HIGH; // SDA=1;
}
else
{
SDA_LOW; // SDA=0;
}
dx <<= 1;
ClkProduce();
}
}
发送32位的任意数据,
void DataDealWithAndSend(uint8_t r, uint8_t g, uint8_t b)
{
uint32_t dx = 0;
dx |= (uint32_t)0x03 << 30; // The front of the two bits 1 is flag bits
dx |= (uint32_t)TakeAntiCode(g) << 28;
dx |= (uint32_t)TakeAntiCode(b) << 26;
dx |= (uint32_t)TakeAntiCode(r) << 24;
dx |= (uint32_t)g << 16;
dx |= (uint32_t)b << 8;
dx |= r;
DatSend(dx);
}
整理RGB显示色彩数据的函数,由于芯片规定由2个1作为起始位
所以发送数据的开头是连个1,然后RGB反码 然后RGB灰度,(起始位 2 + 校验位 2*3 + 灰度 8*3 =32 位)
void RGB_LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
LED_RGB_Control(0,0,0);
Delay_ms(100);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
}
初始化(无非就是 STM32的IO初始化)
void LED_RGB_Control(uint8_t R, uint8_t G, uint8_t B)
{
Send32Zero();
DataDealWithAndSend(R, G, B); // display red
DataDealWithAndSend(R, G, B); // display red
// printf("LED_R = %d LED_G = %d LED_B = %d",R,G,B);
}
显示色彩0.0,名字是对应好的
呃基本上RGB 的控制就这样0.0
|
|