历史上的今天
返回首页

历史上的今天

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

正在发生

2020年04月01日 | 51单片机学习(二)74HC595模块实现点阵屏

2020-04-01 来源:eefocus

引言:


74HC595是一个实现串行转并行功能的芯片,这也是我们51单片机学习接触到的第一个通过控制时序线完成数据输入输出的芯片,这样的芯片在以后会遇到很多,像是完成数据存储的EEPROM需要用到的I2C协议,还有完成计时功能的时钟DS1302,他们在与主机进行交互时必然需要数据的输入和读取,所以我们在输入读取时就需要控制几根由引脚控制的总线,通过控制这些总线的电平变化,我们就可以完成数据输入和读取。这些都是我自己的理解,有错误的地方希望可以得到指正。


在此之前我先讲一下在学习这些模块中需要理解的一些知识:


总线:一般的我们会有几根时钟线,其中一根数据时钟线负责暂时存放一位数据,一根输入时钟线能将数据时钟线的数据发送到寄存器,另一根总线控制整个过程。当然每个芯片都有不同,像是DS18B20温度传感器只有一根线就能完成所有操作,I2C只有两根线,而SPI则有4根线,但是总体来说一定包含了以上3个功能,或是将它们的功能分开成多根线,或是将它们功能合并从而减少线的数量。


上升沿/下降沿:上升沿即是一根线由低电平转变为高电平的的过程,而下降沿就是高电平转变为低电平的过程。在上升沿或者下降沿的过程中就可以完成数据输入或读取的操作,具体视芯片的协议时序而定。


然后74HC595这个芯片是怎样工作的呢,是怎样做到将一串数据并行同时输出的呢。下图是74HC595数据手册上给出的时序图,也就是在程序设计中,根据这个时序图我们就可以实现该芯片的功能。


首先,RCK相当于控制整个过程,在程序中先将RCK置为低电平,待数据存储完成后置为高电平完成上升沿将寄存器内的数据发送出去。SER用于暂时存储一位数据,CLK在每次下降沿会将SER数据存储在寄存器中。不过不知为何,这个时序图有点难看懂,主要思路是这样的吧,去参考代码的话更好理解吧。

在这里插入图片描述

接下来让我们分析一下点阵屏的原理,首先我们51单片机开发板上的点阵屏是一个8X8的一个点阵屏,点亮点阵屏的方法和led灯原理是一样的,led灯就是发光二极管嘛,当一个灯正极一边处于高电平状态负极一边处于低电平状态时,该灯会有电流通过,led灯就会发光,所以去看看原理图,控制led灯的端口是不是都是控制二极管的负极?所以在程序中,我们给一个引脚设置为0,该led灯就会发光。而点阵屏无非就是灯的数量多了一些,所以这里用到一个很神奇的控制方式:用P0端口与74HC595共同控制点阵屏。


控制方式:

P0端口和74HC595共同控制,分别是列方向控制和行方向控制。P0端口控制负极,从正方向看,P0端口是在行方向控制的,也就是说给P0端口的一个引脚赋值为0,那它对应的那一列是可以亮的,最低位在每行右方,最高位在每行左方。而74HC595控制正极,而且是纵向控制,给74HC595发送的数据中,赋值为1的对应的那一行是可以亮的,最低位在每列上方,最高位在每列下方。所以要使点阵屏的一个灯亮,需要在P0端口设置那一列的电平为低,在74HC595中设置那一行的电平为高。


PS:可以利用字模提取软件提取一个含有8个元素的数组,通过在快速地将每一列显示,形成一个字。

/*74HC595*/


#include <8051.h>

#define _nop_() __asm nop__endasm

#define CLK P3_5

#define SCK P3_6

#define SER P3_4

typedef unsigned char u8;

u8 b1[]={0xBE,0xAB,0xBE,0xAB,0x3F,0xF6,0xB3,0xBE};

u8 h1[]={0x45,0x2A,0x51,0x9D,0xF7,0x38,0x24,0x32};

u8 w1[]={0x89,0x7F,0x29,0x00,0x2A,0xFF,0x2A,0x60};

u8 k[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};


void _74HC595(u8 dat);

void delay10ms(void);   //误差 0us



void main(void)

{

    while(1)

    {

        for(u8 i=0;i<8;i++)//逐列将该列并行数据输入,也就是一列一列显示,但是刷新的够快就是全部显示了

        {

            P0=k[i];//控制一行,将该行某一个点置为低电平,该列可以亮

            _74HC595(h1[i]);//控制一列,将该列某一个点置为高电平,该列可以亮

            //通过对P0端口和74HC595共同作用,P0取低电平,并行数据取高电平,对应的灯就亮

            _74HC595(0x00);//消影

        }

    }


}

/*完成数据串行转并行的过程

其实就是将一串数据逐位存放

到寄存器中,然后一次性输出

即为并行输出。

*/

void _74HC595(u8 dat)

{

    u8 i=0,j=0;

    SER=0;//串行数据输入线,用来存放数据

    RCK=0;//串行寄存器时钟线,进行上升沿,即由低电平到高电平的过程,将所有数据并行输出。

    for(i=0;i<8;i++)

    {

        SER=dat>>7;

        dat <<= 1;

        CLK=1;//串行输入时钟,进行下降沿即可将SER中存放的数据存放到寄存器中

        j++;

        j++;

        CLK=0;//下降沿

    }

    RCK=1;//进行上升沿,将8位数据输出

}


void delay10ms(void)   //误差 0us

{

    unsigned char a,b,c;

    for(c=1;c>0;c--)

        for(b=38;b>0;b--)

            for(a=130;a>0;a--);

}

推荐阅读

史海拾趣

胜利(VICTOR)公司的发展小趣事

为了进一步拓展市场,胜利公司开始与其他品牌进行跨界合作。例如,公司与知名运动品牌合作推出联名款羽毛球鞋和服装,吸引了更多消费者的关注。此外,公司还与电商平台合作,开展线上销售业务,为消费者提供更加便捷的购物体验。

ETA Electric Industry Co Ltd公司的发展小趣事

进入新世纪,ETA Electric Industry Co Ltd意识到技术创新是企业发展的关键。于是,公司开始加大研发投入,引进了一批高素质的研发人员。他们专注于开发新型电子元器件,特别是在微型化、高性能方面取得了显著成果。其中,他们研发的一种新型微型电容器,因其体积小、性能稳定而广受好评。这一技术创新不仅提升了公司的市场竞争力,还为公司赢得了更多的合作机会。

Electronic Transistors Corp公司的发展小趣事

作为一家领先的电子企业,ETC公司深知自身肩负的社会责任。公司积极履行社会责任,关注环境保护和资源节约。ETC通过引进先进的生产工艺和设备,减少生产过程中的能源消耗和废弃物排放。同时,公司还积极参与公益事业和社会活动,为社会做出了积极贡献。这些举措不仅提升了ETC的企业形象,也为公司的可持续发展奠定了坚实的基础。

ACE [ACE Technology Co., Ltd.]公司的发展小趣事

在技术创新的基础上,ETC公司开始积极拓展市场。公司通过优化产品线,满足不同客户的需求,逐渐打开了国际市场的大门。同时,ETC还加大了品牌宣传力度,通过参加国际电子展会、发布技术白皮书等方式,提升品牌知名度和影响力。这些举措使ETC在全球范围内的市场份额不断扩大,品牌影响力也日益增强。

格瑞宝(GP)公司的发展小趣事

格瑞宝公司成立于2014年8月,总部选址于上海张江高科园,这里是中国科技创新的重要基地之一。公司从创立之初就明确了以自主研发、销售服务为主体的半导体公司发展路径。这一决策不仅为格瑞宝提供了丰富的科技资源和人才支持,也为其后续快速发展奠定了坚实基础。在总部的带领下,格瑞宝逐步建立起完善的产品研发、设计、测试和销售体系。

Astec [Astec America, Inc]公司的发展小趣事

随着技术的不断成熟和市场的不断扩大,Astec开始积极寻求市场拓展的机会。公司不仅加大了在国内市场的宣传力度,还通过参加国际电子展会等方式,将产品推向了国际市场。同时,Astec还注重品牌形象的建立,通过提供优质的产品和服务,逐渐树立了良好的品牌形象。

问答坊 | AI 解惑

请问:有哪些单片机是开放内核的?

最近要设计一款产品,需要买内核请厂家进行设计。 请问:有哪些单片机是开放内核的?…

查看全部问答>

SD卡驱动的问题!

大家好,我在加载SDIO的设备驱动时,总是在调用pAdapter->hDevice = SDGetDeviceHandle((DWORD)pAdapter->ActivePath, NULL);这句代码时返回NULL,请问是什么原因呀?有谁对这个函数的比较熟悉呀?谢谢了哦!…

查看全部问答>

OALPAtoVA转换出来的虚拟地址与oemaddrtab_cfg.inc中的地址不一样

#define BSP_BASE_REG_PA_AM29LV800              0x00000000 #define AMD_FLASH_START             (UINT32)OALPAtoVA(BSP_BASE_REG_PA_AM29LV800, ...…

查看全部问答>

WINCE下视频采集,视频压缩的问题,请指点!

请问各位高手,小弟最近在做一个视频采集,压缩的东东,由于在这方面没有经验,请教各位高手几个问题! 我使用的是S3C2440开发板,采用中星微 ZC0301PLH 的 USB 摄像头,摄像头输出格式为:YUV422P, YUV420P, JPEG。 请问: 将YUV422P, YUV420P, ...…

查看全部问答>

散热和可靠性是影响LED应用主要因素

replyreload += \',\' + 759479;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

测一路时正确测量多路的时候确全是0

是不因为 我计算的时候时间安排得不对,部分程序:AD初使化:ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC3工作在独立模式ADC_InitStructure.ADC_ScanConvMode = ENABLE;     ...…

查看全部问答>

从SRAM中启动用在什么场合?

                                 也就是什么情况下应用从SRAM中启动? 上电时锁存boot[1:0],决定从何处启动,但此时SRAM中有程序么?…

查看全部问答>

求一方案:窃_听USB传输的数据,请大家给点意见

因为有特殊应用需要,要窃_听PC机通过并口或USB口传送到打印机的数据。 窃_听并口的数据已经有了初步的方法,待进一步实验验证, 但窃_听USB数据还没有什么好的思路。 我的应用只需通过某种转换电路直接获取USB上的数据,获取后的数据再通过USB口传 ...…

查看全部问答>

超低温压力传感器的应用领域

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 超低温压力传感器,超低温压力变送器采用不锈钢一体化封装结构,感压膜片采用优良的特殊设计,使传感器在超低温-196℃环境下安全稳定工作,体积小巧,测量精度高,动态响应频率高,抗腐蚀能力 ...…

查看全部问答>