历史上的今天
返回首页

历史上的今天

今天是:2025年04月01日(星期二)

正在发生

2020年04月01日 | 【51单片机】【8*8 LED矩阵如何开发】

2020-04-01 来源:eefocus

8*8 LED矩阵第一个灯


为了提升软件编码能力,不愿当码农的码农发起向软件工程师征程的号角,学习硬件,首先从简单的51开始,慢慢扩展知识点。


看了几节基础视频,LED点亮的原理就是控制板子上连接LED的阳极方的电平为高电平(1),阴极为低电平(0)才能点亮,其他情况,双高,双低,接反的情况都不能正常工作。


首先上图(我的51版型号是HC6800-ES),此次学习的是8*8矩阵LED模块,74HC595芯片。

8*8LED

上图中画圈的地方是控制74HC595的OE引脚的电平,OE位低电平时(重要),74HC595芯片输出正常。


8*8LED矩阵是通过74HC595芯片和P0 I/O口(8个I/O口)控制。如上图所示,P0口控制显示列, D0-D7(595芯片的输出口)控制行,相交处为一个LED点。


此款单片机的8*8LED模式

LED排列

可以看到,阳极接到D0-D7,阴极接到P0^0-P0^7口,要让某个LED点亮,例如左上角第一个,只需让D7=1(高电平),D0-D6=0 。 P0^7=0(低电平),P0^0-P0^6=1即可(这里=0也可以,由于D0-D6=0,LED阳极方向低电平,电流总是不通)。 P0口可以直接控制,使P0=0x7f(0111 1111)即可。


下面讲解如何控制D0-D7。


74HC595串行输入,并行输出

我理解串行输入就是一次次输入一个0或者1,最后输出的时候输出8位的数比如 1001 0110。

74HC595

重要的地方:


595芯片只有一个输入口,即P34 I/O口,对应图中的SER,引脚号时14

P36,对应图中SRCLK,引脚号是11,它的作用是,每当它发生一次上升沿,则P34口的电平值会在位移寄存器中左移一位。当下一次上升沿发生时,移位寄存器的所有位都往左移一位。


P35,对应图中RCLK,引脚号12,当它发生一次上升沿,移位寄存器的值会输出到DA-DH(D0-D7),这里注意一下,D7是高位。


由于移位寄存器是一直往左移,那么第一个进入移位寄存器的就是最高位,所以,P34第一个值是高位。


请看下面两张图对照。


程序说明:

输出原理

spi_shcp对应引脚号是11,P36口,SRCLK。

spi_ds对应引脚号是13,P34口,SER。

spi_stcp对应引脚是12,P35口,RCLK。


引脚说明

引角说明

SHCP对应P36,STCP对应P35,DS对应P34。


我们可以得出结论:595芯片是通过P3^4,P3^5,P3^6进行输入输出。


为了有助于理解(假如我们要通过595芯片输出 1000 0000),我模拟过程如下:


第一次:

P3^4=1*(P34是一个I/O口,只能有0或者1)*;

让P3^6发生一次上升沿(P3^6初始位0),P3^6=1;

移位寄存器里面值为1;

第二次:

让 P3^4=0;

P3^6发生一次上升沿,P3^6=0*(之前发生过上升沿,需要重置为0)*,P3^6=1;

移位寄存器里面值为10;

第三次:

让 P3^4=0;

P3^6发生一次上升沿,P3^6=0;P3^6=1;

移位寄存器里面值为100;

循环8次后,移位寄存器里面的值为1000 0000


最后,通过P3^5的上升沿(P3^5=0;P3^5=1),移位寄存器中的值会被输出到D0-D7,最后D7=1,D0-D6=0;


(我的理解是这样,实际运行我不太懂)


教程代码如下:


#include "reg51.h"

#include


typedef unsigned int u16;  //无符号的2个字节  51单片机int占2字节

typedef unsigned char u8;  //无符号的1个字节


sbit SRCLK=P3^6;    // P3^6 IO口 SHCP

sbit RCLK=P3^5;     // P3^5 IO口 STCP

sbit SER=P3^4;      // P3^4 IO口 DS


void Hc595SendByte(u8 dat) 

{

    u8 a;

    SRCLK=0;

    RCLK=0;

    for(a=0;a<8;a++)  // 8次循环

    {

        SER=dat>>7;  //DS等于传入值的最高位

        dat<<=1;   //最高位获取过了,将最高位移除,这一次的次高位位下次最高位


        SRCLK=1;  //SHCP 上升沿

        _nop_();  //intrins.h中的方法。

        _nop_();

        SRCLK=0;  // SHCP 下降沿,什么都不会发生

    }


    RCLK=1;  // STCP上升沿,移位寄存器的数据输出

    _nop_();

    _nop_();

    RCLK=0; // STCP下降沿,移位寄存器的数据输出

}



void main()

{       

    Hc595SendByte(0x80);  //1000 0000 控制第一行的led

    P0=0x7f;  // 0111 1111 控制第一列led

    while(1);       

}


编译后,烧录到单片机中的效果。

错误

为什么这里左边一列全部都亮了,预测效果应该是之亮第一列,第一个led,一开始我也是看了好久,以为代码错了,或者是595芯片的原理没有掌握好,最后我还是发现,原来一开始我的板子JOE (对应引脚是13,文档里面的OE) 接到了VCC,也就是高电平,OE在文档里面说明的是低电平才可以正常输出(但是为啥是一列全亮我也没搞明白),所以我重新将OE介入GND,此时就位低电平正常了,重新按下电源,一切正常了。

这里写图片描述

推荐阅读

史海拾趣

Doodle Labs公司的发展小趣事

随着技术的不断进步和市场的不断变化,Doodle Labs意识到单一产品无法满足多样化的客户需求。因此,公司开始加大研发投入,不断推出新的产品线。其中,最为引人注目的是一款名为Helix的六波段智能无线电产品,它能够在1625-2500MHz的频率范围内工作,为无人机提供全方位的通信支持。这款产品一经推出就受到了市场的热烈欢迎,Doodle Labs也因此获得了更多的关注和认可。

台湾致强(FORT)公司的发展小趣事

随着产品技术的不断成熟,致强科技开始积极寻求市场拓展。2016年,致强科技携手上海晟霆电子科技有限公司,共同致力于致强品牌合金电阻在中国内地市场的推广与销售。这一合作不仅扩大了致强产品的市场覆盖范围,还通过本地化服务提升了客户满意度。通过精准的市场定位和高效的营销策略,致强电阻迅速在内地市场占据了一席之地,成为众多电子企业信赖的合作伙伴。

得倍(DBIC)公司的发展小趣事

倍(DBIC)公司自创立之初,就致力于在电子行业中进行技术创新。公司投入大量资源进行研发,成功推出了一系列具有革命性的产品,如高效能芯片和智能传感器。这些产品不仅提高了生产效率,还满足了市场对智能化、高效能电子产品的需求。随着技术的不断进步,倍(DBIC)公司逐渐在行业中树立了技术领先的形象,吸引了众多合作伙伴和客户。

DAVE Embedded Systems公司的发展小趣事

DAVE Embedded Systems公司于1998年在意大利创立,其初衷是提供嵌入式系统解决方案。在成立初期,公司只有几名工程师和有限的资金,但他们凭借对技术的热爱和对市场的敏锐洞察力,成功设计并销售出了第一款基于微处理器和Linux平台的嵌入式系统模块(SOM)。这款产品因其高性价比和出色的性能,很快赢得了市场的认可,为公司的发展奠定了基础。

Aleph America Corporation公司的发展小趣事

DAVE Embedded Systems深知品质对于企业发展的重要性。他们建立了严格的质量管理体系,确保从原材料采购到产品制造的每一个环节都符合高标准的质量要求。同时,公司还提供了优质的售后服务,为客户提供了全方位的技术支持和解决方案。这些举措不仅赢得了客户的信任和支持,还为公司树立了良好的口碑。

Gowanda Electronics公司的发展小趣事

DAVE Embedded Systems公司于1998年在意大利创立,其初衷是提供嵌入式系统解决方案。在成立初期,公司只有几名工程师和有限的资金,但他们凭借对技术的热爱和对市场的敏锐洞察力,成功设计并销售出了第一款基于微处理器和Linux平台的嵌入式系统模块(SOM)。这款产品因其高性价比和出色的性能,很快赢得了市场的认可,为公司的发展奠定了基础。

问答坊 | AI 解惑

谁可以说下这个原理图是那里没有设置对????

Processing Rule:  Broken-Net Constraint ( ( On the board) )     Violation             Net netc17_1  is broken into 2 sub-nets. Routed To 0.00%    &n ...…

查看全部问答>

可恶的ActiveSync连接问题,急救...

在Activesync同步时,无法用USB连接PC,当插入USB时,PC机上提示发现新硬件,硬件可以使用,这说明我的驱动没有问题,选了组件ActiveSync 和usb serial ,系统时间日期设置好了,拔下USB口再插上无数次,Pc机子和目标机重启无数次,每次目标机上显 ...…

查看全部问答>

请教:vxworks WDB调试的问题

我想使用vxworks的WDB来进行调试,可是网口怎么挂也挂不上,所以没办法改用串口 现在串口可以挂上了,但是报了一个错:Error: Cannot get target toolname (symbol error) 不晓得该如何解决,希望前辈指点!     具体信息如下: Targ ...…

查看全部问答>

紧急求助:pxa270下SDIO wifi模组的驱动 Marvell 8686

请问谁能发给我一份在PXA270下可以使用的SDIO WIFI模组的驱动,模组型号是USI的WM-G-MR-09,模组使用的芯片是Marvell 8686. 我手里有厂商给的驱动,名称是:SD-8686-WM60-ARMV4I-9.70.3.p23-38.p44.CAB,但是这份是基于PXA310和wince6.0的驱动,我 ...…

查看全部问答>

高分求教~!

我在做四合一个卡座时不小心吧SD卡的DATA0和DATA1连在了一起,经过测试用SD卡可以正常读取,而用MINISD卡确不能读取,SD卡和MINISD卡不是一样的吗,请高人指教,谢谢~~!!…

查看全部问答>

DCD,SPACE问题

代码如下: #define SVC_STACK_LENGTH 0 StackSvc DCD SvcStackSpace+(SVC_STACK_LENGTH-1)*4 AREA MyStack,DATA,NOINIT,ALIGN=2 SvcStackSpace SPACE SVC_STACK_LENGTH*4 --------------------------------------- 请问各位大侠,DCD,SPACE ...…

查看全部问答>

我的STM32工作不起来

   板子是自己画的,芯片用的是STM32F103ZDTB,复位用一个按键加10K的电阻加101的电容,低电平复位,晶振是用12M晶振加30P的电容,VBAT接了一个101的电容再接到VDD,板子再接了一个USART1.    量了一下,晶振是不 ...…

查看全部问答>

can\'t open include file \"c240.h\"

这样的错误要怎么改才行???…

查看全部问答>

有啥画PCB的群、或者画pcb的QQ,高手的

有啥画PCB的群、或者画pcb的QQ,高手的,本人是个新手,刚接触设计PCB,学习过程可能会遇到一些问题,想加一些大侠的Q来指导下,被人q:1729217470.。…

查看全部问答>

找FPGA固件设计兼职人员,出差去上海1到2个月,Verilog语言

用Verilog实现一个通信协议的状态机,协议有40多条,固件框架已经写好,用Verilog写的。因其中的RS232、LVDS、千兆网等IP CORE在上海合作单位那边,需要去那边联合开发调试一到两个月。需要您熟练应用Verilog,XILINX FPGA开工工具,对spartan-6内 ...…

查看全部问答>