LED点阵设计
硬件部分:
软件部分:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define speed 150 //移动速度
sbit RCLK1=P3^0;
sbit SCLK=P3^1; //A--P1.0 B--P1.1 C--P1.2
sbit SDA=P3^2;
uchar idata disbuf1[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //显示缓冲
uchar idata disbuf2[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
uchar movbuf[8]; //用于移动的缓冲区
uchar code numdata[10][8]={ 0xff,0xe7,0xdb,0xdb,0xdb,0xdb,0xe7,0xff, /* 0 */
0xff,0xf7,0xe7,0xf7,0xf7,0xf7,0xe3,0xff, /* 1 */
0xff,0xe7,0xdb,0xfb,0xf7,0xef,0xc3,0xff, /* 2 */
0xff,0xe7,0xdb,0xf7,0xf7,0xdb,0xe7,0xff, /* 3 */
0xff,0xf7,0xe7,0xd7,0xd7,0xc3,0xf7,0xff, /* 4 */
0xff,0xc3,0xdf,0xe7,0xfb,0xdb,0xe7,0xff, /* 5 */
0xff,0xe7,0xdf,0xc7,0xdb,0xdb,0xe7,0xff, /* 6 */
0xff,0xc3,0xfb,0xf7,0xef,0xef,0xef,0xff, /* 7 */
0xff,0xe7,0xdb,0xe7,0xdb,0xdb,0xe7,0xff, /* 8 */
0xff,0xe7,0xdb,0xdb,0xe3,0xfb,0xe7,0xff }; /* 9 */
/****************************************************************
延时子程序
****************************************************************/
void delay(uchar t)
{
for(t;t<0;t--);
}
/****************************************************************
发送子程序
****************************************************************/
void Send_Byte(uchar d)
{
uchar i = 8;
while( i-- )
{
SCLK = 0;
SDA = (bit)(d&0x80);
d = d<<1;
SCLK = 1;
}
}
/****************************************************************
显示子程序
****************************************************************/
void displed()
{
uchar i,j;
for(i=0;i<speed;i++)
{
for(j=0;j<8;j++)
{
Send_Byte(disbuf1[j]);
Send_Byte(disbuf2[j]);
RCLK1=0;
P1=7-j;
RCLK1=1;
delay(5);
}
}
}
/****************************************************************
左移子程序
****************************************************************/
void leftmove()
{
uchar bitA=0;
uchar i,j;
for(i=0;i<8;i++) //每个数字移8次
{
for(j=0;j<8;j++)
{
disbuf1[j]<<=1;
bitA=disbuf2[j]&0x80; //取高位,即最左边位
if(bitA)disbuf1[j]|=0x01; //移入
disbuf2[j]<<=1;
bitA=movbuf[j]&0x80;
if(bitA)disbuf2[j]|=0x01; //移入
movbuf[j]<<=1;
}
displed();
}
}
/****************************************************************
主程序
****************************************************************/
void main (void)
{
uchar i,j;
while(1)
{
for(i=0;i<10;i++)
{
for(j=0;j<8;j++)
{
movbuf[j]=numdata[i][j];
}
leftmove(); //调用左移子程序 (一个字符送出显示)
}
}
}
#define uchar unsigned char
#define uint unsigned int
#define speed 150 //移动速度
sbit RCLK1=P3^0;
sbit SCLK=P3^1; //A--P1.0 B--P1.1 C--P1.2
sbit SDA=P3^2;
uchar idata disbuf1[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //显示缓冲
uchar idata disbuf2[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
uchar movbuf[8]; //用于移动的缓冲区
uchar code numdata[10][8]={ 0xff,0xe7,0xdb,0xdb,0xdb,0xdb,0xe7,0xff, /* 0 */
0xff,0xf7,0xe7,0xf7,0xf7,0xf7,0xe3,0xff, /* 1 */
0xff,0xe7,0xdb,0xfb,0xf7,0xef,0xc3,0xff, /* 2 */
0xff,0xe7,0xdb,0xf7,0xf7,0xdb,0xe7,0xff, /* 3 */
0xff,0xf7,0xe7,0xd7,0xd7,0xc3,0xf7,0xff, /* 4 */
0xff,0xc3,0xdf,0xe7,0xfb,0xdb,0xe7,0xff, /* 5 */
0xff,0xe7,0xdf,0xc7,0xdb,0xdb,0xe7,0xff, /* 6 */
0xff,0xc3,0xfb,0xf7,0xef,0xef,0xef,0xff, /* 7 */
0xff,0xe7,0xdb,0xe7,0xdb,0xdb,0xe7,0xff, /* 8 */
0xff,0xe7,0xdb,0xdb,0xe3,0xfb,0xe7,0xff }; /* 9 */
/****************************************************************
延时子程序
****************************************************************/
void delay(uchar t)
{
for(t;t<0;t--);
}
/****************************************************************
发送子程序
****************************************************************/
void Send_Byte(uchar d)
{
uchar i = 8;
while( i-- )
{
SCLK = 0;
SDA = (bit)(d&0x80);
d = d<<1;
SCLK = 1;
}
}
/****************************************************************
显示子程序
****************************************************************/
void displed()
{
uchar i,j;
for(i=0;i<speed;i++)
{
for(j=0;j<8;j++)
{
Send_Byte(disbuf1[j]);
Send_Byte(disbuf2[j]);
RCLK1=0;
P1=7-j;
RCLK1=1;
delay(5);
}
}
}
/****************************************************************
左移子程序
****************************************************************/
void leftmove()
{
uchar bitA=0;
uchar i,j;
for(i=0;i<8;i++) //每个数字移8次
{
for(j=0;j<8;j++)
{
disbuf1[j]<<=1;
bitA=disbuf2[j]&0x80; //取高位,即最左边位
if(bitA)disbuf1[j]|=0x01; //移入
disbuf2[j]<<=1;
bitA=movbuf[j]&0x80;
if(bitA)disbuf2[j]|=0x01; //移入
movbuf[j]<<=1;
}
displed();
}
}
/****************************************************************
主程序
****************************************************************/
void main (void)
{
uchar i,j;
while(1)
{
for(i=0;i<10;i++)
{
for(j=0;j<8;j++)
{
movbuf[j]=numdata[i][j];
}
leftmove(); //调用左移子程序 (一个字符送出显示)
}
}
}
浙公网安备 33010602011771号