标题: 为什么这个单片机程序的计算答案不是显示1650 [打印本页]

作者: kscheang    时间: 2021-11-4 00:07
标题: 为什么这个单片机程序的计算答案不是显示1650
本人刚刚学习51单片机, 做了一个显示 30 X 55 答案的小程序,
但显示的答案 不是 1650 而是 1672,
请问我错在哪里?
谢谢
(我用的是普中单片机开发板)

#include<reg52.h>
#include<intrins.h>


sbit HC138_A = P1^0;
sbit HC138_B = P1^1;
sbit HC138_C = P1^2;

unsigned char code smgduan[10]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0Xff};


void delay7ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=26;b>0;b--)
for(a=133;a>0;a--);
}


void main()
{
unsigned char x = 30;
unsigned char y = 55;
unsigned int z;
z = x*y;


while(1)
{
HC138_A = 1; HC138_B = 1; HC138_C = 0; P0 = smgduan[z/1000]; delay7ms();
HC138_A = 0; HC138_B = 1; HC138_C = 0; P0 = smgduan[(z%1000)/100]; delay7ms();
HC138_A = 1; HC138_B = 0; HC138_C = 0; P0 = smgduan[(z%100)/10]; delay7ms();
HC138_A = 0; HC138_B = 0; HC138_C = 0; P0 = smgduan[z%10]; delay7ms();
}
}

IMG_20211103_235121.jpg (280.41 KB, 下载次数: 64)

IMG_20211103_235121.jpg

C6-4.pdf

45.29 KB, 下载次数: 5


作者: wulin    时间: 2021-11-4 06:34
计算结果本身没有错,是显示出错。你驱动数码管的段码和位码错位。把1650显示成2761,位序反后2761就成1672。
作者: munuc_w    时间: 2021-11-4 08:22
检查一下段吗。
作者: glinfei    时间: 2021-11-4 08:35
x,y定义的是char,你结果又超出255,所以答案就不可测,需要看编译器怎么翻译的,你可以通过强制类转换方式计算。
作者: wps10025    时间: 2021-11-4 09:04
查你的显示函数

无标题.jpg (205.8 KB, 下载次数: 50)

无标题.jpg

无标题1.jpg (189.26 KB, 下载次数: 46)

无标题1.jpg

作者: 13205495918    时间: 2021-11-4 09:11
你四位数提取每一位的计算对吗???我咋觉得不太对哎。
作者: NCUTER    时间: 2021-11-4 09:39
可能用于显示的代码出问题了
作者: kscheang    时间: 2021-11-4 12:22
#include<reg52.h>
#include<intrins.h>

sbit HC138_A = P1^0;
sbit HC138_B = P1^1;
sbit HC138_C = P1^2;

unsigned char code smgduan[10]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0Xff};

void delay7ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=26;b>0;b--)
            for(a=133;a>0;a--);
}

void main()
{
        unsigned int x = 32;
        unsigned int y = 54;
        unsigned int z;
        z = x*y;                 //答案 1728

       
        while(1)
        {
        P0 = 0X00;
        HC138_A = 0; HC138_B = 0; HC138_C = 0; P0 = smgduan[z/1000]; delay7ms();
        }
}

谢谢各位
这次我更加混乱了
我用另一个乘法公式, 答案应该是 1728
我就显示 千位数, 应该显示 1的, 但为什么显示 2?
是 四舍五入 吗? 如何解决呢?

IMG_20211104_121914.jpg (258.05 KB, 下载次数: 47)

IMG_20211104_121914.jpg

作者: devcang    时间: 2021-11-4 12:29
取各位的代码,应该要改一下
z/1000%10//千位
z/100%10//百位
z/10%10//十位
z%10  //个位,最低位

作者: kscheang    时间: 2021-11-4 13:09
谢谢
但修改了还是显示 2

                while(1)
                {
                        P0 = 0X00;
                        HC138_A = 0; HC138_B = 0; HC138_C = 0; P0 = smgduan[z/1000%10]; delay7ms();
                }
作者: wulin    时间: 2021-11-4 13:32
kscheang 发表于 2021-11-4 13:09
谢谢
但修改了还是显示 2


已经明确的告诉你问题出在段码和位码,还在瞎折腾。数组前面少了0x3f,后面多了0xff。位码低位高位顺序反了。
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. sbit HC138_A = P1^0;
  4. sbit HC138_B = P1^1;
  5. sbit HC138_C = P1^2;

  6. unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  7. void delay7ms(void) //误差 0us
  8. {
  9. unsigned char a,b,c;
  10. for(c=1;c>0;c--)
  11. for(b=26;b>0;b--)
  12. for(a=133;a>0;a--);
  13. }


  14. void main()
  15. {
  16.         unsigned char x = 30;
  17.         unsigned char y = 55;
  18.         unsigned int z;
  19.         z = x*y;
  20.         while(1)
  21.         {
  22.                 HC138_A = 0; HC138_B = 0; HC138_C = 0; P0 = smgduan[z%10]; delay7ms();
  23.                 HC138_A = 1; HC138_B = 0; HC138_C = 0; P0 = smgduan[z/10%10]; delay7ms();
  24.                 HC138_A = 0; HC138_B = 1; HC138_C = 0; P0 = smgduan[z/100%10]; delay7ms();
  25.                 HC138_A = 1; HC138_B = 1; HC138_C = 0; P0 = smgduan[z/1000%10]; delay7ms();
  26.         }
  27. }
复制代码








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1