历史上的今天
返回首页

历史上的今天

今天是:2025年08月17日(星期日)

2021年08月17日 | 51单片机-数组&数码管

2021-08-17 来源:eefocus

1.回顾

大家还记得我们用数组来存取流水灯的状态值吗,那么数码管也是一样的,我们可以知道数码管能显示出在单片机编程中最常见的数字和字母为0~9,A,b,C,d,E,F这16种状态,那么这一讲我们实现单个数码管从0到F间隔一秒来循环显示。

 

2.单片机内存

首先要知道我们写的程序是占用内存的,这些内存就是单片机内部的FLASH。


STC89C52RC芯片中用来存放程序代码的FLASH内存为8K字节(8192字节)。


而初始化的数组的内存都是存放在单片机的RAM中的,我们平时定义的变量也都是占用RAM的,因为定义的变量数值是要改变的,所以这些变量只能存放在RAM中。


但STC89C52RC芯片中RAM的内存很小,只有512个字节,且这些内存相当珍贵。而让数码管显示的16种状态值我们不用改变它的值,它们只起到赋值作用而已,所以为了不占用珍贵的RAM资源,我们把这16种状态的值(也就是16个字节)存放在FLASH中,因为FLASH的内存比较大。


可能对计算机基础知识相对薄弱的同学来说,对上面的知识点比较模糊,这里笔者建议阅读一下《手把手教你学51单片机》文档2.1节,10.4节。

 

3.code的用法

拿我们以前讲的数组存放流水灯状态值的初始化来说

unsigned char LEDSET[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

如果把这8个字节的内存放到FLASH中,只需加多code即可

unsigned char code LEDSET[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

详细了解请看文档的5.3.3节,6.1.1节,6.1.4节,12.3.1节。

 

4.真值表

共阳数码管的0~9,A,b,C,d,E,F 这16种状态值如下

0:0xC0

1:0xF9

2:0xA4

3:0xB0

4:0x99

5:0x92

6:0x82

7:0xF8

8:0x80

9:0x90

A:0x88

b:0x83

C:0xC6

d:0xA1

E:0x86

F:0x8E

 

数组初始化:

unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化

 

5.代码

像这种加入code关键字来存放在FLASH中的代码我们写在最开始的函数外部。

实现数码管从0到F间隔一秒循环显示的代码如下


#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

  

unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化

 

void delay_ms(unsigned int x)

{

    unsigned int i,j;

    if(x==1000)

    {

        for(i=0;i<19601;i++)//延时1s

        {

            for(j=5;j>0;j--);

        }

    }

    else while(x--)for(j=115;j>0;j--);

}

 

void main()

{  

    unsigned char i=0;

    ADDR3 = 1;//使能三八译码器

    ENLED = 0;// 

   

    ADDR2 = 0;//**************************

    ADDR1 = 0;//让三八译码器的IO0输出低电平

    ADDR0 = 0;//**************************

     

    while(1)

    {

        P0=LedChar[i];

        delay_ms(1000);//延时1s

        i++;

        if(i>=16)i=0;  //让i在0~15之间变化

    }

}


推荐阅读

史海拾趣

ENERGIZER公司的发展小趣事

随着环保意识的日益增强,ENERGIZER也积极响应环保号召,致力于研发更环保的电池产品。1988年,公司发明了无汞环保碱性电池,这一创新性的产品不仅性能优良,而且对环境友好,受到了消费者的广泛欢迎。同时,ENERGIZER还积极推广电池回收和再利用的理念,倡导绿色消费,为全球的环保事业做出了积极贡献。

First Switchtech公司的发展小趣事

为了应对原材料成本上涨和市场竞争加剧的挑战,First Switchtech公司(或类似公司)实施了供应链优化策略。公司通过与上游供应商建立长期合作关系,实现了原材料的稳定供应和成本的有效控制。同时,公司还引入了先进的生产管理系统,提高了生产效率和产品质量。这些措施不仅降低了产品的生产成本,还增强了公司的市场竞争力。

GREEGOO公司的发展小趣事
加大时钟信号线路的电线直径,降低线路的电阻和电容,从而减少信号的衰减。
DCD [Digital Core Design]公司的发展小趣事

在快速变化的市场环境中,创新成为DCD公司持续发展的关键。公司不断加大研发投入,鼓励员工提出创新性的想法和建议。同时,公司还积极引进国内外先进的技术和管理经验,为公司的发展注入了新的活力。在创新驱动下,DCD公司不断推出具有竞争力的新产品和解决方案,赢得了客户的广泛赞誉和市场的持续认可。

EEMB Co Ltd公司的发展小趣事

EEMB集团一直非常重视企业文化和团队建设。公司注重培养员工的创新意识和团队精神,为员工提供了良好的工作环境和发展机会。同时,公司也积极履行社会责任,关注环保和公益事业,为社会做出了积极贡献。这些举措不仅增强了公司的凝聚力和向心力,也为公司的可持续发展奠定了坚实基础。

请注意,以上故事是基于公开信息和一般情况下的假设而编写的,可能与EEMB Co Ltd公司的实际发展情况存在差异。

DB Lectro Inc公司的发展小趣事

为了满足亚洲市场的需求,DB Lectro Inc决定在中国上海设立子公司及工厂。这一战略举措不仅使公司能够更贴近亚洲客户,还大大降低了生产成本。在上海工厂的建设过程中,公司充分考虑到环保和可持续性发展的要求,采用了先进的生产工艺和设备。随着工厂的投产和产能的不断提升,DB Lectro Inc的产品在亚洲市场的占有率也稳步上升。

问答坊 | AI 解惑

wince系统在读外围寄存器时,有时候会出现挂起的现象,为什么?

wince系统在读外围寄存器时,有时候会出现挂起的现象,为什么?什么原因会导致系统挂起呢?…

查看全部问答>

昨天收到MCU DAY承诺的msp430无线模块

    板子做的很精致  连电池都送来了。一个收一个发。有时间可以开发开发。…

查看全部问答>

STM32USB问题急救!!

各位大侠,小弟现在在用USB,碰到一个纠结的问题。 我是将usb虚拟成串口来用的,现象是:电脑上插上一个这样的usb设备正常,能识别出com口,但是有时如果插上2个或3个或者以上同样设备的时候就出现识别不了com口的情况,请问这是什么原因? ...…

查看全部问答>

关于verilog中的数据反馈问题

各位前辈,晚生目前写代码遇到一个问题,很头疼,不知如何解决,还请明示: 我用一个ram作转发操作,目前的思路是, 用一个含有7个reg的memory依次记录每条数据写入ram的地址头,然后再通过这些地址头去寻址读取数据,但是读取完成之后我想反馈给 ...…

查看全部问答>

【设计工具】FPGA电源设计工具

瞬间建立FPGA电源设计 WEBENCH FPGA 电源架构设计工具包含了来自Altera、Xilinx、Actel 和 Lattice最新FPGA器件的详细电源要求,高效能的FPGA电源供应器一般比较复杂,设计人员在设计独特的多重电压级时需满足精准的电压、电流、 纹波、噪 ...…

查看全部问答>

Multisim 的示波器显示速度很快,要如何慢下来?

大家好: 我在操作 Multisim 的示波器时发觉画面闪得很快,不知道有没有什么方法可以让画面显示平稳一点,或是慢动作播放,谢谢。…

查看全部问答>

谁能告诉我,C2000的LAUNCHPAD板子如何下载程序?如何在线调试?

谁能告诉我,C2000的LAUNCHPAD板子如何下载程序?如何在线调试?上次从论坛得了一C2000的开发板,最近论坛在宣传培训C2000板子。于是哥填了根内存条(原来是1G的),装好之后,按照大神们的资料学习。看了半天,试了半天,但不知道如何实现程序下载 ...…

查看全部问答>

M0 是如何跳转到main函数的?

复位: Reset_Handler   PROC                 EXPORT  Reset_Handler             [WEAK]         ...…

查看全部问答>

【TI 无线主题征集】+Zigbee无线通知设备(CC2530)

最近做了一个使用Zigbee做生产线通知仓库送料设备。功能很简单,就是发送器按键按下,接收器接收到发送器数据后,报警并回应,发送器在接收到回应后,指示灯点亮表示数据发送成功。在这个过程中,遇到最大的问题就是传输距离的问题,因为在厂房内部 ...…

查看全部问答>

CCS5.4开发环境上内存出现这种问题怎么解决?

编译通过后,链接时出现这种错误不知道怎么解决,求大师指点,谢谢 …

查看全部问答>