电子点阵课程设计笔记
一、8*8点阵显示图形所用主要器件
1.1 8*8点阵
(1)内部结构
点阵存在两种不同的类型:
①左图为(行)共阳;
②右图为(行)共阴。
工艺和使用上二者无差别,需要在使用前进行测试确认其属性。
在后续取子模时,如果行接的是二极管的阳极,列接的是二极管的阴极,则采用行扫描时列取模方式即为阳码,采用列扫描时行的取模方式即为阴码。对应的若行接二极管阴极,列接二极管阳极,则采用行扫描时取模方式为阴码,采用列扫描时取模方式为阳码。
(2)8*8点阵工作原理及控制
8*8点阵显示图形实质上是利用行列分别输入的01信号,选通某一确定节点上的发光二极管,进行发光。
以行共阳LED点阵为例,只要其对应的RO、CO轴顺向偏压,即可使LED发亮。例如如果想使左上角LED点亮,则只需ROW(1)= 1,COL(1)= 0,即9脚给高电平、13脚给低电平。
图中POS1-8对应8*8点阵的8的阳极接口,NEG1-8对应8*8点阵的8的阴极接口。
阳极由时钟电路给入扫描信号,阴极连接74HC595输出的8位信号,在每一扫描周期内进行选通。
(3)8*8LED点阵扩展为16*16LED点阵
显然,需要4片8*8点阵屏进行拼装。
同一列2片8*8点阵屏,阴极并联;同一行2片8*8点阵屏,阳极并联。
1.2 74LS138
(1)概述
74LS138 为3线-8线译码器,共有74LS138D和74LS138N两种线路结构型式。74LS138D为军用,74LS138N为民用。
(2)功能简介
① 当一个选通端(E1)为高电平,另两个选通端(/E2)和(/E3)为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。(即输出为Y0至Y7的非)比如:A2A1A0=110时,则Y6输出端输出低电平信号。
② 利用 E1、/E2和/E3可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。
③ 若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
(3)基本参数
(4)引脚说明
① A0~A2:地址输入端
② E1:选通端
③ /E2、/E3:选通端(低电平有效)
④ Y0~Y7:输出端(低电平有效)
⑤ VCC:电源正
⑥ GND:地
⑦ A0~A2对应Y0——Y7:A0,A1,A2以二进制形式输入,然后转换成十进制,对应相应Y的序号输出低电平,其他均为高电平。
(5)真值表
输入 |
输出 |
||||||||||||
E1 |
/E2 |
/E3 |
A2 |
A1 |
A0 |
/Y0 |
/Y1 |
/Y2 |
/Y3 |
/Y4 |
/Y5 |
/Y6 |
/Y7 |
× |
1 |
× |
× |
× |
× |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
× |
× |
1 |
× |
× |
× |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
× |
× |
× |
× |
× |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1.3 74LS161
(1)概述
4HC161和74LS161都是常用的四位二进制可预置的同步加法计数器,74HC161是CMOS型,74LS161是TTL型。它可以灵活的运用在各种数字电路,以及单片机系统中实现分频器等很多重要的功能。
(2)功能简介
⑧ 异步清零功能:当/CLR=0时,不论有无时钟脉冲CLK和其他信号输入,计数器被清零,即QD~QA=0000。
⑨ 同步并行置数功能:当/CLR=1,/LD=0时,在输入时钟脉冲CLK上升沿的作用下,并行输入的数据dcba被置入计数器,即QD~QA=DBCA。
⑩ 计数功能:当/LD=/CLR=ENP=ENT=1,当CLK端输入计数脉冲时,计数器进行二进制加法计数
⑪ 保持功能:当/LD=/CLR=1时,且ENP和ENT中有“0”时,则计数器保持原来状态不变。
(3)基本参数
(4)引脚说明
⑫ A~D:并行输入
⑬ ENP:计数启用并行输入
⑭ ENT:计数启用涓流输入
⑮ CLK:时钟输入
⑯ /LD:为同步置数控制端
⑰ /CLR:异步清零控制端
⑱ QA~QD:并行输出
⑲ RCO:进位输出输出
(5)真值表
/CLR |
/LD |
ENT |
ENP |
工作模式 |
L |
X |
X |
X |
清零 |
H |
L |
X |
X |
置数 |
H |
H |
H |
H |
计数 |
H |
H |
L |
X |
保持(不变) |
H |
H |
X |
L |
保持(不变) |
1.4 AT28C64B高性能EEPROM
(1)概述
AT28C64B是一个高性能的电可擦除和可编程只读只读存储器( EEPROM)中。它的内存64K是由8位,8,192字。与Atmel先进的非易失性CMOS技术,该器件还提供制造访问时间为150 ns的只有220毫瓦的功耗。当该装置是取消选择,在CMOS待机电流小于100微安。
(2)特点及参数
l 快速读取访问时间:150纳秒
l 自动页写操作
- 内部地址和数据锁存为64字节
l 快速写周期时间
- 页写周期时间: 10 ms最大(标准),2 ms最大(选项)
- 1到64字节页写操作
l 低功耗
- 40毫安工作电流
- 100 μA CMOS待机电流
l 硬件和软件数据保护
l 数据轮询和切换位写检测结束
l 高可靠性的CMOS技术
- 耐力: 100,000次
- 数据保存:10年单5V±10%供应
l CMOS和TTL兼容输入和输出
l JEDEC批准字节宽引脚
l 工业温度范围
l 绿色(无铅/无卤化物)的包装选项
(3)引脚结构
AO- A12:地址
CE:芯片使能
OE:输出使能
WE:写使能
I/00- I/07:数据输入输出
NC:无连接
DC:不连接
1.5 Max7219多位LED显示驱动器
(1)概述
MAX7219 是美国MAXIM 公司推出的多位LED 显示驱动器,采用3 线串行接口传送数据,可直接与单片机接口连接,用户能方便修改其内部参数,以实现多位LED 显示。它内含硬件动态扫描电路、BCD译码器、段驱动器和位驱动器。此外,其内部还含有8X8 位静态RAM,用于存放8 个数字的显示数据。显然,它可直接驱动64 段LED点阵显示器。当多片MAX7219 级联时,可控制更多的LED 点阵显示器。显示的数据通过单片机数据处理后,送给MAX7219 显示。
(2)功能简介
一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。
(3)关键特性
l 10MHz串行接口
l 独立的LED段控制
l 译码/非译码位选择
l 150µA低功耗关断(数据保持)
l 数字和模拟亮度控制
l 上电时处于全灭状态
l 驱动共阴极LED显示器
l 段驱动器的摆率限制功能有助于降低EMI (MAX7221)
l SPI、QSPI、MICROWIRE串行接口(MAX7221)
l 24引脚DIP和SO封装
(4)外部引脚分配和功能及内部结构
① 外部引脚分配
DIN:串行数据输入端
DOUT:串行数据输出端,用于级连扩展
LOAD/CS:数据装载信号输入
CLK:移位时钟脉冲输入
DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流
SEGA~SEGG:7段驱动
SEG DP:小数点驱动
ISET:硬件亮度调节端
V+:正电源
GND:接地
② 内部结构
(5)串行数据格式
16位地址/数据移位寄存器接收串行数据,实现串/并变换。16位数据含义如下:
D7~D0:写入内部RAM和功能寄存器的数据。
D8~D11:内部RAM和功能寄存器地址。
D12~D15:无定义。
地址译码器是一个4~16线译码器,用于选择数据存放单元,在LOAD端口信号作用下,将接收数据送入指定单元;
8字节双端口静态存储器存放接收数据和提供动态显示数据;
B译码和不译码电路对RAM数据进行BCD译码或直接送显示;
段码电流参考电路、亮度脉冲产生调制器实现对显示器的亮度控制,段码电流参考电路由硬件调节显示器亮度;动态扫描控制器实现由硬件控制动态扫描显示。
LED段/位驱动器提供显示器的1段和1位点亮时的电流。
(6)可寻址的数据寄存器和控制寄存器
① 内部RAM地址01 ~ 08H分别对应于DIGO一DIG7。
② 译码方式寄存器(地址09H):该寄存器的8位二进制数的各位分别控制8个LED显示器的译码方式。当高电平时,选择BCD-B译码模式,当低电平时选择不译码模式(即送来数据为字型码)。
③ 扫描界限寄存器(地址0BH):该寄存器中DO ~ D3位数据设定值为0 ~ 7H,设定值表示显示器动态扫描个数位1 ~ 8。
④ 亮度控制寄存器(0AH):共有16级可选择,用于设置LED的显示亮度,从0xX0~0xXF
⑤ 停机寄存器(地址0CH):当D0=0时,MAX721 处于停机状态;当D0=1时,MAX7219处于正常工作状态。
⑥ 显示测试寄存器(地址0FH):当D0=0时,MAX7219 按设定模式正常工作;D0=1时,MAX7219处于测试状态。在该状态下,不管MAX7219处于什么模式,全部LED将按最大亮度显示。
(7)读写时序
MAX7129是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
MAX7129的控制字格式如下:
D15 |
D14 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 |
D7 (MSB) |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 (LSB) |
X |
X |
X |
X |
地址Address |
数据Data |
如图,工作时,MAX7219规定一次接收16位数据,在接收的16位数据中:D15~D12可以与操作无关,可以任意写入,D11~D8决定所选通的内部寄存器地址,D7~D0为待显示数据或是初始化控制字。在CLK脉冲作用下,DIN的数据以串行方式依次移入内部16位寄存器,然后在一个LOAD上升沿作用下,锁存到内部的寄存器中。注意在接收时,先接收最高位D16,最后是D0,因此,在程序发送时必须先送高位数据,在循环移位。工作时序图见下图:
由于51是8位单片机故需要分两次来送数据。
二、8*8点阵显示爱心原理
2.1LED点阵扫描显示方式
LED一般采用扫描式显示,主要分为三种方式:点扫描、行扫描、列扫描。
充分利用人眼的暂留效应,实现动画效果,同时扫描时应注意亮灯留存时间,即扫描的间隔,一般控制于0.05至0.2秒水平。
详细实现如下:
(1)点扫描
逐点进行信号输入,效率低,不常用。
(2)行扫描
行扫描即是先让第一行全部置于有效位,再送对应亮灯位置所需的列码。随后按按一定扫描间隔,用同样的方法依次显示所有行,8行显示完成即完成一次完整的行扫描。
(3)列扫描
列扫描即是先让第一列全部置于有效位,再送对应亮灯位置所需的列码。随后按按一定扫描间隔,用同样的方法依次显示所有列,8列显示完成即完成一次完整的列扫描。
2.2使用MAX7219驱动LED点阵接线方式电路原理图
行扫描模式
2.3使用74LS138、74LS161、AT28C64驱动LED点阵接线方式电路原理图
ROM从IO0-IO7输出8位二进制码,到8*8点阵的NEGDP、NEG A-NEG G,驱动点阵阳极。3-8译码器输出,进行逐行给二极管阴极0电平的行扫描模式。
三、8*8点阵显示爱心项目实施
3.1使用MAX7219驱动LED点阵
(1)接线方式
(2)程序实现流程图
(3)项目代码
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//定义MAX7219端口
sbit Max7219_pinCLK = P2^2;
sbit Max7219_pinCS = P2^1;
sbit Max7219_pinDIN = P2^0;
uchar code disp1[8]={0x66,0x99,0x81,0x81,0x42,0x24,0x18,0x00};//爱心
//设定延迟时间,单位毫秒
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++) //两层空循环
for(j=0;j<112;j++)
;
}
//向Max7219(U3)写入字节
void Write_Max7219_byte(uchar DATA)
{
uchar i;
Max7219_pinCS = 0; //LOAD/CS引脚低电平,数据写入使能
for(i=8;i>=1;i--)
{
Max7219_pinCLK = 0; //移位时钟低电平输入
Max7219_pinDIN = DATA&0X80; //数据输入与80相与,取最高位
DATA = DATA<<1;
Max7219_pinCLK = 1; //移位时钟脉冲高电平输入,将数据写入内部存储器
}
}
//向Max7219写入数据
void Write_Max7219(uchar address,uchar dat)
{
Max7219_pinCS = 0; //LOAD/CS引脚低电平,数据写入使能
Write_Max7219_byte(address);//写入地址
Write_Max7219_byte(dat); //写入数据
Max7219_pinCS = 1; //LOAD/CS引脚高电平,数据装载使能
}
//初始化Max7219
void Init_Max7219(void)
{
Write_Max7219(0x09,0x00); //初始化译码寄存器,低电平选择不译码模式
Write_Max7219(0x0a,0x03); //初始化亮度控制寄存器,选择03档亮度(0-16档可选)
Write_Max7219(0x0b,0x07); //初始化扫描界限寄存器,输入07表示动态扫描个数为8
Write_Max7219(0x0c,0x01); //初始化停机寄存器,输入01,MAX7219处于正常工作状态
Write_Max7219(0x0f,0x00); //初始化显示测试寄存器,输入0,按设定模式正常工作
}
//主函数
void main(void)
{
uchar i;
Delay_xms(50); //延迟50ms
Init_Max7219(); //初始化Max7219
for(i=1;i<9;i++) //循环扫描显示
Write_Max7219(i,disp1[i-1]); //在i行输入存储爱心点阵对应行的数据
(4)实验结果
3.2使用74LS138、74LS161、AT27C64等驱动点阵的基础电路Proteus仿真结果
3.3使用74LS138、74LS161、AT28C64驱动LED点阵
(1)接线方式
(2)程序实现流程图
(3)项目代码
① 在ROM模拟部分进行图形的二进制数组定义
...
code byte memory[8] = { 0x66,0x99,0x81,0x81,0x42,0x24,0x18,0x00 };
② 定义写字节函数,并调用模拟ROM函数实现像物理载体MAX7219写数据
//向Max7219写入字节
void Write_Max7219_byte(byte DATA)
{
byte i;
Max7219_CS = 0;
for(i=8;i>=1;i--)
{
Max7219_CLK = 0;
Max7219_DIN = DATA&0X80;
DATA = DATA<<1;
Max7219_CLK = 1;
}
}
//向Max7219写入数据 地址限制在了8位 读者可自行调整
void Write_Max7219(byte address, byte dat)
{
Max7219_CS = 0;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
Max7219_CS = 1;
}
void Init_Max7219(void) //初始化Max7219芯片
{
Write_Max7219(0x09,0x00);
Write_Max7219(0x0a,0x03);
Write_Max7219(0x0b,0x07);
Write_Max7219(0x0c,0x01);
Write_Max7219(0x0f,0x00);
}
③ 主函数实现输出图形
void main(void)
{
byte i;
Delay(50);
Init_Max7219();
for(i=1;i<9;i++) //这里的示例语句将向点阵输出一次显示 如果想要一直显示则应该将其放入真循环
{
Write_Max7219(i,GetRomData(i - 1));
}
}
(4)实验结果
四.用单片机模拟ROM的方法
4.1简介
ROM芯片,是数字电路的重要组成成分之一。想要在电路中读取储存好的数据,就必须要用到相应的ROM芯片。ROM芯片的规格和型号极其繁多,再加上有些ROM芯片难以获取,甚至于某些芯片早已停产,无论是测试还是使用时都很不方便。因此可以采取使用单片机代替ROM芯片的办法,一是因为常见的单片机,例如C51,C52等系列产量很大,容易获取;二是仅需要修改程序就可适用于各种场景;三是可以在无储存器芯片的情况下进行预先的电路测试,方便调试等。下面将会以C52系列的STC89C52单片机模拟AT28C64EEROM芯片为例,讲述如何使用单片机进行ROM芯片的模拟和替代。
4.2模拟ROM方法
(1) 原理简介
单片机模拟ROM芯片的原理是,使得ROM芯片的引脚输入与单片机对应的引脚一致时,储存的数据一致,输出的数据相一致。但单片机的内部的RAM通常仅用于存储程序运行时的数据,通常规格较小。因此用于模拟ROM芯片所用到的单片机的储存空间,其实是单片机的ROM部分。本质上来讲,这里使用单片机来模拟的是一块连续的储存空间,而不是ROM芯片的各种物理特性,例如擦除方式等,单片机的ROM部分在生产时实际上使用的是Flash器件。
注意ROM芯片的控制位对输出数据的影响。注意ROM芯片OE等控制位发生作用的电平高低,以及这些控制位之间决定芯片当前状态的优先级。这一点需要在程序中写入相应的控制流。另外当ROM芯片的引脚处于高阻态时,应当不能向引脚内输入数据。
关于ROM芯片所附带的其他各种功能,例如保证数据安全性的检测,防止数据信号波动等功能,不在本题目的讨论范围内,因此不加赘述。
(2) 模拟方法
在这里我们使用C52系列的单片机,具体型号为STC89C52,模拟AT28C64 EEROM芯片储存数据。利用程序(见后文)使得单片机的功能与ROM芯片相一致。将所需的程序和数据写入单片机内。当单片机工作时,按照映射的引脚,读取CE,OE等控制位的信号,当处于相应的状态时,单片机将读取地址引脚上的数据,然后将将其在程序预留的空间中对应地址的数据读出,将其输出到I/O引脚上。这里的程序将AT28C64芯片的地址接口和控制位映射到了STC89C52单片机的P0,P2端口上;将AT28C64芯片的输入输出接口映射到了单片机的P1端口上。程序启动之后,单片机将会持续地读入控制位的信号。
当单片机的P2:5引脚,即模拟的CE引脚接入高电平时,P1端口,即模拟的I/O端口将处于高阻态,无法输入输出数据;当P2:6即模拟OE处于低电平,或者P2:7模拟WE处于高电平时,单片机将会向P1即模拟的I/O端口输出数据,输出的数据来自于模拟地址引脚上信号决定的储存位置。至此,完成了对ROM芯片数据存储功能的模拟。
实际操作中有一些地方需要注意。首先,未接入的端口是无法确定其电平的高低的,所以不用的端口应该统一接到低电平处,否则可能产生错误。例如,在不使用高地址位时,如果不将其接到低电平处,会使得程序读取到错误的地址,从而输出错误的数据。
其次,单片机模拟的ROM,是处于不断刷新的状态之中的。每次循环程序所用的时间决定了刷新的频率,这一频率与读取ROM的单片机不尽相同,从而使得信号不同步,某些时候需要进行延时的调整。所以对ROM的这一模拟并不能精确地反映ROM工作的状态。一般情况下单片机调用自身的ROM即可。
五.AT28C64芯片
5.1基本原理
AT28C64是一种高性能的,可电擦除的编程只读储存器,即EEROM芯片。它总储存空间为64Kbit,按照8K字,每个字8bit的方式进行组织。该芯片可提供150ns内的高速存取,工作功率低至220mW。当片选信号为高电位,芯片待机时的电流小于100uA。
该芯片有13根地址线,数据宽度为8bit,读取方式类似于静态随机存取储存器,即SROM,不需要任何外加的元器件,在写入前自动擦除。当CE和OE为低电平,WE为高电平时,由地址引脚上数据决定的储存单元中的数据被读出。无论CE或OE哪一个控制位为高电平时,输出引脚上都呈现为高阻状态。这种双信号控制机制给设计者防止总线冲突带来灵活性。
CE信号为芯片选择信号,实际上也作为电源控制信号。当其为高电平时,储存器芯片进入低功耗待机状态,这时储存器芯片呈现出高阻状态,并与OE信号无关。
为了确保数据的完整性与安全性,特别是在上电和掉电过程中,AT28C64采用了以下方法实现数据保护:
利用内部检测电路对电源电压Vcc进行检测。当芯片检测到的电压低于规定的阈值时,芯片将禁止内部非易失性程序初始化。芯片内部有一个信号滤波电路,可以防止信号波动。
在上电和掉电期间都可以通过保持WE或者CE为高电平,或者OE为低电平来封锁字节写入周期。
此外,AT28C64EEROM芯片还有识别查询数据位完成写入周期的功能,芯片识别功能,全片擦除功能等,但这些功能与本文的目标关系不大,因此不赘述。
5.2 AT28C64引脚图
5.3引脚功能说明
引脚 |
功能 |
A0-A12 |
地址线 |
CE |
片选信号,低电平有效 |
OE |
输出信号,低电平有效 |
WE |
写入信号,低电平有效 |
I/O0- I/O7 |
输入输出线 |
VCC |
接电源 |
GND |
接地 |
NC |
无连接 |
六.程序代码
6.1 ROM模拟部分
#include<stdio.h>
#include<reg52.h>
#define byte unsigned char
#define uint unsigned int
sbit A0=P0^0; //定义地址线
sbit A1=P0^1;
sbit A2=P0^2;
sbit A3=P0^3;
sbit A4=P0^4;
sbit A5=P0^5;
sbit A6=P0^6;
sbit A7=P0^7;
sbit A8=P2^0;
sbit A9=P2^1;
sbit A10=P2^2;
sbit A11=P2^3;
sbit A12=P2^4;
sbit _CE = P2^5; //定义片选信号
sbit _OE = P2^6; //定义输出信号
sbit _WE = P2^7; //定义写入信号
sbit D0=P1^0; //定义数据线
sbit D1=P1^1;
sbit D2=P1^2;
sbit D3=P1^3;
sbit D4=P1^4;
sbit D5=P1^5;
sbit D6=P1^6;
sbit D7=P1^7;
code byte memory[8] = { 0x66,0x99,0x81,0x81,0x42,0x24,0x18,0x00 }; //在程序中定义ROM需要写入的内容 //注意写入内容的长度,读取时注意读取数组的界限以防越界
//这里的示例用8个字节长度的内容
uint GetAddress() //从地址线上读取地址
{
uint A = P0; //这里的示例因为内容的长度较短,只使用低8位的地址
/*
uint A = P0;
uint t = P2;
t <<= 3; //高位地址只取5位
t >>= 3;
A += t;*/ //读者可以自行根据需要用到的地址线长度,重写程序和用到的引脚来改变读取的地址长度
return A;
}
void Refresh()
{
uint A = GetAddress();
if(_CE) //片选信号为高电平时不输出内容
{
return;
}
if(!_OE || _WE) //OE信号为高电平时,向数据端口输出数据
{
P1 = memory[A];
}
}
void main()
{
while(1) //单片机不断刷新以更新数据状态
{
Refresh();
}
}
6.2时序与逻辑
时序图以地址0-5的数据为例:
由于单片机模拟ROM的刷新频率远高于电路中地址段的时钟信号频率,因此可以认为数据的输出变化是即时的。
当地址端口数据发生变化时,只有当CE和OE信号同时处于低电平时,模拟ROM才会接受地址端口上的数据。
随即模拟ROM将会读取地址线上的数据,将其作为地址,单片机程序将会读取代码中写入储存空间相应地址的数据然后将其输出到数据端口。
七.74HC595芯片介绍
7.1基本原理
74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7'输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。
7.2 74HC595芯片引脚图
如图7.1所示为74HC595芯片的引脚图。
7.3 74HC595引脚功能说明
符号 |
引脚 |
描述 |
Q0-Q7 |
第15脚,第1-7脚 |
8位并行数据输出 |
GND |
第8脚 |
地 |
Q7’ |
第9脚 |
串行数据输出 |
/MR |
第10脚 |
主复位(低电平有效) |
SH_CP |
第11脚 |
数据输入时钟线 |
ST_CP |
第12脚 |
输出存储器锁存时钟线 |
/OE |
第13脚 |
输出有效(低电平有效) |
DS |
第14脚 |
串行数据输入 |
VCC |
第16脚 |
电源 |
7.4 74HC595芯片时序图
如图7.2所示为74HC595芯片时序图。
7.5 74HC595芯片内部电路图
如图7.3所示为74HC595芯片内部电路图。
7.6 74HC595芯片真值表
输入管脚 |
输出管脚 |
||||
SER |
SRCLK |
/SRCLR |
RCLK |
/OE |
|
X |
X |
X |
X |
H |
QA-QH输出高阻 |
X |
X |
X |
X |
L |
QA-QH输出有效值 |
X |
X |
L |
X |
X |
移位寄存器清零 |
L |
上升沿 |
H |
X |
X |
移位寄存器存储L |
H |
上升沿 |
H |
X |
X |
移位寄存器存储H |
X |
上升沿 |
H |
X |
X |
移位寄存器状态保持 |
X |
X |
X |
上升沿 |
X |
移位寄存器锁存状态值 |
X |
X |
X |
下降沿 |
X |
移位寄存器状态保持 |
7.7芯片的使用方法
74HC595的数据端:
Q0--Q7: 八位并行输出端,可以直接控制数码管的8个段。
Q7': 级联输出端。将它接下一个595的DS端。
DS: 串行数据输入端,级联的话接上一级的Q7'。
74HC595的控制端说明:
/MR(10脚): 低电平时将移位寄存器的数据清零。通常接到VCC防止数据清零。
SH_CP(11脚):上升沿时数据寄存器的数据移位。Q0->Q1->Q2-->Q3-->...-->Q7;下降沿移位寄存器数据不变。
ST_CP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将ST_CP置为低电平,当移位结束后,在ST_CP端产生一个正脉冲,更新显示数据。
/OE(13脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。
具体工作方式 :
第一步:目的:将要准备输入的位数据移入74HC595数据输入端上。
方法:送位数据到74HC595。
第二步:目的:将位数据逐位移入74HC595,即数据串入。
方法:SH_CP产生一上升沿,将DS上的数据移入74HC595移位寄存器中,先送低位,后送高位。
第三步:目的:并行输出数据。即数据并出
方法:ST_CP产生一上升沿,将由DS上已移入数据寄存器中的数据送入到输出锁存器。
7.8 74HC595芯片工作参数
符号 |
参数 |
最小值 |
最大值 |
单位 |
VCC |
直流电源电压 |
2.0 |
5.5 |
V |
VIN |
直流输入电压 |
0 |
5.5 |
V |
VOUT |
DC输出电压 |
0 |
VCC |
V |
TA |
工作温度 |
-55 |
125 |
℃ |
更多参数请查阅 https://www.21icsearch.com/ 以获得详细信息。
八.总体设计
九.接口电路设计
如图2.1为16×16点阵汉字显示的接口电路设计。单片机通过P2口与4片74HC595芯片相连,通过串行数据输出的方式将要显示的汉字数据存储到74HC595芯片中。然后通过上升沿信号控制74HC595芯片并行输出数据到点阵,即可完成点阵的汉字显示。
十.提取汉字编码的方法
10.1 简介
字符或者汉字显示在点阵屏幕上,就必须有相应的字库,字体和大小不同,其对应的字库也不相同。字库的编码有多种方式;在点阵上显示的编码就有多种,每一种编码必须和点阵显示相对应。下面就以字符“E”的16´16字库的编码为例介绍字符(汉字)编码过程。为了叙述方便,我们将要显示的字符(汉字)描在方格坐标上。如下图我们将显示字符“E”在16´16方格纸上描出的图形。其中,画“○”处表示该点“亮”,未画“○”处表示“不亮”。如图3.1所示,然后根据“亮”与“不亮”的状态,将画“○”定义为“1”,未画“○”定义为“0”。这样就形成了一个字符“E”的字库,根据点阵的数据线的排列方式,字库编码有多种方式,有按照行线方向(水平)编码,也有按照列线方向(垂直)编码;每一种方式中,都是以字节为单位编码,不过字节的高位各不相同。
下面我们按照行线方向(水平),且将字节的高位设定在左边的方式编码。例如,图10.1所示的“E”字,第3行的二进制码组为0000111111110000,用十六进制表示则为0FH和F0H;第4行的二进制码组为0000100000000000,用十六进制表示则为08H和00H。可见,对16´16点阵字符进行编码时,每一行可用两个字节的编码表示,则16行共有32个字节。最后将1~16行的十六进制代码顺序地写入点阵对应位置的存储单元中。点阵就会在指定的位置显示字符“E”。
如果按照列线方向(垂直),且将字节的高位设定在下边的方式编码。16´16点阵中每一列的16个点可用两个字节的编码表示,则16列共有32个字节。如图3.1所示的“E”字,第4列的二进制码组为0001111111111100,用两个字节的十六进制表示则为1FH和FCH。下面所使用的点阵采用的就是这种编码方式。
10.2 提取汉字编码的方法
点阵的显示数据存储器与显示屏幕的物理位置是一一对应的。当对DDRAM中的某一个单元写入一个字符的编码时,该字符就在对应的位置显示出来。所以要显示字符就必须把字符的编码写入DDRAM中,也就是写入对应的字符存储器中。
显示汉字时首先根据汉字字形编出字模数据块,一个汉字如用16×16点阵,则需32个字节数据,汉字字模除手工编写外,也可以使用一些字模提取工具软件创建(如HZDotReader软件等)。一般用软件来提取汉字的点阵。
在提取汉字前,必须确认三件事情:
(1)送入液晶显示汉字点阵缓存区的数据的方向。是上下还是左右。如果是上下方向,上面是低位还是高位。如果是左右方向,左面是低位还是高位。
(2)汉字点阵大小的选择。是16×16(小四号),还是32×32,等等。
(3)汉字点阵的输出格式。是C语言方式还是汇编语言方式。
下面以取模软件提取汉字点阵为例,介绍“华中科技大学”六个汉字点阵的提取方法。假设选择16×16点阵,C语言输出方式。
打开软件,出现如图10.2所示的界面。在此界面可以直接输入取模的汉字,设置字体大小,选择字体以及特殊字体的操作(如粗体,斜体,添加下划线等)。同时可以通过下拉菜单改变字型,编码方式以及方向。最后还有点阵颜色选择,方便预览输出效果。
可以在操作栏中选择字体,以及对应的长宽比。
取模方式:
①在字体下拉菜单处点击下箭头,选择字体为“宋体”。
②在字型选择下拉菜单处点击下箭头,选择字型为“16×16”
③在编码选择下拉菜单处点击下箭头,选择编码为“D0~D7”
④在方向选中下拉菜单处点击下箭头,选择方向为“横向”
⑤设置完成后在输入框内逐字输入“华中科技大学”并点击“执行”。此时需要的字模数据就出现在下面的工作框中。如图10.3所示。
十一.代码实现
11.1流程图
11.2代码
//点阵显示数组
unsigned char code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00};
unsigned char code tab8[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//空格
unsigned char code tab1[] =
{16,1,16,17,8,9,12,7,138,1,104,33,8,33,8,62,136,0,128,0,254,63,128,0,128,0,128,0,0,0,0,0};//华
unsigned char code tab2[] =
{128,0,128,0,252,31,132,16,132,16,132,16,132,16,132,16,252,31,132,16,128,0,128,0,128,0,128,0,0,0,0,0};//中
unsigned char code tab3[] =
{0,8,96,9,28,10,16,10,144,8,126,9,16,9,24,56,184,15,84,8,18,8,16,8,16,8,16,8,0,0,0,0};//科
unsigned char code tab4[] =
{8,2,8,2,8,2,222,31,8,2,8,2,200,15,152,8,142,8,8,5,8,2,8,5,136,8,110,48,0,0,0,0};//技
unsigned char code tab5[] =
{128,0,128,0,128,0,128,0,254,63,128,0,64,1,64,1,64,1,32,2,32,2,16,4,8,8,6,48,0,0,0,0};//大
unsigned char code tab6[] =
{72,8,144,4,0,2,254,63,2,32,2,32,248,7,0,2,128,1,254,63,128,0,128,0,128,0,224,0,0,0,0,0};//学
unsigned char code tab7[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//空格
#include <REG51.H>
#include <intrins.h>
#include "array.h"
//--重新定义函数变量--//
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//--定义SOU要使用的IO--//
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;
//--全局函数声明--//
void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0);
/*******************************************************************************
*函数名 : main
*函数功能 :主函数
*输入 :无
*输出 :无
*******************************************************************************/
void main(void)
{
int k, j, ms;
//--定义一个执政数组指向每个汉字--//
uchar *p[] =
{tab8, tab1, tab2, tab3, tab4, tab5, tab6, tab7};
while(1)
{
for(ms = 20; ms > 0; ms--) //移动定格时间设置
{
for(k = 0; k < 16; k++) //显示一个字
{
HC595SendData(~(*(p[0] + 2*(k+j) + 1)),~(*(p[0] +
2*(k+j) )),tab0[2*k],tab0[2*k + 1]); //因为字模软件取的数组是高电平有效,所以列取反
}
//清屏//
HC595SendData(0xff,0xff,0,0);//清屏
}
j++;
if(j == (7*15) )//7表示输出字的个数
{
j = 0;
}
}
}
/*******************************************************************************
*函数名 : HC595SendData
*函数功能 :通过74HC595发送四个字节的数据
*输入 :BT3:第四个74HC595输出数值
* :BT2:第三个74HC595输出数值
* :BT1:第二个74HC595输出数值
* :BT0:第一个74HC595输出数值
*输出 :无
*******************************************************************************/
void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0)
{
uchar i;
//--·发送第四个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT3 >> 7 ; //从高位到低位
BT3 <<= 1;
S_CLK = 0;
S_CLK = 1; //时钟信号控制发送
}
//--·发送第三个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT2 >>7;//从高位到低位
BT2 <<= 1;
S_CLK = 0;
S_CLK = 1; //时钟信号控制发送
}
//--·发送第二个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT1 >> 7;//从高位到低位
BT1 <<= 1;
S_CLK = 0;
S_CLK = 1; //时钟信号控制发送
}
//--·发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT0 >> 7;//从高位到低位
BT0 <<= 1;
S_CLK = 0;
S_CLK = 1; //时钟信号控制发送
}
//--输出--//
R_CLK = 0; //set dataline low
R_CLK = 1; //片选
}
将以上源程序复制到MCS-51的C语言程序中,用Keil编译并下载到如图2.1所示MCS-51单片机系统中即可运行。点阵的中部位置会显示“华中科技大学”字样
posted on 2021-03-05 21:58 俯仰之间Johnny 阅读(1688) 评论(0) 编辑 收藏 举报