51单片机数码管循环左移 为啥我下面的代码无法实现??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机数码管循环左移 为啥我下面的代码无法实现??相关的知识,希望对你有一定的参考价值。

#include<reg52.h>
#define a P0
typedef unsigned char uchar;
typedef unsigned int uint;
sbit latch1=P2^2;
sbit latch2=P2^3;
uchar temptable[8];
uint code table[]=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;
uint code weima[]=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;

void display(uchar firstbit,uchar num);
void delay(uchar i);
----------------------------------------------------------------------------------------------------------
void main(void)
uchar i,s,m;
while(1)


for(s=0;s<8;s++)
temptable[s]=0;
for(i=0;i<8;i++)
for(m=0;m<i+1;m++)
temptable[8-m]=table[m];

display(0,8);

for(i=8;i>0;i--)
temptable[i]=0;
for(m=0;m<i;m++)
temptable[m]=table[m+1];

display(0,8);




---------------------------------------------------------------------------------------------------------
void delay(uchar i)
while(--i)


void display(uchar firstbit,uchar num)
uchar n;
for(n=0;n<num;n++)
a=0;
latch1=1;
latch1=0;
a=weima[firstbit+n];
latch2=1;
latch2=0;
a=temptable[n];
latch1=1;
latch1=0;
delay(6000);


用硬件实验,还是用PROTEUS仿真?
最好能提供显示部分的电路图。
现在的显示,究竟是什么样?追问

硬件 显示01234567没有变化
有两个74hc573d芯片 一个控制位码 一个控制段吗

追答

既然显示函数没有问题,那就仅仅需要改动主函数:
//-----------------------------------
void main(void)

uchar i, s, m;
for(m = 0; m < 8; m++) temptable[m] = table[m]; //初始化显示内容.
while(1)
//--------------------------下面进行移位.
s = temptable[0];
for(i = 0; i < 7; i++) temptable[i] = temptable[i + 1];
temptable[7] = s;
//--------------------------下面显示几百毫秒.
for(i = 0; i < 250; i++) display(0, 8);


//-------------------------------------

参考技术A 流水灯按1秒间隔流动,数码管间隔2秒从0到F变化显示
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,num;
sbit dula=P2^2;
sbit wela=P2^3;
uchar code table[]=
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71;
void delay(uint z);
void main()

num=0;
aa=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
temp=0xfe;
P1=temp;
dula=1;
P0=table[0];
dula=0;
wela=1;
P0=0xc0;
wela=0;
while(1)

delay(1000);
temp=_crol_(temp,1);
P1=temp;
/* if(aa==40)

aa=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;
*/



void delay(uint z)

uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);


void timer0() interrupt 1

TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==40)

aa=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;



数码管同时显示12345678
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,numdu,numwe;
sbit dula=P2^2;
sbit wela=P2^3;
uchar code table[]=
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71;
uchar code tablewe[]=
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;
//void delay(uint z);
void main()

numdu=0;
numwe=0;
aa=0;
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)

// delay(1000);
// temp=_crol_(temp,1);
// P1=temp;
if(aa==1)

aa=0;
numdu++;
if(numdu==9)
numdu=1;
dula=1;
P0=table[numdu];
dula=0;
wela=1;
P0=tablewe[numwe];
wela=0;
numwe++;
if(numwe==8)
numwe=0;



/*
void delay(uint z)

uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
*/

void timer0() interrupt 1

TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
aa++;

或者

#include "reg51.h"
void delay() /*延时函数*/
int t;
for(t=0; t<0x6000; t++);

main()

unsigned char i;
for(;;)

P1=1; /*P1 口最低位亮*/
for(i=0; i<8; i++)

delay();
P1=P1<<1; /*左移*/


参考技术B 我先看看,明天回复

以上是关于51单片机数码管循环左移 为啥我下面的代码无法实现??的主要内容,如果未能解决你的问题,请参考以下文章

单片机点阵怎么实现左移右移,谢谢

51单片机单个数码管0-9循环秒计数

在51单片机上如何让数码管流水式的显示16进制数,

用51单片机并行口设计显示一个数码的电路,使数码管循环显示“0”~“F”。

stc89c52数码管怎么左右移动

51单片机定时器计时1秒数码管静态循环显示0到F+Proteus仿真