8x8点阵屏

文章介绍了点阵屏的工作原理,包括共阳极点阵的连接方式以及如何通过51单片机控制点亮特定位置的二极管。74HC595芯片作为串入并出的移位寄存器,用于减少单片机的IO口使用,文章详细阐述了其级联、工作模式和特点。此外,提供了静态和动态显示的代码示例,动态显示通过循环扫描实现视觉暂留效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理:

1.在图2中是实物点阵屏的模型,有凹槽那边从右边看是1脚到8脚,没有凹槽的从左边看是9脚到16脚

2.图1是共阳极点阵原理图;行是9 14……脚,如第一行中8个二极管的阳极都连在9脚的一条线上。 列是13 3……脚,如第一列的8个二极管的阴极都连在13脚的一条线上。

3.如点亮第一行第一列的一个二极管,就要给9脚赋1, 给13赋0,。 如图中赋的值,但如何判断那边是高位那边是低位呢

4.看图三就能清楚判断高低位,13脚连接U2的Q0所以是低位,9脚连接U1的Q7所以是高位

U1控制行,U2控制列

所以点亮第一行第一列的一个二极管应该给行赋值:1000 0000,给列赋值0111 1111,这样这个二极管就能亮。但这只是一个点的静态显示,想要显示两个点以上的就要进行动态显示,就如矩阵键盘一般,51的运算是很快的只有循环起来才能达到视觉暂留的效果。

图1

31f0c57caa0c4aacbbd0f85d7ee942e9.png

图二 

26ef5283a2534893b7829f8c1e13b12f.png

 图三

0513a36f2fd64935817fd2938ac7cd93.png

74HC595芯片:它是一种串入并出的的芯片,在电子显示屏制作中有广泛的应用,是8位比特串行输入/输出或者并行输出移位寄存器,

特点:大大减少51单片机使用的IO口,比较便宜

1.级联 :如果有两个或者两个以上的595芯片,如1号595,2号595,那么这两个芯片要连接到一起就要把1号的第9脚连到2号的第14脚,如图四

2.14脚是串行数据输入端,接51芯片

3.第11脚是数据输入时钟线,时钟线给一个时钟信号(上升沿),让数据知道自己什么时候传到移位寄存器中

4.12脚输出储存器锁存时钟线,给12脚一个上升沿,它就会把Q1-Q7的数据并行输出,它还是一个锁存器,只要595芯片不断电那么输出的数据就不会变,除非重新输入新的数据,实现不闪频

5.13脚若接高电平点阵屏会熄灭,再给它低电平点阵会输出上一次输出的内容

6.串行输入,只用一个通道数据就会依次通过

7.并行输出,要用8个通道,数据一下子全部输出

8.上升沿,11脚原来是低电平,突然给一个高电平就产生一个上升沿,就会使一个比特位进到移位寄存器中,12脚原来是低电平,突然给一个高电平就产生一个上升沿,就会使8个比特位数据并行输出。

图四

6cfaa63cc88048a1a69238a3849e772a.png

 d80c37b589384dab9e2719fa674f9f38.jpeg

997b87993d5542e29ff81368e2852779.jpeg

代码:静态显示点亮一个点

#include <reg52.h>
typedef int uint;
typedef char uchar;
sbit SRCLK = P3^5;//移位寄存器时钟
sbit R_CLK = P3^6;//并行输出锁存器时钟
sbit SER = P3^4;//串行输入端
void main()  //oxfe ox80
{
	uchar i = 0;
	//列位
	uchar	dat = 0XFE;
	for(i = 0; i < 8; i++)
	{
		SRCLK = 0;
		R_CLK = 0;
		if(dat & 0x01)  //位运算符,按位与操作,按二进制位进行"与"运算。 
			SER = 1;      //A = 1001 1100;  B = 1100 0011; A & B = 1000 0000;
		else
			SER = 0;
		SRCLK = 1;
		dat >>= 1; //进行移位;发完最低位后移到次低位发,按二级制位进行操作,右移运算符
	}          //A = 0011 1100,A >>= 2, A=0000 1111;
	//行位
	dat = 0x80;
	for(i = 0; i < 8; i++)
	{
		SRCLK = 0;
		if(dat & 0x01) // 1000 0000
			SER = 1;     // 0000 0001
		else           // 第1位传0进取再移位
			SER = 0;     // 0100 0000
		SRCLK = 1;     // 0000 0001   依次类推移动8次;
		dat >>= 1; 
	}
	R_CLK = 1; //给一个上升沿,使其并行发送数据
	while(1); //让程序停止,这个程序是一静态显示,只点亮了一个点;

动态显示 :1.显示一个电字

#include <reg52.h>
#include <intrins.h>
typedef int uint;
typedef int uchar;
uchar arr[] = {0xE0,0xEE,0x01,0x6D,0x01,0x6D,0x01,0xEF};
sbit DI = P3^4; //串口输入
sbit LE =P3^6; //并行输出锁存器
sbit CLK = P3^5;//移位寄存器
void shongzhi(uint day)//发送一个字节函数
{
	uint i = 0;
	LE = 0;
	CLK = 0;
	for(i = 0; i < 8; i++)
	{
		if(day & 0x01)
			DI = 1;
		else
			DI = 0;
		CLK = 0;
		day >>= 1;
		CLK = 1;
	}
}
//0xE0,0xEE,0x01,0x6D,0x01,0x6D,0x01,0xEF//未命名文件0//列选数据
void main()
{
		uint j = 0, h = 0x80;
	while(1)
	{
		for(j = 0; j < 8; j++)
		{
			shongzhi(arr[j]); //列
			shongzhi(h);//行
			LE = 1;
			h = _cror_(h,1);//右移关键字
//			LE = 0;
			
		}
	}
		
}

2. 循环显示 1 2 3 4

#include <reg52.h>
#include <intrins.h>  //使用右移关键字要引用的头文件
typedef int uint;
typedef int uchar;
uchar code arr[4][8] = {
	0xC7,0xEF,0xEF,0xEF,0xEF,0xEF,0xCF,0xEF,
	0xFF,0x87,0xDF,0xEF,0xF7,0xB7,0xCF,0xFF,
	0xFF,0xCF,0xB7,0xF7,0xEF,0xF7,0xB7,0xCF,
	0xFB,0xFB,0xFB,0xC0,0xDB,0xDB,0xDB,0xDB 
                                         }; //数组,code使得这个数组在后面使用时不能被改变
sbit DI = P3^4; //串口输入
sbit LE =P3^6; //并行输出锁存器
sbit CLK = P3^5;//移位寄存器
void shongzhi(uint day)//发送一个字节函数,使一个字节进到595的寄存器内
{
	uint i = 0;
	LE = 0;
	CLK = 0;
	for(i = 0; i < 8; i++)
	{
		if(day & 0x01)
			DI = 1;
		else
			DI = 0;
		CLK = 1;
		day >>= 1;
		CLK = 0;
	}
}

void main()
{
		uint j = 0, h = 0x80, k = 0, n = 0;
	while(1)    //用循环语句才能实现动态显示,就是要不断的扫描
	{
		
		for(k = 0; k < 4; k++)
		{
			for(n = 0; n < 1000; n++)  //让1 2 3 4分别循环扫描1000次达到视觉停留效果
			{
				for(j = 0; j < 8; j++)  //把点阵屏中一列和一行的8个16进制数分别传到595寄存器内,
				{
					shongzhi(arr[k][j]); //列
					shongzhi(h);//行
					LE = 1; //产生一个上升沿,并行输出
					
					LE = 0;
					h = _cror_(h,1);//右移关键字  h = 0000 0001,	经过h = _cror_(h,1)后,h = 0000 0010
					
				}
			}
		}
	}
		
}
//可用点阵取模软件进行快捷的取模
//取到的模是列的
//0xC7,0xEF,0xEF,0xEF,0xEF,0xEF,0xCF,0xEF//1
//0xFF,0x87,0xDF,0xEF,0xF7,0xB7,0xCF,0xFF  2
//0xFF,0xCF,0xB7,0xF7,0xEF,0xF7,0xB7,0xCF  3
//0xFB,0xFB,0xFB,0xC0,0xDB,0xDB,0xDB,0xDB  4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值