51单片机学习——7--8*8LED点阵显示

8*8LED点阵显示

  • 原理
    • 点阵简介
    • 74HC595
    • 具体操作原理:
  • 代码实现

原理

点阵简介

点阵的外部
51单片机学习——7--8*8LED点阵显示_第1张图片51单片机学习——7--8*8LED点阵显示_第2张图片
51单片机学习——7--8*8LED点阵显示_第3张图片

点阵的内部结构51单片机学习——7--8*8LED点阵显示_第4张图片
和矩阵按键相似,将每一行或每一列的LED阳极或阳极并联一起。如左图,如果我们想让某个led灯点亮,就让某一行输出高电平,某一列输出低电平。51单片机学习——7--8*8LED点阵显示_第5张图片
我们通过74HC595向led点阵输入段选数据,即控制每一列哪些灯亮
通过P0口输入位选数据,即控制哪一列显示

51单片机学习——7--8*8LED点阵显示_第6张图片

74HC595

51单片机学习——7--8*8LED点阵显示_第7张图片
51单片机学习——7--8*8LED点阵显示_第8张图片
51单片机学习——7--8*8LED点阵显示_第9张图片
51单片机学习——7--8*8LED点阵显示_第10张图片
通过控制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.我们通过文字取模工具得到想要显示的图形(已经上传,可以免费下载)
51单片机学习——7--8*8LED点阵显示_第11张图片
下方生成了段选数据,我们直接复制粘贴即可,将它存储到列数组里面
2.51单片机学习——7--8*8LED点阵显示_第12张图片
我用到的是这个点阵,从上往下是从高位到低位,从左往右也是从高位到低位。
位选:我们让哪一列亮起,就让这一列变为低电平,即对应位为0,不想让亮的变为高电平,即对应位为1
段选:相同的道理,我们让哪一行亮起,就让这一行变为高电平,即对应位为1,不想让亮的变为低电平,即对应位为0,数据已经在取模工具中生成。

#include
#include

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_()函数是库里的函数
		_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短接
效果展示:

你可能感兴趣的:(51单片机学习,单片机,c语言,嵌入式)