基于74hc595和74hc138的点阵显示.docx
《基于74hc595和74hc138的点阵显示.docx》由会员分享,可在线阅读,更多相关《基于74hc595和74hc138的点阵显示.docx(17页珍藏版)》请在冰豆网上搜索。
基于74hc595和74hc138的点阵显示
基于74hc595和74hc138的16x40点阵显示
作者:
廖基鑫桂林电子科技大学
一、电路原理图。
(1)输入输出口
JP1为输入口,JP2为输出口(为串联下一块点阵),245为电平转换。
(2)行控制端电路
有2块3-8译码器组成4-16译码器。
将A,B,C,D,接入一个8位I/O口,直接对I/O口赋值。
(3)行写入端电路
二、74HC595介绍。
74HC595是一款漏极开路输出的CMOS移位寄存器,输出端口为可控的三态输出
端,亦能串行输出控制下一级级联芯片。
10脚SCLR移位寄存器清零端直接接地,
11脚SCK数据输入时钟线
12脚RCK输出存储器锁存时钟线
13脚OE输出使能低电平为输出有效
14脚SI数据线串行输入数据,亦能串行输出数据到下一级级联芯片
输入数据程序:
1.向595写一个字节的数据
voidwrite_595(ucharDATA)//向595写一个字节的数据
{
uchari;
for(i=0;i<8;i++)
{
SI=(~DATA)&0x01;
SCK=1;
SCK=0;
DATA=DATA>>1;
}
}
2.向多个595写一个字节的数据
9脚SQH位串行数据输出管脚将多个595的数据由9脚传至下一个595,全部写入后在打开输出存储器锁存时钟线
for(i=0;i<16;i++)//字从下往上滚动出现
{
k=1;
for(j=i+1;j>0;j--)//向多个595写一个字节的数据
{
write_595(display[7][k]);
write_595(display[7][k-1]);
write_595(display[6][k]);
write_595(display[6][k-1]);
write_595(display[5][k]);
write_595(display[5][k-1]);
write_595(display[4][k]);
write_595(display[4][k-1]);
k+=2;
hang=16-j;//为138输入行控制数据
RCK=1;RCK=0;
}
delay_ms(20);
}
3.595-RCK信号与138的输出使能E2信号为同一信号,故可以相连。
三、74hc138介绍。
3线-8线译码器
当一个选通端(G1)为高电平,另两个选通端(/(G2A)和/(G2B))为低电平时,将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。
利用G1、/(G2A)和/(G2B)可级联扩展成24线译码器;若外接一个反相器还可级联扩展成32线译码器。
引出端符号:
A、B、C译码地址输入端
G1选通端
/(G2A)、/(G2B)选通端(低电平有效)
Y0~Y7译码输出端(低电平有效)
功能表:
逻辑图:
四、74hc245介绍。
管脚及电路接法。
五、ULN2003介绍。
ULN2003是一个单片高电压、高电流的达林顿晶体管阵列集成电路。
它是由7对NPN达林顿管组成的,它的高电压输出特性和阴极箝位二极管可以转换感应负载。
单个达林顿对的集电极电流是500mA。
达林顿管并联可以承受更大的电流。
此电路主要应用于继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED气体放电),线路驱动器和逻辑缓冲器。
74hc595通过ULN2003驱动8*8LED点阵屏。
五、8*8点阵屏介绍
8*8点阵屏管脚如上,L1-L8由达林顿管TIP127驱动,H1-H8有ULN2003驱动
(1)TIP127简介
外延基PNP达林顿功率晶体管,采用TO-220塑料封装
VCBO集电极-基极电压(IE=0)6080100V
VCEO集电极-发射极电压(IB=0)6080100V
VEBO发射极-基极电压(IC=0)5V
IC集电极电流5A
ICM集电极峰值电流8A
IB基极电流0.1A
Ptot耗散功率Tcase≤25℃65W
(2)ULN2003介绍。
ULN2003是一个单片高电压、高电流的达林顿晶体管阵列集成电路。
它是由7对NPN达林顿管组成的,它的高电压输出特性和阴极箝位二极管可以转换感应负载。
单个达林顿对的集电极电流是500mA。
达林顿管并联可以承受更大的电流。
此电路主要应用于继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED气体放电),线路驱动器和逻辑缓冲器。
74hc595通过ULN2003驱动8*8LED点阵屏。
附录:
原理图
源程序:
//16x64点阵程序及滚动效果视频
#include
#defineucharunsignedchar
#defineuintunsignedint
#definehangP1//行扫描接在P1口
sbitSI=P2^3;
sbitSCK=P2^0;
sbitOE=P2^2;
sbitRCK=P2^1;
uintcounter;
ucharflag;
voiddelay_ms(ucharz)//延时0.5秒
{
uchari,j;
for(i=z;i>0;i--)
for(j=120;j>0;j--);
}
ucharcodedisplay[][32]={
/*--文字:
好--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x10,0x00,0x11,0xFC,0x10,0x08,0x10,0x10,0xFC,0x20,0x24,0x20,0x24,0x20,0x27,0xFE,0x44,0x20,0x64,0x20,0x18,0x20,0x08,0x20,0x14,0x20,0x26,0x20,0x44,0xA0,0x80,0x40,
/*--文字:
好--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x10,0x00,0x11,0xFC,0x10,0x08,0x10,0x10,0xFC,0x20,0x24,0x20,0x24,0x20,0x27,0xFE,0x44,0x20,0x64,0x20,0x18,0x20,0x08,0x20,0x14,0x20,0x26,0x20,0x44,0xA0,0x80,0x40,
/*--文字:
学--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40,0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00,
/*--文字:
习--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x00,0x00,0x3F,0xFC,0x00,0x04,0x08,0x04,0x04,0x04,0x03,0x04,0x01,0x14,0x00,0x64,0x01,0x84,0x06,0x04,0x38,0x04,0x10,0x04,0x00,0x04,0x00,0x24,0x00,0x14,0x00,0x00,
/*--文字:
天--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x00,0x08,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x08,0x20,0x10,0x10,0x20,0x0E,0xC0,0x04,
/*--文字:
天--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x00,0x08,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x08,0x20,0x10,0x10,0x20,0x0E,0xC0,0x04,
/*--文字:
向--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x02,0x00,0x04,0x00,0x08,0x04,0x7F,0xFE,0x40,0x04,0x40,0x24,0x4F,0xF4,0x48,0x24,0x48,0x24,0x48,0x24,0x48,0x24,0x4F,0xE4,0x48,0x24,0x40,0x04,0x40,0x14,0x40,0x08,
/*--文字:
上--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x10,0x01,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x00,0x00};
voidwrite_595(ucharDATA)//向595写一个字节的数据
{
uchari;
for(i=0;i<8;i++)
{
SI=(~DATA)&0x01;
SCK=1;
SCK=0;
DATA=DATA>>1;
}
}
voidmain()//主函数
{
uchari,j,k;
OE=0;//154使能
EA=1;//开总中断
TMOD=0x01;//定时器0工作方式0
ET0=1;//定时器0使能
TH0=(65535-50000)/256;//定时器0设置初值
TL0=(65536-50000)%256;
while
(1)
{
for(i=0;i<16;i++)//字从下往上滚动出现
{
k=1;
for(j=i+1;j>0;j--)//向多个595写一个字节的数据
{
write_595(display[7][k]);
write_595(display[7][k-1]);
write_595(display[6][k]);
write_595(display[6][k-1]);
write_595(display[5][k]);
write_595(display[5][k-1]);
write_595(display[4][k]);
write_595(display[4][k-1]);
k+=2;
hang=16-j;
RCK=1;RCK=0;
}
delay_ms(20);
}
TR0=1;flag=1;
while(flag)//停留一秒
{