请问51单片机数码管怎么从左到右显示出我想要的数?比如1572942(没有规律)这部分该怎么写?

主要显示出来的框架会写,目前只会写1234567,就是不知道该怎么让我想要的数字显示出来~求解!谢谢!

能显示1234567,说明你已经会动态扫描了;只是显示的是固定的值。你现在要做的就是实现任意数,那么你首先需要做一个数据,你看根据你显示的数值是0-9还是还有其他字符,我就以你只显示纯数字吧,就是0-9 ,那么你需要定义一个数组,有10个成员,从0-9 分别对应LED的段码, 这个段码具体根据你使用共阴或者共阳LED以及你IO口的接法有关,我就以你能显示1234567来说,你定义LEDTABLE[10]={ A,B,C,D,E,F,G,H,I,J},其中B=你显示1时的数据(段码),其他的雷同;把这十个数据都弄对,然后显示任意数的时候只需用这个数组的数据即可;比如显示312,那么第三个显示LEDTABLE[3] ,第二个LEDTABLE[1]……对于一个数据你只要把每一位分离出来就行了,比如312 ,第一个数字就是312/100 ,第二个就是 312%100/10 ,第三位就是312%10.其他的如法炮制。提醒,我这里没有加多余的段码,比如熄灭以及显示其他字符,你自己加上即可。
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-12-12

下面程序显示1572942动态显示,[]这个或号里填什么数字,就会在数码管上显示什么数,程序太长,数字有限,私信给你了。

追答

#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uint);
void main()
{
while(1)
{
dula=1;
P0=table[1];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(500);

dula=1;
P0=table[5];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(500);

dula=1;
P0=table[7];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(500);

dula=1;
P0=table[2];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(500);

dula=1;
P0=table[9];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(500);

dula=1;
P0=table[4];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;//
wela=0;
delayms(500);

dula=1;
P0=table[2];
dula=0;
P0=0xff;
wela=1;
P0=0xBF;
wela=0;
delayms(500);

}
}

void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--) ;
}

追问

谢谢你!请问在我这个基础上该怎么改动啊?目前学的很浅,没有看懂你写的部分内容

追答

sbit dula=P2Λ6//申明U1锁存器的锁存端sbit dula=P2Λ7/申明U2锁存器的锁存端P0=table[1]//送段选数据 dula=1打开U1锁存器dula=0//关闭U1锁存器
P0=0xff//送位选数据前关闭所有显示,防止打开位选锁存器wela=1原来段选数据通过位选锁存器造成混乱P0=0xfe送位选数据,delayms(500)廷时
wela=1打开U2锁存端wela=0关闭……

proteus仿真一下,就了解了

搞错了是申明U2U3锁存器

你要改动话([]里的1572942)改成1234567就行了

追问

好的谢谢你…让我看看

本回答被网友采纳
第2个回答  2018-12-12
如果你要显示的数是常量,直接写入数组即可,如果是变量就 要进行计算,分离出个十百千万
如常量 uchar TABLE[ 8]={1,2,3,4,5,6,7,8}
变量 x 如果是7位数 则 最高位是 百万位 x/1000000%10 十万位 x/100000%10 万位 x/10000%10 千位 x/1000%10 百位 x/100%10 十位 x/10%10 个位 x%10,然后查表送七段码即可追问

请问我该怎么修改呢?这个是从左到右显示1234567的,怎么写才能从左到右显示我想要的七个数呢?

追答

SWITCH语句即是控制显示哪一位
P0=smgduan[i]就是要显示的内容,由于你把显示的位数和显示的内容固定死了,因此只能显示固定的数字 且0 和9就 无法显示
改成P0=smgduan[ a[i] ]
a[i]是个数组,存的是你从变量里分离出来的个十 百千 万,成员数量不多于8个,因你只有8 个数码管,这个数组里的每一个成员数值范围都在0到9之间
所以smgduan[ ]这个数组至少有10个元素,存0到9这10个数字的段码,而不仅仅是0到7或1到8
则开始不会写动态扫描程序,先用笨办法,让某一数码管亮或某2个数码管亮,显示出你想要的内容,而不是直接来个FOR循环,看起来很简洁,却限制了你的想像

追问

请问keil4里数组该怎么定义啊?该怎么编写?可不可以麻烦你具体写一下

追答

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};//共阴七段码表
void display(uint num )// 5位显示程序 uint型数据最大65535
{
uchar a0,a1,a2,a3,a4;
a0=num/1000;//万位
a1=num/1000%10;//千位
a2=num/100%10;//百位
a3=num/10%10;//十位
a4=num%10;//个位
LSA=1;LSB=1;LSC=1;
P0=table[a0];//显示万位
delayms(1);
LSA=0;LSB=1;LSC=1;
P0=table[a1];//显示千位
delayms(1);
LSA=1;LSB=0;LSC=1;
P0=table[a2];//显示百位
delayms(1);
LSA=0;LSB=0;LSC=1;
P0=table[a3];//显示十位
delayms(1);
LSA=1;LSB=1;LSC=0;
P0=table[a4];//显示个位
delayms(1);
}
当然用数组后再用for循环会更简单

第3个回答  2018-12-12
可以增加一个数组,数组元素的值可以是没规律的,然后按数组的顺序调取相应的段码并送数码管显示即可。追问

请问我该怎么修改呢?这个是从左到右显示1234567的,怎么写才能从左到右显示我想要的七个数呢?

追答

这能想办法改红圈中的i。

这段程序应该显示8位的,怎么说是7个呢?

追问

我也很懵,我要写的是在这个基础上改进的。要求的是从左到右显示7个数

追答

发完整的程序

追问

可以教教我怎么编写从左到右显示我想要的七个数字吗?

unsigned的那一行是多打的,删除了

code

追答

你想显示那七个数字?

在延时函数前加一个数组

u8 code xs_data[7]={ 7,5,6,8,3,1,2 };

然后将前面给你圈过的位置把i改成xs_data[i]

追问

啊谢谢你!!成功了

请问有什么不会的我可以继续私信问你吗

本回答被提问者采纳
相似回答