原理:
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
图二
图三
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个比特位数据并行输出。
图四
代码:静态显示点亮一个点
#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