原理
点阵简介
点阵的外部
点阵的内部结构
和矩阵按键相似,将每一行或每一列的LED阳极或阳极并联一起。如左图,如果我们想让某个led灯点亮,就让某一行输出高电平,某一列输出低电平。
我们通过74HC595向led点阵输入段选数据,即控制每一列哪些灯亮
通过P0口输入位选数据,即控制哪一列显示
74HC595
通过控制14,11,12引脚来输入数据。
14:DS(SER)对应网络标号的P3^4
11:SHCP(SRCLK)对应网络标号中的P3^6
12:STCP(RCLK)对应网络标号中的P3^5
上升沿就是数字电路中,数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。
同理下降沿就是数字电平从高电平(1)变为低电平(0)的这一瞬间。
具体操作原理:
通过移位操作,我们将8位数据从低位到高位依次发送给SER,SER每接收一位数据后,我们手动置1让SRCLK处于上升沿状态,SRCLK寄存器就会将数据移位到原理图中的QA,循环这个过程,直到最高位数据传送到QH,再来让RCLK处于上升沿状态,RCLK就会将存储的数据发送到D0到D7口,也就是控制led灯的列控制口
代码实现
1.我们通过文字取模工具得到想要显示的图形(已经上传,可以免费下载)
下方生成了段选数据,我们直接复制粘贴即可,将它存储到列数组里面
2.
我用到的是这个点阵,从上往下是从高位到低位,从左往右也是从高位到低位。
位选:我们让哪一列亮起,就让这一列变为低电平,即对应位为0,不想让亮的变为高电平,即对应位为1
段选:相同的道理,我们让哪一行亮起,就让这一行变为高电平,即对应位为1,不想让亮的变为低电平,即对应位为0,数据已经在取模工具中生成。
#include<reg52.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit SRCLK=P3^6; //11 SRCLK管脚
sbit RCLK1=P3^5; //12 RCLK管脚
sbit SER=P3^4; //14 SER管脚
u8 duan[]={0x3C,0x24,0xFF,0xBD,0xBD,0xFF,0x24,0x3C};//段选数据
u8 wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选数据 /0111 1111/1011 1111/1101 1111/1111 0111/1111 1011/1111 1101/1111 1110
void delay(u16 i)//延时函数
{
while(i--);
}
void Hc595pro(u8 dat) //发送段选数据函数
{
u8 a;
SRCLK=0;
RCLK1=0;
for(a=0;a<8;a++)
{
SER=dat<<7; //<< 左移 用来将一个数的各二进制位全部左移7位,高位舍弃,低位补0。
dat>>=1; //>> 右移 将一个数的各二进制位右移1位,移到右端的低位被舍弃,对于无符号数,高位补0。
SRCLK=1; //上升沿执行功能
_nop_(); //这个过程大概十几纳秒因此,延时两个机器周期即可,_nop_()函数是<intrins.h>库里的函数
_nop_();
SRCLK=0; //手动置0,为下一次执行做准备
}
RCLK1=1; //上升沿将数据发送至D0到D7
_nop_(); //延时两个机器周期
_nop_();
RCLK1=0; //手动置0,为下一次执行做准备
}
void main()
{
u8 i;
while(1)
{
for(i=0;i<8;i++)
{
P0=wei[i];//位选
Hc595pro(duan[i]);
delay(100);//通过延时来达到一种类似静态显示的效果
Hc595pro(0x00);//消影
}
}
}
要注意的是,如果发现点阵不亮,很可能的原因是没有将点阵模块的OE和GND短接
效果展示: