找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2352|回复: 9
收起左侧

51单片机数码管最多显示到511

[复制链接]
ID:1059056 发表于 2022-12-24 22:06 | 显示全部楼层 |阅读模式
新人刚开始学51,想写一个模块化的数码管显示,起初用的是unsigned char,发现位数不够后更改为unsigned int,现在最多却只能显示到511,在输入为1时显示257,求大佬帮助。
#include <reg52.h>
#include "Delay.h"
sbit SMG_DU = P2^6;
sbit SMG_WE = P2^7;
unsigned char SMG_D[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}
unsigned char SMG_W[] = {0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}
void SMG_Display(unsigned int NUM)
{
        unsigned int SMG_TEMP;
        unsigned char SMG_i=0;
        SMG_TEMP=NUM;
        while(SMG_TEMP)
        {
                P0=0xFF;
                SMG_WE=1;
                P0=SMG_W[SMG_i];
                SMG_WE=0;
                P0=0x00;
                SMG_DU=1;
                P0=SMG_D[SMG_TEMP%10];
                Delay(1);
                SMG_DU=0;
                SMG_TEMP/=10;
                SMG_i++;
        }
}

回复

使用道具 举报

ID:213173 发表于 2022-12-25 14:24 | 显示全部楼层
改这样试试
  1. void SMG_Display(unsigned int NUM)
  2. {
  3.         static unsigned char i=0;

  4.         P0=0xFF;
  5.         SMG_WE=1;
  6.         SMG_WE=0;
  7.         switch(i)
  8.         {
  9.                 case 0: P0=SMG_D[NUM%10]; break;
  10.                 case 1: P0=SMG_D[NUM/10%10]; break;
  11.                 case 2: P0=SMG_D[NUM/100%10]; break;
  12.                 case 3: P0=SMG_D[NUM/1000%10]; break;
  13.                 default:P0=0X00; break;
  14.         }
  15.         SMG_DU=1;
  16.         SMG_DU=0;
  17.         P0=SMG_W[i];
  18.         SMG_WE=1;
  19.         SMG_WE=0;
  20.         i=++i%8;
  21. }
复制代码
回复

使用道具 举报

ID:883242 发表于 2022-12-25 20:05 | 显示全部楼层
你贴的这段代码没有问题,问题应该在调用这段代码的位置,你没有贴出来。
回复

使用道具 举报

ID:1059056 发表于 2022-12-26 20:57 | 显示全部楼层
Hephaestus 发表于 2022-12-25 20:05
你贴的这段代码没有问题,问题应该在调用这段代码的位置,你没有贴出来。

#include <reg52.h>
#include <intrins.h>
#include "Delay.h"
#include "SMG.h"
void timer0()
{
        ET0=1;
        EA=1;
        TR0=1;
        TMOD=0X01;
        TH0=0XFC;
        TL0=0X52;
}
void main(){
        timer0();
        while(1){
        }
}
void sb()interrupt 1
{
        TH0=0xFC;
        TL0=0X52;
        SMG_Display(123);
}
我也很疑惑啊,感觉这部分也没有什么问题啊
回复

使用道具 举报

ID:1059056 发表于 2022-12-26 20:59 | 显示全部楼层
Hephaestus 发表于 2022-12-25 20:05
你贴的这段代码没有问题,问题应该在调用这段代码的位置,你没有贴出来。

看来还真是,刚刚改成了楼上大佬的,同样也有问题
回复

使用道具 举报

ID:1059056 发表于 2022-12-26 20:59 | 显示全部楼层

感谢,我先试一下
回复

使用道具 举报

ID:883242 发表于 2022-12-26 22:08 | 显示全部楼层
Er1Zp 发表于 2022-12-26 20:57
#include
#include
#include "Delay.h"

你代码只是塞一个常数,而不是变量,那就一点儿办法都没有了。
回复

使用道具 举报

ID:77589 发表于 2022-12-27 10:23 | 显示全部楼层
我单从程序上看不出来问题,可以的话贴个电路图出来,看看软件和硬件匹配不?
回复

使用道具 举报

ID:1059056 发表于 2022-12-28 19:47 | 显示全部楼层
Hephaestus 发表于 2022-12-26 22:08
你代码只是塞一个常数,而不是变量,那就一点儿办法都没有了。

塞一个变量给一样的值还是有问题,不知道到底是为什么
回复

使用道具 举报

ID:1059056 发表于 2022-12-28 19:47 | 显示全部楼层
Longan.Wang 发表于 2022-12-27 10:23
我单从程序上看不出来问题,可以的话贴个电路图出来,看看软件和硬件匹配不?

1.png
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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