找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12638|回复: 4
打印 上一主题 下一主题
收起左侧

C语言编程:如何分离一个多位数数字

[复制链接]
跳转到指定楼层
楼主
摘要: 数码管是电子设计之中最常用的显示元器件,但是数码管一次只能显示一个数字,如果要显示多位数字只能使用多个数码管并且要把数字拆分开,一位一位的送到数码管中才能显示,今天就介绍把一个多位数字拆分的方法。 ... ...




数码管是电子设计之中最常用的显示元器件,但是数码管一次只能显示一个数字,如果要显示多位数字只能使用多个数码管并且要把数字拆分开,一位一位的送到数码管中才能显示,今天就介绍把一个多位数字拆分的方法。

把一个多位数拆分要用到两个运算符“/”除法运算符和“%”取余运算符:

/:得到的运算结果是整数,68/10=6;
%:得到的运算结果是余数,68%10=8;

是不是有点意思。

比如要显示524这个三位数,下面讲解这个数字的拆分算法。

百位:524/100 = 5;
十位:524%100=24;24/10=2;
各位:524%100=24;24%10=4;

通过这个例子是不是找出规律来了?简写入下:

百位:524/100 = 5;
十位:524%100/10=2;
各位:524%100%10=4;

再举一个四位数的例子,拆分6893如下:

千位:6893/1000=6;
百位:6893%1000/100 = 8;
十位:6893%1000%100/10 = 9;
各位:6893%1000%100%10 = 3;

是不是分离出来了?这时候就可以把数据送到数码管显示了。

以上分离方法只是众多分离方法中的一种,在使用的时候可以在纸上简单算一下,结果就很容易出来了。想要了解数码管是如何工作的,请点击这里




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:692711 发表于 2020-2-27 08:43 来自手机 | 只看该作者
接着在往下写点吧谢谢您   我在回来看  我咋回来我是路痴
回复

使用道具 举报

板凳
ID:535242 发表于 2020-2-27 21:31 | 只看该作者
怎么感觉公式每总结出来
回复

使用道具 举报

地板
ID:407089 发表于 2020-2-28 09:33 | 只看该作者
提供一个正整数的数码管解决方案,供参考。
  1. /*
  2.   本程序是在数码管上显示正整数的例程,显示数字长度不超过8位(需要定义无符号长整型变量)
  3. */

  4. #include <reg52.h>
  5. #include <math.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>

  8. typedef unsigned char uint8;        //8位无符号型
  9. typedef unsigned char uchar;        //8位无符号型
  10. typedef unsigned int uint16;
  11. typedef unsigned long uint32;

  12. #define DATA P0
  13. sbit KEY_S2 = P3^0;                //S2独立按键
  14. sbit KEY_S3 = P3^1;                //S3独立按键
  15. sbit seg_sel = P2^6;
  16. sbit bit_sel = P2^7;

  17. //共阴极数码管0-9编码
  18. uchar code seg_tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  19. uchar code bit_tab[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

  20. //将要被显示的数字(只要不是大于8位的正整数均可)
  21. uint32 birthday = 508;

  22. //用于保存数字对应数码管编码的数组
  23. uchar num_code[8] = {0};

  24. void delay(uint16 num)
  25. {
  26.         uint16 x,y;
  27.         for(x=num; x>0; x--) for(y=110; y>0; y--){}
  28. }

  29. //拆分整数到num_code数组
  30. void int2code(uint32 inum)
  31. {
  32.         uint8 i=0, n;
  33.         uint32 tmp = inum;

  34.         for(i=0; i<8; i++)
  35.         {
  36.                
  37.                 if(tmp>0)
  38.                 {       
  39.                         n = tmp % 10;
  40.                         tmp = (tmp-n) / 10;
  41.                         num_code[7-i] = seg_tab[n];
  42.                 }else{
  43.                         num_code[i] = 0x00;
  44.                 }                                    
  45.         }
  46. }

  47. //8位数码管显示函数
  48. void display(void)
  49. {
  50.         uint8 j = 0;
  51.         for (j=0; j<8; j++)
  52.         {
  53.                 //移位
  54.                 bit_sel = 1;
  55.                 DATA = bit_tab[j];
  56.                 bit_sel = 0;

  57.                 //显数
  58.                 seg_sel = 1;
  59.                 DATA = num_code[j];
  60.                 delay(1);
  61.                
  62.                 //消影(共阳极则为0xff,就是让所有数码管暂时不亮)
  63.                 DATA = 0x00;
  64.                 seg_sel = 0;
  65.         }
  66. }

  67. void main(void)
  68. {

  69.         while(1)
  70.         {
  71.                 int2code(birthday);
  72.                
  73.                 display();
  74.                
  75.                 if (KEY_S2==0)
  76.                 {
  77.                         delay(10);
  78.                         if (KEY_S2==0){
  79.                                 birthday++;
  80.                         }
  81.                         while(!KEY_S2);
  82.                 }
  83.         }
  84. }
复制代码



回复

使用道具 举报

5#
ID:476527 发表于 2020-2-28 13:48 | 只看该作者
分离个位只需要直接%10就行了,为何还要先%100再%10?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表