咱们首先来看看电路原理图吧,图1为整体电路原理图,运行时正显示汉字“少”。本原理图是在proteus下进行编辑和仿真运行的,这样无需搭建真正的硬件电路。呵呵,很方便吧! 不过得注意了,软件仿真和真正的硬件电路在LED扫描延时时间上有一定的差异。
图1:仿真运行电路原理图
图2电路原理图显示为STC单片机引脚连接,P0端口为LED点阵的列排列,P2端口为LED点阵的行排列。其中行是LED阳极。P1端口为一些控制信号。行列各由四个74HC573控制,每个控制8个脚,如图3所示。同时注意单片机P0口上拉保持供电充足。还有注意每行的扫描时间要合理设置。否则会有显示残缺。根据实际设置吧!!!
图2:STC单片机引脚连接
图3:74HC573连接方式
横向显示4个字:少占鱼制作
其实可以把这个程序和我另外的一个单片机串口与电脑通信的程序结合起来,加上我用VC做的上位机界面。可以自由输入显示内容,还可以反向控制电脑的一些操作。不过我还是热衷不用电脑输入显示内容,而用一只感应笔扫描一个32*32LED模板,实现自己点哪就让哪个LED亮的效果。简单有省事。等我做出实物来再发吧!!!其实就是加个光敏三极管,LED模板上各个LED点亮时间不同。通过测频达到取某点坐标的目的。
//32*32点阵LED显示,由8*8点阵组成。列高行低点亮
/*****我在修改的时候,总是字显示不完整,一开始还以为是哪里有错,后来改延时程序也不行,最后每行连续扫描几次,可以了******/
/*下面是源程序了*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//晖创电子-单片机交流学习网
//www.schuitron.com
sbit CS1=P1^0;
sbit CS2=P1^1;
sbit CS3=P1^6;
sbit CS4=P1^7;
sbit L1=P1^2;
sbit L2=P1^3;
sbit L3=P1^4;
sbit L4=P1^5;
uchar hang[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code tab[]={
0x01,0x00,0x01,0x00,0x01,0x00,0x09,0x20,
0x09,0x10,0x11,0x0C,0x11,0x04,0x21,0x10,
0x41,0x10,0x01,0x20,0x01,0x40,0x00,0x80,
0x01,0x00,0x02,0x00,0x0C,0x00,0x70,0x00,
//少
0x02,0x00,0x02,0x00,0x02,0x08,0x03,0xFC,
0x02,0x00,0x02,0x00,0x02,0x10,0x3F,0xF8,
0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,
0x20,0x10,0x20,0x10,0x3F,0xF0,0x20,0x10,
//占
0x04,0x00,0x04,0x00,0x0F,0xE0,0x10,0x40,
0x20,0x88,0x7F,0xFC,0xA1,0x08,0x21,0x08,
0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,
0x20,0x08,0x00,0x04,0xFF,0xFE,0x00,0x00,
//鱼
0x04,0x04,0x24,0x04,0x25,0x04,0x3F,0xA4,
0x24,0x24,0x44,0xA4,0xFF,0xE4,0x04,0x24,
0x3F,0xA4,0x24,0xA4,0x24,0xA4,0x24,0x84,
0x26,0x84,0x25,0x04,0x04,0x14,0x04,0x08
//制
};
void delay(uint);
void delayus();
void xianshi();
void dis1();
void dis2();
void dis3();
void dis4();
/****************************************************************/
//主函数入口
main()
{
delayus();
delay(20);
P0=0x00;
P2=0xff;
L1=0;
L2=0;
L3=0;
L4=0;
CS1=0;
CS2=0;
CS3=0;
CS4=0;
while(1)
{
xianshi();
}
}
void xianshi()
{
dis1();
dis1();
dis2();
dis2();
dis3();
dis3();
dis4();
dis4();
}
/************第一个16*16点阵显示***************/
//
void dis1()
{
//第一个16*16点阵开始显示
uchar i,j;
/*****我在修改的时候,总是字显示不完整,一开始还以为是哪里有错,后来改延时程序也不行,最后每行连续扫描几次,可以了******/
//少占鱼 河北正定欢迎您 长沙航院 QQ:411656434
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)//特别注意这里每组点阵的每行扫描8遍,人眼看起来才完整,否则会有残缺不亮
{
/*****我在修改的时候,总是字显示不完整,一开始还以为是哪里有错,后来改延时程序也不行,最后每行连续扫描几次,可以了******/
P2=hang[i];
CS1=1;
P0=tab[i*2];
L1=1;
delay(1);
P0=0x00;
L1=0;
P0=tab[i*2+1];
L2=1;
delay(1);
P0=0x00;//这句才是真正关闭阳极正电的
L2=0; //关闭列,这句是使以后的操作不再影响本列状态
P2=0xff;//这句才是关闭阴极正电的语句
CS1=0; //关闭行低,使以后的操作部影响本行状态
i++;
}
}
/*****我在修改的时候,总是字显示不完整,一开始还以为是哪里有错,后来改延时程序也不行,最后每行连续扫描几次,可以了******/
for(i=8;i<16;i++)
{
for(j=0;j<8;j++)//特别注意这里每组点阵的每行扫描8遍,人眼看起来才完整,否则会有残缺不亮
{
P2=hang[i%8];
CS2=1;
P0=tab[i*2];
L1=1;
delay(1);
P0=0x00;
L1=0;
P0=tab[i*2+1];
L2=1;
delay(1);
P0=0x00;//这句才是真正关闭阳极正电的
L2=0; //关闭列,这句是使以后的操作不再影响本列状态
P2=0xff;//这句才是关闭阴极正电的语句
CS2=0; //关闭行低,使以后的操作部影响本行状态
i++;
}
}
}
/*************第2个16*16点阵显示*********************/
//
void dis2()
{
//第二个16*16点阵开始显示
uchar i,j;
for(i=16;i<24;i++)
{/*****我在修改的时候,总是字显示不完整,一开始还以为是哪里有错,后来改延时程序也不行,最后每行连续扫描几次,可以了******/
for(j=0;j<8;j++)//特别注意这里每组点阵的每行扫描8遍,人眼看起来才完整,否则会有残缺不亮
{
P2=hang[i%16];
CS1=1;
P0=tab[i*2];
L3=1;
delay(1);
P0=0x00;
L3=0;
P0=tab[i*2+1];
L4=1;
delay(1);
P0=0x00;//这句才是真正关闭阳极正电的
L4=0; //关闭列,这句是使以后的操作不再影响本列状态
P2=0xff;//这句才是关闭阴极正电的语句
CS1=0; //关闭行低,使以后的操作部影响本行状态
i++;
}
}
for(i=24;i<32;i++)
{
/*****我在修改的时候,总是字显示不完整,一开始还以为是哪里有错,后来改延时程序也不行,最后每行连续扫描几次,可以了******/
for(j=0;j<8;j++)//特别注意这里每组点阵的每行扫描8遍,人眼看起来才完整,否则会有残缺不亮
{
P2=hang[i%24];
CS2=1;
P0=tab[i*2];
L3=1;
delay(1);
P0=0x00;
L3=0;
P0=tab[i*2+1];
L4=1;
delay(1);
P0=0x00;//这句才是真正关闭阳极正电的
L4=0; //关闭列,这句是使以后的操作不再影响本列状态
P2=0xff;//这句才是关闭阴极正电的语句
CS2=0; //关闭行低,使以后的操作部影响本行状态
i++;
}
}
//第二个16*16点阵显示完毕
}
/***********第3个16*16点阵显示**************************/
//
void dis3()
{
//第三个16*16点阵开始显示
uchar i,j;
for(i=32;i<40;i++)
{ /*****我在修改的时候,总是字显示不完整,一开始还以为是哪里有错,后来改延时程序也不行,最后每行连续扫描几次,可以了******/
for(j=0;j<8;j++)//特别注意这里每组点阵的每行扫描8遍,人眼看起来才完整,否则会有残缺不亮
{
P2=hang[i%32];
CS3=1;
P0=tab[i*2];
L1=1;
delay(1);
P0=0x00;
L1=0;
P0=tab[i*2+1];
L2=1;
delay(1);
P0=0x00;//这句才是真正关闭阳极正电的
L2=0; //关闭列,这句是使以后的操作不再影响本列状态
P2=0xff;//这句才是关闭阴极正电的语句
CS3=0; //关闭行低,使以后的操作部影响本行状态
i++;
}
}
for(i=40;i<48;i++)
{
for(j=0;j<8;j++)//特别注意这里每组点阵的每行扫描8遍,人眼看起来才完整,否则会有残缺不亮
{
P2=hang[i%40];
CS4=1;
P0=tab[i*2];
L1=1;
delay(1);
P0=0x00;
L1=0;
P0=tab[i*2+1];
L2=1;
delay(1);
P0=0x00;//这句才是真正关闭阳极正电的
L2=0; //关闭列,这句是使以后的操作不再影响本列状态
P2=0xff;//这句才是关闭阴极正电的语句
CS4=0; //关闭行低,使以后的操作部影响本行状态
i++;
}
}
//第三个16*16点阵显示完毕
}
/********第4个16*16点阵显示*********************/
//
void dis4()
{
/************第4个16*16点阵显示***********************/
//第四个16*16点阵开始显示
uchar i,j;
for(i=48;i<56;i++)
{
for(j=0;j<8;j++)//特别注意这里每组点阵的每行扫描8遍,人眼看起来才完整,否则会有残缺不亮
{
P2=hang[i%48];
CS3=1;
P0=tab[i*2];
L3=1;
delay(1);
P0=0x00;
L3=0;
P0=tab[i*2+1];
L4=1;
delay(1);
P0=0x00;//这句才是真正关闭阳极正电的
L4=0; //关闭列,这句是使以后的操作不再影响本列状态
P2=0xff;//这句才是关闭阴极正电的语句
CS3=0; //关闭行低,使以后的操作部影响本行状态
i++;
}
}
for(i=56;i<64;i++)
{
for(j=0;j<8;j++)//特别注意这里每组点阵的每行扫描8遍,人眼看起来才完整,否则会有残缺不亮
{
P2=hang[i%56];
CS4=1;
P0=tab[i*2];
L3=1;
delay(1);
P0=0x00;
L3=0;
P0=tab[i*2+1];
L4=1;
delay(1);
P0=0x00;//这句才是真正关闭阳极正电的
L4=0; //关闭列,这句是使以后的操作不再影响本列状态
P2=0xff;//这句才是关闭阴极正电的语句
CS4=0; //关闭行低,使以后的操作部影响本行状态
i++;
}
}
//第四个16*16点阵显示完毕
}
//
void delayus()
{
uchar i=3;
while(i--);
}
void delay(uint k)
{
uint data i,j;
for(i=0;i
{
for(j=0;j<155;j++)
{;}
}
}