历史上的今天
返回首页

历史上的今天

今天是:2025年04月02日(星期三)

正在发生

2020年04月02日 | 51单片机入门 - 点阵显示程序设计实验

2020-04-02 来源:eefocus

一、LED点阵发光原理


8*8单色单片机结构图如下:


https://blog.csdn.net/weixin_42625444/article/details/90897605


从电路图中很简单的就可以看出来,想要点亮点阵中的某一个LED灯。只要使得那个灯所在的行输出高电平,所在列输出低电平就好。


二、点阵扫描实验


/***********************************************

实验名称:      点阵扫描

实验说明:      扫描每个LED灯,检查点阵是否完好

实验时间:    

***********************************************/

#include

#include

 

#define uchar unsigned char

#define uint  unsigned int

 

sbit MOSIO = P3^4;//输入口

sbit R_CLK = P3^5;//锁存器时钟

sbit S_CLK = P3^6;//移位寄存器时钟

 

//data3:右边半块列数据;data2:左边半块列数据

//data1:下边半块行数据;data0:上边半块行数据

void HC595Pro(uchar data3,uchar data2,uchar data1,uchar data0);

 

void main()

{

    uint i,j;

    uchar d;

 

    while(1)

    {

        //全亮

        HC595Pro(0x00,0x00,0xFF,0xFF);

        for(i=0;i<40000;i++);          //延时40ms  

            

        /*行扫描*/

        //上半块行扫描

        d = 0x01;

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

        {

            HC595Pro(0x00,0x00,0x00,d);

            d <<= 1;

            for(j=0;j<20000;j++);               //延时20ms    

        }      

        //下半块行扫描

        d = 0x01;

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

        {

            HC595Pro(0x00,0x00,d,0x00);

            d <<= 1;

            for(j=0;j<20000;j++);                 //延时20ms        

        }

 

        /*列扫描*/

        //左半快列扫描

        d = 0xFE;

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

        {

            HC595Pro(0xFF,d,0xFF,0xFF);

            //如果还想用跟行扫描一样的形式,看main()最下面注释行

            d = _crol_(d,1);                   //循环左移

            for(j=0;j<20000;j++);              //延时20ms        

        }

        //右半块列扫描

        d = 0xFE;

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

        {

            HC595Pro(d,0xFF,0xFF,0xFF);

            d = _crol_(d,1);

            for(j=0;j<20000;j++);               //延时20ms    

        }

        /******************************************************

        b1 = 0x01;

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

        {

            HC595Pro(0xFF, ~b1, 0xFF, 0xFF);

            b1 <<= 1;

            for(j=0; j<20000; j++);

        }

        b1 = 0x01;

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

        {

            HC595Pro(~b1, 0xFF, 0xFF, 0xFF);

            b1 <<= 1;

            for(j=0; j<20000; j++);

        }    

        ******************************************************/

    }

}

 

void HC595Pro(uchar data3,uchar data2,uchar data1,uchar data0)

{

    uchar i;

    //先移入的会被后面移入的数据推移到后面的595中,所以需要先移入data3

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

    {

        //先移入高位再移入低位,移位寄存器移入的第一位就是输出的最高位

        MOSIO = data3 >> 7;

        data3 <<= 1;

        S_CLK = 0;//给一个上升沿,移位

        S_CLK = 1;

    }    

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

    {

        MOSIO = data2 >> 7;

        data2 <<= 1;

        S_CLK = 0;

        S_CLK = 1;

    }

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

    {

        MOSIO = data1 >> 7;

        data1 <<= 1;

        S_CLK = 0;

        S_CLK = 1;

    }

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

    {

        MOSIO = data0 >> 7;

        data0 <<= 1;

        S_CLK = 0;

        S_CLK = 1;

    }

 

    //上升沿时将移位寄存器数据移到锁存器中用于显示,平时保持低电平,数据不变

    R_CLK = 0;

    R_CLK = 1;

    R_CLK = 0;

 

}


这里我用到的是16*16的点阵。其实也就是4个8*8的小点阵组成起来的。其结构图如下:


这里只是简单示意一下。。。其中4个小块都是与一个相对应的74HC595相连。每个74HC595又是级联的,入口只有一个,我们需要输入相对应的行,列电平情况来控制LED灯的亮灭。


根据74HC595的结构可以知道,输入的数据是8位8位的输入的。最开始输入的8位数据会被后面的输入数据推移到第四个74HC595中。


所以实际输入时,是先输入2和4的列数据,再输入1和3的列数据,然后再是3和4的行数据,最后才是1和2的行数据。


三、16*16点阵倒计时


/***********************************************************************

实验名称:   16*16点阵数字倒计时

实验时间:   

***********************************************************************/

#include

#include

 

#define uchar unsigned char

#define uint  unsigned int

 

sbit MOSIO = P3^4;

sbit R_CLK = P3^5;

sbit S_CLK = P3^6;

 

void HC595Pro(uchar data3,uchar data2,uchar data1,uchar data0);

 

void main()

{

    uint i,c;

    uchar j;

    i = 100;

 

    while(1)

    {

        //显示数字10

        for(c=i;c>0;c--)//延时

            for(j=0;j<16;j++)

            {

                //字模取出来的数据是跟实际实际所需数据相反的,所以要取反。

                //函数对应的参数分别表示列2,列1,行2,行1

                HC595Pro(~tab1[2*j+1],~tab1[2*j],tab0[2*j],tab0[2*j+1]);

            }

        HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

 

        //显示数字09

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

            for(j=0;j<16;j++)

            {

                HC595Pro(~tab2[2*j+1],~tab2[2*j],tab0[2*j],tab0[2*j+1]);

            }

        HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

 

        //显示数字08

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

            for(j=0;j<16;j++)

            {

                HC595Pro(~tab3[2*j+1],~tab3[2*j],tab0[2*j],tab0[2*j+1]);

            }

        HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

 

        //显示数字07

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

            for(j=0;j<16;j++)

            {

                HC595Pro(~tab4[2*j+1],~tab4[2*j],tab0[2*j],tab0[2*j+1]);

            }

        HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

 

        //显示数字06

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

            for(j=0;j<16;j++)

            {

                HC595Pro(~tab5[2*j+1],~tab5[2*j],tab0[2*j],tab0[2*j+1]);

            }

        HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

 

        //显示数字05

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

            for(j=0;j<16;j++)

            {

                HC595Pro(~tab6[2*j+1],~tab6[2*j],tab0[2*j],tab0[2*j+1]);

            }

        HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

 

        //显示数字04

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

            for(j=0;j<16;j++)

            {

                HC595Pro(~tab7[2*j+1],~tab7[2*j],tab0[2*j],tab0[2*j+1]);

            }

        HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

 

        //显示数字03

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

            for(j=0;j<16;j++)

            {                          

                HC595Pro(~tab8[2*j+1],~tab8[2*j],tab0[2*j],tab0[2*j+1]);

            }

        HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

 

        //显示数字02

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

            for(j=0;j<16;j++)

            {

                HC595Pro(~tab9[2*j+1],~tab9[2*j],tab0[2*j],tab0[2*j+1]);

            }

推荐阅读

史海拾趣

蜂鸟无线公司的发展小趣事
PWM调速可以实现电动机转速的精确控制,满足多种应用场景的需求。
Hitachi Metals公司的发展小趣事

随着汽车工业向智能化、电动化方向发展,Hitachi Metals敏锐地捕捉到了这一趋势带来的商机。公司加大了对汽车电子部件的研发和生产投入,特别是在汽车活塞环材料领域取得了显著成就。其生产的钢制活塞环材料在日本市场占据领先地位,不仅为众多汽车制造商提供了高质量的产品,还通过技术创新不断提升产品的附加值。此外,公司还积极拓展汽车电子控制单元(ECU)等关键部件的市场,进一步巩固了其在汽车电子领域的地位。

FASTRAX公司的发展小趣事

2012年,瑞士公司u-blox宣布以1300万欧元收购FASTRAX 100%的股权。这一并购事件引起了业界的广泛关注。u-blox看中了FASTRAX在GPS接收模块领域的领先地位和技术实力,希望通过并购加强其在定位市场的竞争优势。并购完成后,FASTRAX成为u-blox集团的重要一员,继续为全球客户提供优质的GPS产品和服务。

CLAIREX公司的发展小趣事

随着市场的不断发展,Clairex意识到,要想在激烈的竞争中脱颖而出,必须不断创新。于是,公司加大了对研发的投入,积极探索新技术、新材料和新工艺。经过数年的努力,Clairex成功开发出了一系列具有自主知识产权的光电子组件。这些组件不仅性能优异,而且成本更低、更易于集成。它们的推出,不仅进一步巩固了Clairex在市场上的地位,也为公司带来了可观的利润。

ASC Capacitors公司的发展小趣事

ASC Capacitors始终坚持品质至上的原则。公司从原材料采购到生产工艺,再到产品出厂,每一个环节都严格把控,确保产品质量无可挑剔。此外,ASC Capacitors还建立了完善的质量检测体系,对每一批产品进行严格测试,确保产品性能达到最佳状态。正是这种对品质的执着追求,使得ASC Capacitors赢得了客户的广泛赞誉和信任。

ELEKTRO-PLAST NASIELSK公司的发展小趣事

ELEKTRO-PLAST NASIELSK公司成立于上世纪九十年代,当时正值电子行业蓬勃发展的时期。创始人敏锐地察觉到塑料材料在电子元器件制造中的潜力,决定专注于研发和生产塑料外壳的电子元器件。然而,初创时期面临资金紧张、技术瓶颈和市场接受度低的挑战。创始人通过不懈努力,成功研发出具有竞争力的产品,并通过参加行业展会和建立合作伙伴关系,逐渐打开了市场。

问答坊 | AI 解惑

一进一出工程案例

系统设计每个进出口由一台计算机管理,在管理处设置一台计算机做进出的授权与管理,数据存放于管理处计算机,管理处可以随时查询车辆与人员的进出与授权情况,三台计算机通过TCP/IP联成局域网络;设备与计算机间采用工业标准RS485/RS422进行通讯。 ...…

查看全部问答>

电流放大电路

谁有电流放大电路的相关资料,拿出来分享一下。实用的电路最好,我找了好几个电路,但调试结果都不太理想。 就这么多了。 [ 本帖最后由 竹林中人 于 2009-6-3 20:26 编辑 ]…

查看全部问答>

2802 AD采样端口采样数字乱跳超过预期

我使用2802内部AD 端口采样电流信号,发现采样零信号,采样值波动很厉害?请教各位…

查看全部问答>

ZigBee技术语音图像无线监控系统的设计与实现

在环境比较恶劣,温度、压力、湿度、震动、噪声和电磁等因素时刻都可能发生变化的情况下,利用一般的网络技术来组建监控系统,可能会因为实时性不够强、灵敏度较小、延迟大、距离短、可靠性较低、受环境限制明显等缺陷,无法全面实时有效地实现安全 ...…

查看全部问答>

关于ADS8556死机的问题~!

最近在用ADS8556,虽然它采样很准确,但存在死机问题。不知道怎么回事,跪求各位大侠给点建议。谢谢!…

查看全部问答>

Wince 输入法

我通过实现IInputMethod接口, 实现了一个软件输入面板(SIP). 通过这个SIP输入字符的时候, 系统会弹出一个默认的候选窗口. 但这个候选窗口比较难看, 请问我可不可以用什么方法去定制这个侯选窗口? 在网上查阅一些资料, 突然对SIP和输入法的概念不 ...…

查看全部问答>

系统节拍问题

各位 请教个问题 100MHZ的 CCLK  系统节拍 为啥是10ms 啊? 根据 系统节拍定时器定时时间= Fcclk/(STRRLOAD+1)计算: Fcclk = 100MHZ  STRRLOAD的默认值为 0x000F 423F 计算得到的 不是10ms啊:$…

查看全部问答>

如何计算FPGA设计频率

我们的设计需要多大容量的芯片?我们的设计能跑多快?这是经常困扰工程师的两个问题.对于前一个问题,我们可能还能先以一个比较大的芯片实现原型,待原型完成再选用大小合适的芯片实现.对于后者,我们需要一个比较精确的预估,我们的设计能跑50M,100M 还 ...…

查看全部问答>

怎样根据原理图编写VHDL程序

怎样根据原理图编写VHDL程序…

查看全部问答>