收藏官网首页
查看: 10617|回复: 0

【转载】板载资源 之 RGB led

跳转到指定楼层
楼主
发表于 2015-8-26 16:52:54 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
注册成为机智云开发者,手机加虚拟设备快速开发
帖子链接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






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表