点阵的显示原理是行扫描列发送字码,或者是列扫描行发送字码。当点阵屏大于16×16时,普通的32个I/O口的 单片机 是无法直接连接了,必须通过串行输入/输出寄存器或者锁存器等I/O口扩展,例如锁存器:74HC373、74HC273等;串行输入并行输出寄存器:74HC595、74HC164等;I/O口扩展芯片:8255、8155等。
一、74HC273连接的16×16点阵示例
74HC273是8位数据/地址锁存器,D0~D7为数据出入端;Q0~Q7为数据输出端;WR为主清除端,低电平触发,将锁存数据清零;CLK是触发端,上升沿触发,即当CLK从低到高电平时,D0~D7的数据通过芯片输出到Q0~Q7,为0时将数据锁存。
74HC273的测试程序如下:
#include<reg52.h>
sbit CLK=P3^0 ;
sbit MR=P3^1;
#define uchar unsigned char
#define uint unsigned int
//数码管字型表,对应0,1,2,3,4,5,6,7,8,9//
uchar Table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Delay(uint i )
{
uchar j;
for(;i!=0;i--)
{for(j=200;j!=0;j--) ;}
}
void main(void)
{
uchar N;
MR=1;
while(1)
{
for(N=0;N<10;N++)
{
CLK=0;
Delay(300); //延时为了方便看到管脚电平变化
P2=Table[N];
CLK=1;
Delay(300);
}
MR=!MR;
}
}
测试效果如下
利用74HC237连接的点阵如下图所示:
显示扫描方式也可以分为行扫描和列扫描,行扫描时,U1先输出行码依次扫描第1至第8行,同时U3输出第1行的左半部分列码,U4再输出第1行右半部分列码;扫描完1至8行后U2扫描8至16行,同时U3、U4输出对应的列码,这样就可以显示了。这仅仅是为了说明74HC273的连接图,不是最好的点阵连接方式,大家可以自己优化电路图。
二、74HC164与8255连接的点阵示例
图中8255的PA、PB输出端应加上拉电阻(300Ω~1KΩ)。ULN2803为增加驱动列能力。
5288的地址:PA口为0000H、PB口为0100H、PK(控制)口为0300H。使用逐列扫描方式。以显示四个静态的“欠一个吻”为例,参考程序如下:
#include<reg52.h>
#include<absaCC.h>
#define PA8255 XBYTE[0X0000]
#define PB8255 XBYTE[0X0100]
#define PK8255 XBYTE[0X0300]
#define uhar unsigned char
uchar code Hzdot[]={
0x80,0x40,0x40,0x40,0x20,0x20,0x18,0x20,0x0F,0x10,0x0A,0x0C,0x08,0x03,0xE8,0x00,
0x08,0x03,0x08,0x0C,0x48,0x10,0x28,0x30,0x18,0x60,0x08,0x20,0x00,0x20,0x00,0x00,/*"欠",0*/
0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xC0,0x00,0x80,0x00,0x00,0x00,/*"一",1*/
0x00,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x0C,0x00,0xE3,0x7F,
0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x60,0x00,0xC0,0x00,0x40,0x00,0x00,0x00,/*"个",2*/
0x00,0x00,0xFC,0x07,0x04,0x02,0x04,0x02,0xFC,0x03,0x40,0x48,0x30,0x44,0x0F,0x23,
0xCA,0x10,0x38,0x0C,0x08,0x03,0xF8,0x40,0x08,0x80,0x08,0x60,0xF8,0x1F,0x00,0x00/*"吻",3*/
};
uchar a,i,t,x[8]={0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
char b;
void main(void)
{
PK8255=0X80;
while(1)
{
for(a=0;a<64;a++)
{
PA8255=0x00;
PB8255=0x00;
for(b=7;b>=0;b--)
{
SBUF=~x[b];
while(!TI) ;TI=0;
}
PA8255=hzdot[2*a];
PB8255=hzdot[2*a+1];
for(i=0;i<8;i++)
{
if((x[7]&0x01)==0) goto LP;
if((~x[i]!=0)&&((x[i]&0x01)!=0))
x[i]=x[i]<<7|x[i]>>1;
else if((~x[i]!=0)&&((x[i]&0x01)==0))
{
x[i]=0xff;
x[i+1]=0x7f;
break;
}
}
}
LP:x[0]=0x7f;x[7]=0xff;
}
}
三、74HC595连接的点阵示例
很多点阵都是使用74HC595连接的,74HC595是8位串行输入/输出或者并行输出移位寄存器,具有高阻关断三态输出功能。
74HC595的功能表如下:
为了形象的演示74HC595的功能,编写如下测试程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DS=P3^4; //74HC595的数据串行输入端口
sbit ST=P3^7; //74HC595并行输出使能
sbit SH=P3^6; //74HC595移位寄存器移位使能
//测试串行传输数据:
uchar code Test[]={0xFF,0x00,0xAA,0xCC,0xEE,};
//******延时子程序******//
void delay(uint a)
{
uint i,j;
for(i=0;i<a;i++)
for(j=0;j<4;j++);
}
void SendByte(uchar date)
{
uchar i;
for(i=0;i<8;i++)
{
SH=0;
ST=0;
if(date&0x80) //将date最高位移到74HC595的移位寄存器
DS=1;
else
DS=0;
SH=1; //SH上升沿时移位
ST=1; //ST上升沿时输出数据
date=date<<1; //左移一位,将送出第二位数据
delay(5000);
}
}
//****主函数****//
void main()
{
uchar i;
while(1)
{
for(i=0;i<5;i++)
SendByte(Test[i]);
}
}
测试是依次输出0xFF,0x00,0xAA,0xCC,0xEE几个数据,在点阵显示程序中,是将数据全部送到74HC595的移位寄存器,再同时显示出来,并不是像下图所示一个一个流动显示,这个仅仅是测试数据的传输路径。
ORG 0000H
LJMP STAR
ORG 0BH
LJMP INTT0
STAR: MOV 20H,#00H
MOV A,#0FFH
MOV R7,#0
MOV P1,A
MOV P2,A
MOV P3,A
MOV P0,A
CLR P1.6
MOV TMOD,#01H
MOV TH0,#0FEH
MOV TL0,#18H
MOV SCON,#0
MOV IE,#82H
MOV SP,#70H
MOV R0,#0
本文关键字:暂无联系方式51单片机,单片机-工控设备 - 51单片机