榜首章 概述
LED点阵显现屏是经过PC机即将显现的汉字字模提取出来,并发送给单片机,然后显现在点阵屏上,首要适用于室表里汉字显现。
第二章 硬件规划
2.1 首要器材介绍
LED 点阵显现屏是由20 个8*8 的LED 点阵块组成,构成16*80 矩形点阵,以Atmel 公司的AT89S52单片机为操控中心。显现屏的其他首要硬件有:①带锁存输出的8位移位寄存器74HC595,作为LED的列线驱动输入;②三八译码器74LS138,作为LED行线的译码挑选;③三极管C9012,衔接两个三八译码器的十六个输出端,作为开关运用,驱动LED的行线。
2.2 首要器材具体衔接阐明
Atmel的AT89S52芯片相关器材衔接的接脚如下:P00-P03衔接3-8译码器的输进口A,B,C,~G2A
P20-P23衔接74HC595的输进口RCK, SI,SCK,SCLR
三八译码器74LS138的16 个输出端衔接16 个C9012的三极管的基极B,发射极E 衔接16 个行线操控端,集电极C衔接到GND。
点阵的80 列数据线驱动由10 片74HC595 级联组成,前一片74HC595 的Q’H 引脚衔接
下一片的SI引脚,各片的RCK、SCK、SCLR 别离并联。
2.3 LED点阵块
8*8的LED点阵为单色行共阳模块,单点的作业电压为正向(Vf)=1.8 v ,正向电流(IF)= 8-10 mA 。静态点亮器材时(64 点全亮)总电流为640mA,总电压为1.8 v,总功率为1.15W。动态时取决于扫描频率(1/8或1/16秒),单点瞬间电流可达80-160 mA。16*16点阵静态时16*16*10mA,动态时单点电流80-160mA。
接线方法:
当某一行线打高时,某一列线为低时,其队伍穿插的点就被点亮;
某一列线为高时,其队伍穿插的点为暗;
当某一行线打低时,无论列线怎么,对应这一行的点悉数暗。
列线:13—20操控点阵的列接低电平
行线:1-4 21-24操控点阵的行接高电平
2.4 AT89S52
(1)P0.0【39 脚】,P0.1【38 脚】,P0.2【37 脚】,P0.3【36 脚】接两片3-8译码器的A,B,C和榜首片的~G2A 与第二片的G1,用来挑选LED的行线
(2) P2.0【21 脚】:接74HC595的RCK脚。
P2.1【22 脚】:接74HC595的SCK脚。
P2.2【23 脚】:接74HC595的SI脚。
P2.3【24 脚】:接74HC595的SCLR脚。
(3) 其他
VCC 【40 脚】:接电源
EA/VPP【31 脚】:接电源
RST 【9脚】:复位脚。过10K电阻接GND,过10uF的电容C3接VCC;复位按钮接到电容C2两头。
2.5 移位寄存器74HC595
74HC595是带锁存输出的8位移位寄存器,其管脚见下图,其间SI是串行数据的输入端;
VCC、GND别离为电源和地;RCK是存储寄存器的输入时钟,SCK是移位寄存器的输入时钟,SCLR是移位寄存器的输入铲除,Q’H是串入数据的输出,G是对输入数据的输出使能操控,QA~QH串入数据的并行输出。从SI口输入的数据在移
位寄存器的SCK脚上升沿的效果下输入到74HC595中,在RCK脚的上升沿效果下将输入的数据锁存在74HC595中,当G为低电平不时,数据并行输出。SCLR为移位寄存器的输入铲除端。
74HC595与AT89S52的衔接:SI【14脚】,SCK【11脚】,RCK【12脚】, SCLR【10脚】别离接到AT89S52的P2.2【23脚】,P2.1【22脚】,P2.0【21脚】,P2.3【24脚】上。
其他脚衔接:OE【13脚】接地,使其一直输出;
Q’H【9脚】是衔接下一片74HC595的SI脚;QA,QB到QH别离衔接到LED点阵的1至8列的列线脚上。
2.6 三八译码器74LS138
图所示的是将两片74LS138译码器扩展为4线-16线译码器的衔接图。其接线特色为:将四个输入信号~G2A,C,B,A中的低三位C,B,A一起接至两个芯片的地址输入端。输入信号的最高位~G2A接至两个芯片的使能端,使两个芯片不能一起作业。~G2A,C,B,A作为地址输入变量构成二进制代码,Y0~Y7、Y0~Y7作为输入信号,每个输出表明一个二进制代码的意义,即能完成4线-16线译码器的功用。
第三章 软件规划
3.1 单片机的程序规划
单片机在LED点阵显现体系中首要担任数据的接纳、存储和扫描显现LED点阵屏三大首要功用。
/***************************************************************************************************
* Name: khldragon
* Date: 09/12/2009
* DescripTIon: This program controls 16*80LED and implements dynamic scan.
****************************************************************************************************/
#include
#include
#define CONIO P0 //行选信号
#define NUMOFWORDS (6) //显现的字数
#define SPEED (30) //扫描周期 SPEED越大,扫描越慢;
#define MAXWORDS (5) //屏幕最大固定显现字数
#define BLANK (4) //填充空数
#define MAXROW (16) //最大行数
staTIc sbit OE = P0^4; //操控74LS138,低电平有用
staTIc sbit RCK = P2^0; // 上升沿时数据输出
staTIc sbit SCK = P2^1; //上升沿时数据移位
static sbit SI = P2^2; //74hc595串行输入
static sbit SCLK = P2^3; //低电平移位寄存器清零,一般接VCC
static void send_in(unsigned char Data); //串行数据输入
static void send_out(void); //并行数据输出
static unsigned int row = 0; //行选信号
static int j = 0;
static int k = 0;
static int m = 0;
static int s = 0; //与SPEED匹配
static int count = 0; //当为5时到达最大字数MAX
const static unsigned char code zimo[][32]={
{0x20,0x08,0x13,0xFC,0x12,0x08,0x02,0x08,0xFE,0x08,0x0A,0x08,0x12,0x08,0x3B,0xF8,
0x56,0xA8,0x90,0xA0,0x10,0xA0,0x11,0x20,0x11,0x22,0x12,0x22,0x14,0x1E,0x18,0x00},//祝
{0x00,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x88,0x24,0x98,0x3E,0xA0,0x20,0xC0,
0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x82,0x26,0x82,0x38,0x82,0x60,0x7E,0x00,0x00},//比
{0x01,0x00,0x7F,0xFE,0x44,0x42,0x9F,0xF4,0x04,0x40,0x1F,0xF0,0x04,0x40,0x7F,0xFC,
0x08,0x20,0x1F,0xF0,0x28,0x2E,0xC9,0x24,0x09,0x20,0x01,0x00,0x06,0xC0,0x18,0x30},//赛
{0x00,0x80,0x00,0xA0,0x00,0x90,0x3F,0xFC,0x20,0x80,0x20,0x80,0x20,0x84,0x3E,0x44,
0x22,0x48,0x22,0x48,0x22,0x30,0x2A,0x20,0x24,0x62,0x40,0x92,0x81,0x0A,0x00,0x06},//成
{0x00,0x80,0x00,0x80,0x08,0x80,0xFC,0x80,0x10,0x84,0x17,0xFE,0x10,0x84,0x10,0x84,
0x10,0x84,0x10,0x84,0x1D,0x04,0xF1,0x04,0x41,0x04,0x02,0x44,0x04,0x28,0x08,0x10},//功
{0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0x80,
0x01,0x80,0x01,0x80,0x00,0x00,0x01,0x80,0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00},//!
};
void main()
{
//初始化引脚
CONIO = 0X00;
P2 = 0X08;
/**********************************动态扫描左移显现不限字数***************************************/
while(1)
{
for(k = 0; k 《 NUMOFWORDS; k++)
{//扫描NUMOFWRODS遍
for(s = 0; s 《 SPEED; s++)
{
for(row = 0; row 《 MAXROW; row++)
{
count = 0;
//即将显现的字,送入74HC595的SI端,即单片机的P2^2引脚
for(j = k; j 》= 0; j–)
{
count++;
if(count 》 MAXWORDS)
break;
send_in(zimo[j][2*row+1]);
send_in(zimo[j][2*row]);
}
//填充空白
for(m = BLANK-k; m 》 0; m–)
{
send_in(0);
send_in(0);
}
send_out();
CONIO=row;
}
}
}
//下面程序逻辑同上,仅仅换下方位
for(k = 1; k 《= MAXWORDS; k++)
{
for(s = 0; s 《 SPEED; s++)
{
for(row = 0; row 《 MAXROW; row++)
{
for(m = k; m 》 0; m–)
{
send_in(0);
send_in(0);
}
for(j = 1; j 《= MAXWORDS – k; j++)
{
send_in(zimo[NUMOFWORDS-j][2*row+1]);
send_in(zimo[NUMOFWORDS-j][2*row]);
}
send_out();
CONIO=row;
}
}
}
}
}
/*****************************************************************
** 函数名:void send_in(unsigned char data)
** 输 入:unsigned char data
** 输 出: void
** 功用描绘: send data to 74hc595
** 全局变量: SCK SI
** 调用模块:main()
** 作 者:khldragon
** 日 期:09/12/2009
** 版别version1.0
****************************************************************/
void send_in(unsigned char data)
{
unsigned char i;
for(i = 0; i 《 8; i++)
{ //循环8次,刚好移完8位
SCK = 0; //先将移位寄存器操控引脚置为低
SI = Data & 0x01; //取数据的最低位,form: little endian
Data 》》= 1; //将数据的次高位移到最高位
SCK = 1; //再置为高,发生移位时钟上升沿,上升沿时数据寄存器的数据移位
_nop_();
}
}
/*****************************************************************
** 函数名:void send_out(void)
** 输 入:void
** 输 出: void
** 功用描绘: send data to led
** 全局变量: RCK
** 调用模块:main()
** 作 者:khldragon
** 日 期:09/12/2009
** 版别version1.0
****************************************************************/
void send_out(void)
{
RCK = 0; //先将存储寄存器引脚置为低
_nop_();
_nop_();
RCK = 1; //再置为高,发生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显现数据。
_nop_();
_nop_();
RCK = 0; //先将存储寄存器引脚置为低
}