Description
基于74hc595和74hc138的16x40点阵显示
栏目:公司新闻 发布时间:2024-07-16
   作者:廖基鑫 桂林电子科技大学  一、 电路原理图。  (1)输入输出口    JP1 为输入口,JP2为输出口(为串联下一块点阵),245为电平转换。  (2)行控制端电路    有2块3-8译码器组成4-16译码器。将A,B,C,D,接入一个8位I/O口,直接对I/O口赋值。  (3)行写入端电路    二、74HC595介绍。  74HC595 是一款漏极开路输出的CMOS 移位寄存

  

  作者:廖基鑫 桂林电子科技大学

  一、 电路原理图。

  (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写一个字节的数据

  

  void write_595(uchar DATA) //向595写一个字节的数据

  {

  uchar i;

  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介绍。

  

  管脚及电路接法。

  五、ULN 2003介绍。

  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) 60 80 100 V

  VCEO 集电极-发射极电压(IB = 0) 60 80 100 V

  VEBO 发射极-基极电压(IC = 0) 5 V

  IC 集电极电流 5 A

  ICM 集电极峰值电流 8 A

  IB 基极电流 0.1 A

  Ptot 耗散功率 Tcase≤25℃ 65 W

  (2)ULN 2003介绍。

  ULN2003是一个单片高电压、高电流的达林顿晶体管阵列集成电路。它是由7对NPN达林顿管组成的,它的高电压输出特性和阴极箝位二极管可以转换感应负载。单个达林顿对的集电极电流是500mA。达林顿管并联可以承受更大的电流。此电路主要应用于继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED气体放电),线路驱动器和逻辑缓冲器。

  

  74hc595通过ULN2003驱动8*8LED点阵屏。

  附录:原理图

  

  源程序:

  //16x64点阵程序及滚动效果视频

  #include<reg52.h>

  #define uchar unsigned char

  #define uint unsigned int

  #define hang P1 //行扫描接在P1口

  sbit SI=P2^3;

  sbit SCK=P2^0;

  sbit OE=P2^2;

  sbit RCK=P2^1;

  uint counter;

  uchar flag;

  void delay_ms(uchar z) //延时0.5秒

  {

  uchar i,j;

  for(i=z;i>0;i--)

  for(j=120;j>0;j--);

  }

  uchar code display[][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};

  void write_595(uchar DATA) //向595写一个字节的数据

  {

  uchar i;

  for(i=0;i<8;i++)

  {

  SI=(~DATA)&0x01;

  SCK=1;

  SCK=0;

  DATA=DATA>>1;

  }

  }

  void main() //主函数

  {

  uchar i,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) //停留一秒

  {

  uchar j;

  for(j=0;j<16;j++)

  {

  write_595(display[7][j*2+1]);

  write_595(display[7][j*2]);

  write_595(display[6][j*2+1]);

  write_595(display[6][j*2]);

  write_595(display[5][j*2+1]);

  write_595(display[5][j*2]);

  write_595(display[4][j*2+1]);

  write_595(display[4][j*2]);

  hang=j;

  RCK=1;RCK=0;

  }

  }

  TR0=0;

  for(i=16;i>0;i--) //字滚动出显示区

  {

  k=31;

  for(j=i-1;j>0;j--)

  {

  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=j;

  RCK=1;RCK=0;

  }

  delay_ms(20);

  }

  for(i=0;i<16;i++) //下四个字滚动出现在显示区

  {

  k=1;

  for(j=i+1;j>0;j--)

  {

  write_595(display[3][k]);

  write_595(display[3][k-1]);

  write_595(display[2][k]);

  write_595(display[2][k-1]);

  write_595(display[1][k]);

  write_595(display[1][k-1]);

  write_595(display[0][k]);

  write_595(display[0][k-1]);

  k+=2;

  hang=16-j;

  RCK=1;RCK=0;

  }

  delay_ms(20);

  }

  TR0=1;flag=1;

  while(flag) //停留一秒

  {

  uchar j;

  for(j=0;j<16;j++)

  {

  write_595(display[3][j*2+1]);

  write_595(display[3][j*2]);

  write_595(display[2][j*2+1]);

  write_595(display[2][j*2]);

  write_595(display[1][j*2+1]);

  write_595(display[1][j*2]);

  write_595(display[0][j*2+1]);

  write_595(display[0][j*2]);

  hang=j;

  RCK=1;RCK=0;

  }

  }

  TR0=0;

  for(i=16;i>0;i--) //滚出显示区

  {

  k=31;

  for(j=i-1;j>0;j--)

  {

  write_595(display[3][k]);

  write_595(display[3][k-1]);

  write_595(display[2][k]);

  write_595(display[2][k-1]);

  write_595(display[1][k]);

  write_595(display[1][k-1]);

  write_595(display[0][k]);

  write_595(display[0][k-1]);

  k-=2;

  hang=j;

  RCK=1;RCK=0;

  }

  delay_ms(20);

  }

  }

  }

  void timer0() interrupt 1 //中断函数

  {

  counter++;

  if(counter==20) //1秒设置

  {

  counter=0;

  flag=0;

  }

  TH0=(65535-50000)/256;

  TL0=(65536-50000)%256;

  }