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

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

能显示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、首先,要把代码写好,点亮数码管

2、代码写完后,要确认原先写好的代码是不是正确的。

3、确认代码无误后,进入下一步,就是在这一行代码(箭头所指)的地方,将这四个字删去。

4、然后如图所示,四个字已经删去,只要改成数字相应的代码即可。

5、这里改成的是代表数字0的代码,如图所示。

6、最后写好代码后,将生成的hex文件写进单片机,数码管显示的数字就变成0了。

原理上是可行的,但是有多余的设计,你的6只4511任何时间都在干同样的事情,为什么你不直接只用一个来做,怕驱动电流不够?反正你是做动态扫描的,74HC138每次只让18只数码管中的一只点亮,带1只数码管用1只4511驱动电流足够的啦,把所有数码管的段码引脚都并接在1只4511上即可。其实都上FPGA了还搞那么复杂的外围干嘛,7+18个端口直接驱动18只数码管就可以了,最多加一些缓冲元件扩流。

解决方法:
试验数码管上显示数字( 单片机直接实现位选 共阴极) 。
解决方式:
连接方法:P0与J12 用8PIN排线连接 P1与JP16 用排线连接 。
代码:
#include<reg52h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<113;y++)
{
}
}
}
unsigned int code dbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};
unsigned int code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void main()
{
while(1)
{
P1=dbit[4];
P0=num[9];
}
}
位定义
#include<reg52h>
#include<intrinsh>
#define uint unsigned int
#define uchar unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<113;y++)
{
}
}
}
void main()
{
while(1)
{
LSA=0;
LSB=0;
LSC=0;
P0=num[6];
delay(2);
LSA=1;
LSB=0;
LSC=0;
P0=num[6];
delay(2);
}
}
//让八个数码管全部亮并且从0~9循环
#include<reg52h>
#include<intrinsh>
#define uint unsigned int
#define uchar unsigned char
uchar num;
uchar wnum=0x00;
uchar code dbit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选,选择要显示的数字
//uchar code wnum[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//八位数码管
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<113;y++)
{
}
}
}
void main()
{
P1=wnum;
while(1)
{
for(num=0;num<10;num++)
{
P0=dbit[num];
delay(500);
}
}
}

数码管的显示分为两种方式:一种静态显示,一种动态显示。
以8个数码管显示“12345678”为例,说明如下:
静态显示:8个数码管同时点亮,显示的内容就是“12345678”。这种方式比较“笨”,容易理解,但是占用的资源较多。因一个数码管有7个段,电路则包含1个公共端和7个笔画端,要显示一个数字,需要8个电平输入控制口,8个数码管就需要88=64个。显然,这种方式不适合显示多位数。
动态显示:8个数码管依次显示,首先第1个显示“1”其余7个不点亮,然后第2个显示“2”其余7个不显示……依此类推,循环显示1至8位数字。由于人的眼睛识别闪烁的频率是有范围的,当8个数码管循环显示的频率足够高,人眼观察不到单个数码管的间断点亮,看到的现象是第1个数码管一直显示“1”,第2个一直显示“2”……第8个一直显示“8”,因此实现8个数码管显示不同的内容。动态显示相比静态显示占用的电平控制端口要少很多,因不同的数码管之间可以公共端口,例如7个笔画端共用,则只需要7个笔画端+8个公共端,15个端口即可。通常数码管显示都是采用的动态显示方式。
以上,不知道说清楚了没?~


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13356441.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-20
下一篇 2023-07-20

发表评论

登录后才能评论

评论列表(0条)

保存