求数码管循环移位显示的原理?详细原理!怎么实现!!!就像下面这个程序?这个程序是怎么实现的?

/*-----------------------------------------------
名称:多位数码管动态扫描显示变化数据
论坛:www.doflye.net
编写:shifang
日期:2009.5
修改:无
内容:多位数码管分别显示不同数字,这种扫描显示方式成为动态扫描,并不停变化赋值
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;// 位锁存

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
void Delay(unsigned int t); //函数声明
void Display(unsigned char FirstBit,unsigned char Num);
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{

unsigned int i,j,k=7,m;
unsigned char *pa=TempData,*pb=dofly_DuanMa;//定义2个指针,并赋值2个数组初始地址
//*pa=TempData 等效于 *pa=&TempData[0]
while(1)
{

j++;
if(j==20) //用于延时,改变值可以改变延时长度
{
j=0; //延时到重新赋值
for(i=0;i<(8-k);i++) //循环把显示的字符值赋值
//给临时缓冲数组TempData
{
*(pa+k+i)=*(pb+i+m);//使用指针操作赋值

}
for(i=0;i<m;i++)//8位左移出去,右边空出来的数
//码管需要熄灭,
//所有赋值0 m表示移出位置,同
//时也表示右边需要熄灭位数
*(pa+8-m+i)=0;
if(k>0) //判断这些值以便循环显示
k--;
if(m<8&&k==0)
m++;
else if(m==8)
{m=0;k=7;}
}
Display(0,8);//从第一位显示,共显示8位
}
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;

for(i=0;i<Num;i++)
{
DataPort=0; //清空数据,防止有交替重影
P1=dofly_WeiMa[i+FirstBit]; //取位码
DataPort=TempData[i]; //取显示数据,段码
Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影
}

}

是8位数码管把,写着一个段选,一个位选。两个数组,一个控制显示什么数,一个控制那个数码管显示。当段选=1是,就写入要显示哪个数,然后关段选开位选,写让哪个数码管显示这个数。然后延时一会,确保数码管被点亮(延时不能太久,不然会看到数码管闪烁)。然后清屏(熄灭数码管,不然下个数码管显示时会出现重影)。就是这么个原理,我没看过他的主函数,太麻烦了,他可能用了2个锁存器吧(74HC573??,可以用这个,你可以去下载它的PDF文件,看看怎么用的),这样8个IO口就搞定所有数码管了
温馨提示:内容为网友见解,仅供参考
无其他回答

求数码管循环移位显示的原理?详细原理!怎么实现!!!就像下面这个程序...
当段选=1是,就写入要显示哪个数,然后关段选开位选,写让哪个数码管显示这个数。然后延时一会,确保数码管被点亮(延时不能太久,不然会看到数码管闪烁)。然后清屏(熄灭数码管,不然下个数码管显示时会出现重影)。就是这么个原理,我没看过他的主函数,太麻烦了,他可能用了2个锁存器吧(74HC5...

51单片机数码管循环左移详解?
1. 定义一个八位二进制数字并赋初值0xFF,用来驱动八个数码管的显示。2. 设定一个循环,将八个数码管的八位数据按顺序向左移动一个位置。具体实现时,可以将数字左移一位,并在最右边补0,同时将最右边的一位数保存,以便在移动完成后加到最左边。3. 将移动完成后保留的最右边的一位数添加到最...

数码管显示电路原理图
显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。数码管的8段,对应一个字节的8位, a对应最低位, dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111 , 即Ox3f;共阳数码管的字符编码为11000000,即Oxco。可以看出两个编码的各位正好相反。如...

一位数码管循环显示0到9实验程序
每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应。 尽管实际上各位数码管并非同时点亮LED数码管,但只要数码管扫描的速度足够快,数码管给人的印象就是一组稳定的显示资料,数码管不会有闪烁感,数码管动态显示的效果和静态显示是一样的,数码管能够节省大量的I\/O口,而且数码管功耗更低。

单片机数码管从0到9的显示并循环的原理图
这个原理图很简单的。比如这个:

PLC控制数码管的程序怎么编写?
设计用PLC控制数码管循环显示数字0-9,控制要求如下(1)按下启动按钮后,数码管从0开始显示,1s后显示1,再过1s后显示2,…,显示9,1s后再重新屏示0.如此循环。(2)当按下停止孩钮后,数码管烟灭。7数码营实际上是由7只发光二极管组成,要显示0-9数字,首先确定数字与7只发光管(即PC的输出控制点)的...

如何使用三位数码管实现8个数码管循环显示?
x0为启动按钮,x1为停止按钮。y0~y7为8盏灯。程序在按下启动按钮后,灯1先亮,1秒(T0延时)后灭,1秒后(T1延时)灯2亮,依次循环。当按下x1后,循环结束。按下x0后,m0得电为1并自保持,此时1秒计时器T0计时,1秒后T0常开点闭合1秒计时器T1计时,再过1秒T1计时结束常闭点断开T0线圈。使用...

怎么实现数码管动态动态扫描显示(同时显示不同的数字)?以下程序只能一次...
SMG_WEI =0x02 \/\/第2个数码管选通 000010 SMG_DUAN =smgcode[s2]; \/\/如s2传入2表示要显示2,那么直接调用数组偏移量为2的值,显示2 Delay(100); \/\/延时一段时间消影 S3 \/\/\/ S4 \/\/\/ S5 \/\/\/ SMG_WEI =0x20 \/\/第6个数码管选通 100000 SMG_DUAN =smgcode[s6]; \/...

单片机用汇编写两个数码管显示0到99循环的程序
要实现单片机用汇编语言编写的数码管循环显示0到99的程序,首先,你需要创建一个新的项目并做好初始化准备工作。接着,创建一个数码管段选表,它将决定每个数码管的显示模式。延时函数在此过程中也至关重要,以控制数码管的刷新速度。定义一个名为i的uchar变量,初始化一个名为wk的标志位,用于控制...

 下面是单片机数码管原理图,用汇编语言根据下面的原理图写一个动 ...
DJNZ R7, $ DJNZ R7, $ INC R0 MOV A, R2 RL A MOV R2, A CJNE R2, #80H, D_LOOP RETD_TAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H DB 92H, 82H, 0F8H, 80H, 90H待显示的内容,在 30H~37H。

相似回答