2025年51单片机学习记录(8) “8X8点阵“

51单片机学习记录(8) “8X8点阵“51 单片机学习记录 8 8x8 点阵 8x8 点阵就是由 64 个小 led 灯组成的矩阵 现在先让我们看一下点阵的内部结构 从图中可以了解到 从行看去 每一行的小灯的阳极相连在一起排成了一列 从列看去 每一列的小灯的阴极相连在一起排成了一行 也就是说当我们对行进行操作的时候需要发送低电平 对列进行操作的时候需要发送高电平

大家好,我是讯享网,很高兴认识大家。

51单片机学习记录(8) “8x8点阵”

8x8点阵就是由64个小led灯组成的矩阵,现在先让我们看一下点阵的内部结构

在这里插入图片描述

从图中可以了解到

  1. (从行看去)每一行的小灯的阳极相连在一起排成了一列
  2. (从列看去)每一列的小灯的阴极相连在一起排成了一行

也就是说当我们对行进行操作的时候需要发送低电平,对列进行操作的时候需要发送高电平,这样才能使电路导通

74HC595芯片

因为想要点亮8x8点阵还需要它

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7nZt45i-1596860197988)(./点阵原理图.png)]

其中8x8点阵的led灯的列就是图示D0到D7控制的,当我们编写程序时需要用到SER,SRCLK,RCLK这三个寄存器,让我们看一下这个芯片的手册
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其中我圈画的部分就是我们需要关注的,SHCP(也就是原理图中的SRCLK),它的引脚是11,原理图中的网络标号是P3^6,同样的STCP(RCLK)
它的引脚是12,在原理图中的网络标号是P3^5.具体的功能和描述,图中的说明都十分的详细了,这里就不在赘述。
而SER就是用来接受我们传递的数据。

再说一下什么是"上升沿",所谓的上升沿就是数字电路中,数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。

最后讲一下运作的过程,首先我们传送8位的数据给SER,SER接受完数据后,我们手动置1让SRCLK处于上升沿状态,SRCLK寄存器就会将数据移位到原理图中的QA,循环这个过程,直到最后一位数据传送到QH,再来让RCLK处于上升沿状态,RCLK就会将存储的数据发送到D0口,也就是控制led灯的列的控制口

让8x8点阵显示自己想要的图形(这里以心形为例)

在这里插入图片描述

实际编写程序时,对列数组中存储的是我们想要的图形,对行数组中存储的数据是每一列亮起的条件(因为这里采用的是动态扫描的方式,跟动态数码管的原理有点类似),还是通过例子来说明吧。

首先我们可先在稿纸上或电脑上点出自己想要的图形,接着按照下列步骤进行数据的记录,最后编写程序的时候将数据存储在数组中

  1. 因为对列来说,小灯是阳级接入,所以让灯点亮是高电平,也就是说,需要亮起的灯就是高电平,不需要亮起的就是低电平,还需要注意的是,从上到下是低位到高位,所以我们应该从下往上看,例如第一列的数据就应当为 (0000 1110) = (0x0e) 第二列的数据为 (0001 1111) = (0x1f),依次类推
  2. 接着还需要行的数据,这个比较简单,因为是采用动态扫描的方式,也就是让灯一列一列的亮起,通过延时来达到一种类似静态显示的效果,需要注意的是,从左到右是从高位到低位,所以读取数据时应该从左向右,如下图从P0 - P07
    在这里插入图片描述

还有一点就是对行来说,灯是阴极接入,所以需要点亮的输入低电平,具体就是,首先先让第一列亮起其他列不亮也就是 (0111 1111) = (0x7f) 再让第二列亮起其他列不亮也就是 (1011 1111) = (0xbf),依次下去

#include <reg51.h> #include <intrins.h> typedef unsigned char u8; typedef unsigned int u16; /*定义74HC595芯片3个寄存器的位置*/ sbit SER = P3^4; sbit RCLK = P3^5; sbit SRCLK = P3^6; /*得到数据后,分别将其存入列数组和行数组中*/ u8 lei_array[]={ 
   0x0e,0x1f,0x3f,0x7e,0x7e,0x3f,0x1f,0x0e}; u8 hang_array[]={ 
   0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; void delay(u16);  //声明延时函数  void HC595(u8);  //声明工作函数 void main() { 
    u8 i;   //用于控制循环 while(1) { 
    P0 = 0x7f;  //先让第一列灯亮起再进入循环 for(i=0;i<8;++i) { 
    P0 = hang_array[i];  //依次点亮每一列的小灯 HC595 (lei_array[i]); //将列数据发送给HC595进行处理 delay(1000);     //延时一段时间 HC595(0x00);     //进行消影,这两步可以对比动态数码管 } } } void delay(u16 i) { 
    while(i--); } void HC595(u8 data1) { 
    u8 i;  //用于控制for循环 /*先手动置0,进入循环后再手动置1,达到上升沿的效果*/ SRCLK = 0; RCLK = 0; for(i=0;i<8;++i) { 
    SER = data>>7; //因为移位的时候是先从高位开始,所以先将传来的数据右移7位留下最高位发给SER data = data<<1; //再将原本的数据左移1位,使其次高位上升到最高位 SRCLK = 1;   //此时手动置1,使SRCLK处于上升沿,开始执行它的功能 _nop_();    //这个过程大概十几纳秒因此,延时两个机器周期即可,_nop_()函数是<intrins.h>库里的函数 _nop_();    SRCLK = 0; //再次手动置0为下次传送作准备 } RCLK = 1;   //传送完数据后,让RCLK处于上升沿状态,将数据传送到D0口 _nop_(); _nop_(); RCLK = 0; } 
讯享网

最后效果如图

在这里插入图片描述

小讯
上一篇 2025-01-27 23:45
下一篇 2025-03-12 15:38

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/29165.html