51单片机-数码管显示函数

发布者:HarmoniousVibes最新更新时间:2021-08-21 来源: eefocus关键字:51单片机  数码管  显示函数 手机看文章 扫描二维码
随时随地手机看文章

1.代码选择

有时我们需要6个数码管显示我们想要看到的数字,比如计算结果呈现在数码管上,然而当要显示的数为“520”时又不想前面的3个数码管亮(也就是高位为0不显示),我们把这部分功能代码封装为带参数的函数,传入的参数就是要显示的数值。参数定义的是unsigned long类型,也就是支持0~4294967296的数值(2的32次方等于4294967296)。

示例1:

void ShowNumber(u32 num)

{

    LedBuff[0]=LedChar[num%10];

    LedBuff[1]=LedChar[(num/10)%10];

    LedBuff[2]=LedChar[(num/100)%10];

    LedBuff[3]=LedChar[(num/1000)%10];

    LedBuff[4]=LedChar[(num/10000)%10];

    LedBuff[5]=LedChar[(num/100000)%10];

    if(num<100000)LedBuff[5] = 0xFF;

    if(num<10000) LedBuff[4] = 0xFF;

    if(num<1000)  LedBuff[3] = 0xFF;

    if(num<100)   LedBuff[2] = 0xFF;

    if(num<10)    LedBuff[1] = 0xFF;

}


示例2:


void ShowNumber(u32 num)

{

    u32 i;

    u8 x=5;//每次被调用都会从5开始 

    for(i=100000;i>0;i/=10)

    { 

        if(num        else LedBuff[x]=LedChar[(num/i)%10];

        x--;

    }   

}


这两段代码都能实现我们想要的功能,示例1可读性强,让人一看就明白了代码的作用。而示例2书写量少,比较简洁,但在阅读理解上需要我们转一下弯,笔者测试了这两段代码的执行时间,发现示例1比示例2快5ms左右,这种情况下毫无疑问我们肯定是选择示例1暂时作为实用代码。

可是在后期的教程中用到定时器中断来扫描数码管显示时,示例1的代码效果不尽人意,关于漏洞在哪大家后面可以尝试自己寻找。

在使用示例2时虽然显示效果比示例1的好,但是费时长,所以这两段代码都不是实用型代码。

 

2.代码参考

参考了宋老师的这部分代码以及测试结果都非常高效,所以我们选择这部分代码作为实用型代码。

void ShowNumber(u32 num)

{

    char i;//取值范围-128~127

    u8 buf[6];    

    for (i=0; i<6; i++)    //把长整型数转换为6位十进制的数组

    {

        buf[i] = num % 10;

        num = num / 10;    //舍掉个位数,重新装载

    }

    for (i=5; i>=1; i--)   //从最高位起,遇到0填充不显示的代码,遇到非0则退出循环

    {

        if (buf[i] == 0)

            LedBuff[i] = 0xFF;

        else

            break;

    }

    for ( ; i>=0; i--)     //剩余低位都如实转换为数码管显示字符

    {

        LedBuff[i] = LedChar[buf[i]];

    }

}


这部分代码我们来举个例子理解,假如传入的参数为125,第一个for循环就是实现以下功能

buf[5]=0; buf[4]=0; buf[3]=0; buf[2]=1; buf[1]=2; buf[0]=5;

第二个for循环i等于2之后就退出了循环,第三个for循环i是等于2,然后填充好要显示的1,2,5给数码管缓存区。


关键字:51单片机  数码管  显示函数 引用地址:51单片机-数码管显示函数

上一篇:51单片机-模块初始化
下一篇:51单片机-多文件编程首次测试

推荐阅读最新更新时间:2024-11-12 23:22

简述MCS51单片机的中断响应过程
单片机一旦响应 中断 请求, 就由硬件完成以下功能: (1) 根据响应的中断源的中断优先级, 使相应的优先级状态触发器置1; (2) 执行硬件中断服务子程序调用, 并把当前程序计数器PC的内容压入堆栈,保护断点,寻找中断源; (3) 清除相应的中断请求标志位(串行口中断请求标志RI和TI除外); (4) 把被响应的中断源所对应的中断服务程序的入口地址(中断矢量)送入PC, 从而转入相应的中断服务程序。 (5)中断返回,程序返回断点处继续执行。
[单片机]
51单片机项目设计:WiFi视频小车制作
百度网盘资料链接:https://pan.baidu.com/s/1Qxm7A7pz6ktaHefDTkzhwg 提取码:c3ol CSDN资料下载链接:https://download.csdn.net/download/mbs520/13134025 取走记得点赞~ 一、材料准备 1、核心装备:wifi摄像头模块 名称:正点原子WiFi摄像头模块 简介:minifly四轴配套模块,体积小重量轻、WiFi通信60米距离 、720 30帧高清画面 2、电机选择 名称:霍尔编码电机 型号:620转 这里用直流电机即可,这个贵,网上搜直流减速电机,最好带个轮子,方便安装 3、小车框架 博主这个就直接锯木板了
[单片机]
<font color='red'>51单片机</font>项目设计:WiFi视频小车制作
51单片机实验2:led灯闪烁
开发板led模块电路图如下: 在keil中,sbit的声明要放在全局变量的位置,若放在函数中,会报错。 延时函数的变量使用unsigned char,而不是int,因为char所占空间为1字节,为int所占空间为4字节,因此使用char可以节约内存。但是unsigned char仅能表示0~255,所以延时函数中的参数最大为255,若要更大,则使用int。 #include reg52.h #include intrins.h #define uc unsigned char sbit led1=P2^0; void delay(uc n) { uc i,j; for(i=1;i =n;i++) fo
[单片机]
<font color='red'>51单片机</font>实验2:led灯闪烁
谈谈51单片机的RETI指令
  最近在基于51 单片机 编程的过程中出现了个很奇怪的问题 程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断 。   在有过单片机中断编程经历者都知道当EA=1,ET0=1的条件下,满足TF0=1时,如果在此期间没有更高优先级的中断执行的情况下定时器中断0必定会产生中断响应。而在我所编写的程序中仅使用了定时器中断0,一个中断也就谈不上存在优先级问题。经过我对自己程序的检查并对各教材中断程序对比发现我的程序中的一个问题:由于中断的不可控性决定其跳出中断返回主程序的不确定,而由于程序需要中断跳出后能跳到指定的地址。为了解决这个问题我在中断结束的地方直接用了无条件跳转指令 LJMP ADR16 其
[单片机]
有关51单片机晶振的问题总结
  晶振是什么?全称是石英晶体振荡器,是一种高精度和高稳定度的振荡器。通过一定的外接电路来,可以生成频率和峰值稳定的正弦波。而单片机在运行的时候,需要一个脉冲信号,做为自己执行指令的触发信号,可以简单的想象为:单片机收到一个脉冲,就执行一次或多次指令。   在初学51单片机的时候,总是伴随很多有关与晶振的问题,其实晶振就是如同人的心脏,是血液的是脉搏,把单片机的晶振问题搞明白了,51单片机的其他问题迎刃而解。   一,为什么51单片机爱用11.0592MHZ晶振?   其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振
[单片机]
两位数码管动态显示汇编程序+电路图
采用51单片机汇编语言驱动 下面是电路图: ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV P0,#00H SETB P2.6 SETB P2.7 MOV R0,#00H MOV R1,#00H MOV R2,#888 MOV R3,#0AH MOV R4,#0AH MOV DPTR,#TABLE L0: MOV A,R0 MOVC A,@A+DPTR MOV P2,#040H MOV P0,A ACALL DELAY MOV A,R1 MOVC A,@A+DPTR MOV P2,#80H MOV P0,A ACALL DELA
[单片机]
两位<font color='red'>数码管</font>动态<font color='red'>显示</font>汇编程序+电路图
C51单片机学习笔记之数码管
简介 数码管分为共阴数码管和共阳数码管。简单说就是所有阴极共用一个引脚或所有阳极共用一个引脚。 用共阴数码管举例:A,B,C,D,E,F,G对应数码管的段。1,2,3,4对应数码管的位。共阴数码管高电平时段有效,低电平时位有效。共阳数码管反之,低电平段有效,高电平位有效。 数码管对应的字符 共阴 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 0x77, // A 0x7C,
[单片机]
C<font color='red'>51单片机</font>学习笔记之<font color='red'>数码管</font>
基于51单片机的超声波液位控制器设计
一.硬件方案 利用超声波传输中距离与时间的关系,采用8051单片机进行控制及数据处理,设计出了能精确测量两点间距离的超声波液位检测系统。并通过液位的高低开,通过控制继电器,选择注水或者放水。 主要由51单片机+HC-SR04超声波传感器+LCD1602液晶+水泵+按键+蜂鸣器+继电器设计而成;如图: 二.设计功能 (1)本设计中液晶显示有4个字母,分别为 H------容器的最高水位设定值(不能高于实际高度) L------容器的最低水位设定值 D-----容器实际高度(可以设置) C-----容器内液体的高度(在实际演示中,障碍物离探头越近,液晶C显示越大,因为障碍物好比液面,离探头近了说明水位高了) (2)如果容器实际
[单片机]
基于<font color='red'>51单片机</font>的超声波液位控制器设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved