第三,认真看完了上面的三个图片,接下来就应该写程序了:
其它的就不去讲了,只说说与RGB灯有关的部分。
1、宏定义对应引脚的置位和重置操作,这样比较方便操作(PA0,PB8和PB9都要配置为输出)。
#define SCL_0 GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define SCL_1 GPIO_SetBits(GPIOB,GPIO_Pin_8)
#define SDA_0 GPIO_ResetBits(GPIOB,GPIO_Pin_9)
#define SDA_1 GPIO_SetBits(GPIOB,GPIO_Pin_9)
2、观察P9813的时序及通讯协议图,写出程序如下:
void RGB_Write_Data(u8 R,u8 G,u8 B)//为方便记住,三个参数的顺序为R G B;
{
u32 RGB_Data = 0;//定义一个32位的数据,各字节对应到P9813的寄存器,方便操作
u8 i; //循环计数
//以下为 组合数据:
RGB_Data |= 0xC0000000; //将最高两位的标志位置1,。
RGB_Data |= ((u32)((~B) & 0xc0)) << 22; //将数据B按位取反后,再与0xC0按位与,得到B的最高两位的反码,然后强制转换成u32类型,最后装入RGB_Data的对应位。
RGB_Data |= ((u32)((~G) & 0xc0)) << 20;//与数据B的处理相同
RGB_Data |= ((u32)((~R) & 0xc0)) << 18;//
与数据B的处理相同
RGB_Data |= ((u32)B) << 16;//强制转换后移入对应位
RGB_Data |= ((u32)G) << 8;//
强制转换后移入对应位
RGB_Data |= R; //最低8位直接按位或
//以下为 数据组合好后写入P9813:
for (i=0;i<32;i++)
{
if ((RGB_Data & 0x80000000) != 0)//取得RGB数据中的最高位
SDA_1;
else
SDA_0;
RGB_Data <<= 1;
SCL_0;
SCL_1;
}
//写入32个0的起始帧,在使用过程中,给我的感觉是,上面的RGB数据是在一个缓存器中,执行下面的写0操作后,RGB的数据就移入了P9813有效寄存器中。所以就把这三十二0放在后面。
SDA_0;
for (i=0; i<32; i++)
{
SCL_0;
SCL_1;
}
}
试验结果:
调试过程中的RGB组合后的数据:
红色灯: