#include<reg52.h>
#include<stdio.h>
typedef unsigned char BYTE;
#define uint unsigned int
//------------------------------------------
//数据口定义
sbit SDO=P1^1; //P1.0 为数据输出口
sbit SCLK=P1^2; //P1.1 为位移输出口
//------------------------------------------
//延时子函数,单位:ms
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
//-----------------------------------------------------------------------------
//传输1个点的数据,包括1位“1”起始位,5位B,5位R,5位G(RGB顺序根据硬件安排决定)
void LED_Senddata(BYTE db,BYTE dr,BYTE dg)
{
BYTE j,mask;
//输出1个 1起始位
SDO=1;SCLK=1;SCLK=0; //送起始位'1'
//输出5位蓝色灰度值
mask=0x10; //数据从高位开始移入(bit5)
for(j=0;j<5;j++)
{ if(mask&db)SDO =1;
else SDO=0;
SCLK=1;SCLK=0;
mask>>=1;
}
//输出5位红色灰度值
mask=0x10;
for(j=0;j<5;j++)
{ if(mask&dr)SDO =1;
else SDO=0;
SCLK=1;SCLK=0;
mask>>=1;
}
//输出5位绿色灰度值
mask=0x10;
for(j=0;j<5;j++)
{ if(mask&dg)SDO =1;
else SDO=0;
SCLK=1;SCLK=0;
mask>>=1;
}
}
//==================================================================
//主函数
//把所要的花式分解为状态
//每个状态首先送32位“0”作起始帧,
//然后根据每个点的颜色依次传送点数据(16位,调用LED_Senddata()完成)
//数据传送完成后输入点数脉冲(有多少个点就要输入多少个脉冲)启动电路
main()
{
BYTE i;
while(1)
{
//状态1:显示一个红色点
SCLK = 0;
SDO = 0;
for(i=0;i<32;i++) {SCLK=1;SCLK=0;} //送起始32bits 0起始帧
LED_Senddata(0,10,0);
SDO=0;
SCLK=1;SCLK=0; //补1个CLOCK,如果一次送出了n个点的数据,则需要补n个Clock.
Delay_xms(500);//显示0.5s
//状态2:显示一个绿色点
SCLK = 0;
SDO = 0;
for(i=0;i<32;i++) {SCLK=1;SCLK=0;} //送起始32bits 0起始帧
LED_Senddata(0,0,10);
SDO=0;
SCLK=1;SCLK=0; //补1个CLOCK,如果一次送出了n个点的数据,则需要补n个Clock.
Delay_xms(500);//显示0.5s
//状态3:显示一个兰色点
SCLK = 0;
SDO = 0;
for(i=0;i<32;i++) {SCLK=1;SCLK=0;} //送起始32bits 0起始帧
LED_Senddata(10,0,0);
SDO=0;
SCLK=1;SCLK=0; //补1个CLOCK,如果一次送出了n个点的数据,则需要补n个Clock.
Delay_xms(500);//显示0.5s
}
}
评论10