*觉得有用有帮助的评论下,谢谢~
我的开发板是 16*16 红绿 双色的LED点阵,但我只用到了红色的,所以我们暂且只看黑色LED,其实只要让LED导通,我们就可以点亮任意一个LED小灯
如要点亮 左上角第一个LED ,只要让 22 置
1
,23 置0
就可以让它导通,就亮了
如果要让整个点阵按自己的想法显示,比如显示数字汉字啥的,可以用类似于数码管的 动态扫描 想法,我的理解是给 行 一个 段选 码表,给 列 一个 位选 码表,让 行 逐行扫描,配合列看看该行有没有要显示的LED,不好理解等下看程序
#include
#define LedH P0 //用P0口控制行
#define LedL P1 //用P1口控制列
void main()
{
while(1)
{
LedH=0x01; //只让第一个LED导通
LedL=0xfe;
}
}
#include
#define LedH P0
#define LedL P1
unsigned char code wei[8]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char code duan[8]=
{0x1C,0x3E,0x7E,0xFC,0xFC,0x7E,0x3E,0x1C};
void main()
{
unsigned char i;
while(1)
{
for(i=0;i<8;i++)
{
LedL=0xff; //消影
LedH=duan[i];
LedL=~wei[i];
}
}
}
#include "STC89C5xRC.H"
#include "intrins.h"
#define uchar unsigned char //对数据类型进行声明定义
sbit SRCLK = P3^6; //定义IO口,看开发板的原理图
sbit RCLK1 = P3^5;
sbit SER = P3^4;
void HC595(uchar dat1) //595芯片驱动程序,,这是传一个,要穿两个可以加一个dat2
{
uchar a;
SRCLK = 1;
RCLK1 = 1;
for(a=0;a<8;a++) //发送8位数
{
SER=dat1>>7; //从最高位开始发送
dat1<<=1;
SRCLK=0; //发送时序
_nop_();
_nop_();
SRCLK=1;
}
RCLK1=0;
_nop_();
_nop_();
RCLK1=1;
}
在最后的程序里,为了方便,我还用了 二维数组
数据类型 数组名[数组长度1][数组长度2];
数组元素的数量可以小于数组元素个数,没有赋值的会自动给0,当数组元素的数量等于数组个数的时候,如下
unsigned char a[2][3] = { {1,2,3}, {4,5,6} };
或者是
unsigned char a[2][3] = {1,2,3,4,5,6};
unsigned char a[2][3] = { {1,2}, {3,4} };
等价于
unsigned char a[2][3] = {1,2,0,3,4,0};
反过来
unsigned char a[2][3] = {1,2,3,4};
等价于
unsigned char a[2][3] = { {1,2,3}, {4,0,0} };
#include
#include "intrins.h"
#define uchar unsigned char
uchar code imagewei[8]=
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
};
uchar code imageduan[11][8]=
{
{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00}, //3
{0x00,0x00,0xE4,0xA2,0xA2,0xA2,0x9C,0x00}, //2
{0x00,0x00,0x88,0x84,0xFE,0x80,0x80,0x00}, //1
{0x00,0xC3,0xC3,0xFF,0xFF,0xC3,0xC3,0x00}, //i
{0x1C,0x3E,0x7E,0xFC,0xFC,0x7E,0x3E,0x1C}, //心
{0x00,0x7F,0xFF,0xC0,0xC0,0xFF,0x7F,0x00}, //u
{0x00,0x18,0x3C,0x78,0x78,0x3C,0x18,0x00}, //小心
{0x1C,0x3E,0x7E,0xFC,0xFC,0x7E,0x3E,0x1C}, //中心
{0x3E,0x7F,0xFF,0xFE,0xFE,0xFF,0x7F,0x3E}, //大
// {0x1C,0x3E,0x7E,0xFC,0xFC,0x7E,0x3E,0x1C}, //中心
{0x00,0x18,0x3C,0x78,0x78,0x3C,0x18,0x00}, //缩小
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, //全灭
};
sbit SRCLK = P3^6;
sbit RCLK1 = P3^5;
sbit SER = P3^4;
void HC595(uchar dat1,uchar dat2) //595芯片驱动程序,直接拿上面的来用,修改一下
{
uchar a;
SRCLK = 1;
RCLK1 = 1;
for(a=0;a<8;a++)
{
SER=dat1>>7;
dat1<<=1;
SRCLK=0;
_nop_();
_nop_();
SRCLK=1;
}
for(a=0;a<8;a++) //传输的第二个数据
{
SER=dat2>>7;
dat2<<=1;
SRCLK=0;
_nop_();
_nop_();
SRCLK=1;
}
RCLK1=0;
_nop_();
_nop_();
RCLK1=1;
}
void main()
{
int k,x,y;
uchar j;
uchar i;
y=0;
while(1)
{
if(j<6)
{x=200;} //让前面321倒计时切换慢点
else
{x=60;} //让后面心跳快点
for(k=0;k<x;k++) //段码之间切换的时间
{
for(i=0;i<8;i++) //扫描
{
HC595(~imagewei[i],imageduan[j][i]);
}
}
j++;
if(j==11) //单独循环7次后面的心跳
{
j=7;
y++;
}
if(y==7) //单独循环完后重新开始
{
j=0;
y=0;
}
}
}
啦~最终效果就完成啦
是不是看起来还可以,工科直男也有浪漫的好吧,我们不需要什么玫瑰花,不需要什么礼物,我们玩的高科技,玩的是技术,不开玩笑了,收工~