51单片机数码管动态显示从右往左

51单片机数码管动态显示从右往左,第1张

这是四位数码管从右从左流动显示,像滚动字幕一样的。用不着矩阵按键哪。

其实程序很简单,没那么复杂。程序如下

#include <reg51h>

#define uchar unsigned char

#define uint  unsigned int

uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴段码码,0x00为灭

void delay()//延时子程序

{

uint y;

for(y=400;y>0;y--);

}

void main()

{

uchar n,x;

while(1)

{

n++;

if(n>50)//n为显示一屏显示次数,n大小可调节流动速度

{

n=0;

x++;//从下一个位置开始显示

if(x>8)x=0;

}

}

}

仿真结果

兄弟,你刚学的吧,不知道你是大学生还是非大学生的,如果是大学生的话我觉得我不应该回答了,俺只是说方法,不会给什么程序的,当然并不是程序简单我就不写,不是这样的,而是你要弄清电路的工作原理,弄清程序和电路的关系,弄清的硬件,结合程序看就应该能弄清楚了。

数码的显示方式:静态和动态

静态简单,动态是用扫描技术,进行扫描的,就是显示的数据是一样的,不过利用的扫描后,就造成显示的数据不一样了,原因是显示的速度是非常快的,人的眼是分辨不出的。而你的电路采用的静态显示,那么就是数码的共极部分,当然proteus里的数码应该是共阴极的吧,而阳极是送显示的数据,这样显示的方式是静态显示

P0 P2是数码管送显示的数据,当然这两数码管一个显示个位,一个显示十位,那么你要对显示的数据进行处理一下,比如是要显示99:

uint a,b;

uint k=99;

a=99/10;//这里只取十位而已,也就是9

b=99%10//这是求模,相当于数学里说的取余数

然后再将这a和b的数据指向一个数码管显示的代码数组[弄清数码管的显示就知道怎么写出显示代码了]

第一个是个位,先显示个位,数组的运用是利用下标控制的,我们用变量b控制下标。

第二个是十位,也是利用下标控制数组的。

当然这个变量k我们可以先不赋值,让它自增或自减从最大值一直减到最小,就是从99显示到0了,

当然你的电路有些浪费I/O口,两个数码管你把段全部连在一起不就行了,然后把共极各自连接I/O口,利用动态显示,你上图所示的,根本就是静态显示,浪费资源啊,当你在设计产品时是浪费I/O口的,

我认为应该是这样的,这样节省资源,控制也非常方便的,一点儿也不能,这个才是动态显示,利用动态扫描就搞定了,要不然会浪费资源的,俺的基础有限,再说也是自学的,也好久没弄51了,现在在做其经类型的MCU了,兄弟祝你学习有成。

注意要外接上拉电阻的,P0内部没带上拉电阻,要自己接上哦,俺没画上,你做实际产品时不要忘记了。

我估计出的效果不是01234567,而是一堆重影。

因为你一个数码管只有亮的 *** 作, 而没有灭的。

动态扫描的基本思路是:在同一个时间内,只有一个数码管是亮的。

你这个扫描方式也有问题,你可以把switchcase放到中断里面去,不需要放到死循环里。

然后在一开始进入中断的时候加上一句,P0=0x00;

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

//sbit dula=P2^6;

sbit wela1=P2^0;//位选

sbit wela2=P2^1;

sbit wela3=P2^2;

sbit wela4=P2^3;

void delay(uint);

uint a,b;

uchar num;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};//字符0123456789

void main()

{

while(1)

{

P0=0xea;

wela1=0;

wela2=1;

wela3=1;

wela4=1;//显示千位数

delay(1000);

P0=0xea;//数字

wela1=1;

wela2=0;

wela3=1;

wela4=1;//显示百位数

delay(1000);

P0=0xea;//数字

wela1=1;

wela2=1;

wela3=0;

wela4=1;//显示十位数

delay(1000);

P0=0xea;//数字

wela1=1;

wela2=1;

wela3=1;

wela4=0;//显示个位数

delay(1000);

}

}

void delay(uint x)

{

for(a=x;a>0;a--)

for(b=110;b>0;b--);

}

图画的不对,既然用了锁存器,就要节约IO端口,两个锁存器的输入应该共用一个端口P0或P2

假设为P0

每个锁存器有1个锁存信号L,需占用两条IO线,假设分别接 P16和P17

由于是动态扫描显示,所以显示函数调用时要放在WHILE或FOR循环中反复运行,才能看见结果

程序如下:

#include<reg52h>

sbit dula=P1^6;//段锁存信号

sbit wela=P1^7;//位锁存信号

#define uchar unsigned char;

void delay(i)

{

for(j=i;j>0;j--)

for(k=125;k>0;k--);

}

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

void display(uchar qian_c,uchar bai_c,uchar shi_c,uchar ge_c)//4位显示程序

{

P0=table[qian_c]; //显示千位

dula=1;

dula=0;

P0=0xfe;

wela=1;

wela=0;

delay(2);

P0=table[bai_c]; //显示百位

dula=1;

dula=0;

P0=0xfd;

wela=1;

wela=0;

delay(2);

P0=table[shi_c]; //显示十位

dula=1;

dula=0;

P0=0xfb;

wela=1;

wela=0;

delay(2);

P0=table[ge_c]; //显示个位

dula=1;

dula=0;

P0=0xf7;

wela=1;

wela=0;

delay(2);

P0=xff; //显示完毕后关闭所有位显示,也可不要,但退出显示程序时会留尾巴,即最后一个数码管还在显示

wela=1;

wela=0;

}

void main( )

{

 //其它代码

while(1)

{

display(b1,b2,b3,b4); //调用显示函数

//其它代码,不能占用CPU太多时间,否则显示闪烁

}

}

void LED_OUT(uchar X)这个子程序里的X就是你要显示的时间数值,你需要开定时器T0或T1及其中断程序,把时间数值X的算法C程序写在T0或T1的中断子程序里就行了。如:void timer0()interrupt1

{

}

以上就是关于51单片机数码管动态显示从右往左全部的内容,包括:51单片机数码管动态显示从右往左、求用51单片机接两个数码管,0-99动态显示程序(用C语言)、单片机数码管动态显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9271013.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存