python七段数码管绘制秒表_初学者8只7段数码管当秒表用的实例问题

本文介绍了一个使用Python模拟8只7段数码管制作秒表的实例,探讨了如何避免每秒计数时出现卡顿,以及如何处理数值进位的问题。通过扫描数码管并更新显示,确保秒表的流畅运行。
摘要由CSDN通过智能技术生成

//***8只7段数码管,想实现在末位数码管每秒跳变一次,满10进一位,倒数第二位满10也进1,依次类推(不要取商取余,那样运算慢有卡顿)*****///

***k的值一直没变,总是0,返回的tmp只到1就没了。这是为什么??

硬件有,74HC138译码器,74HC573移位器  ******/

#include#include

#define uint unsigned int

#define uchar unsigned char

#define GPIO P0sbit LE=P1^0;  //74HC573移位器 段选使能

sbit LSA=P2^2;   //此三脚接138译码器,用来选择哪个管显示

sbit LSB=P2^3;

sbit LSC=P2^4;

uchar code table[]={

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

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

0x7f,0x6f

};//,0x77,0x7c,//0x39,0x5e,0x79,0x71//显示0~F的值 取0-9

uint time=0,n[8]; //0-7代表8位数码管,数组里装数码管的值

void Delay10ms(uint c);

void Display_Arr(uint x);//选择显示第几位

void InitTimer0(void); //定时器初始化void Display(uint *x);

uint ScanNumber(uint);//扫描8管是否有等于10,返回i,否则返回0//

void FillOneTube(uint x,uint y);

void main()

{

uint i, k=0,tmp=0;         //n用来表示要显示的数字,i表示要显示第几位,前面有几个显0的

InitTimer0();

for(i=0;i<8;i++)

n[i]=0;

while(1)

{

if(time==100)        //1秒才跳数

{

time=0;

n[0]++;                  //末位管进1

if(n[0]==10)

n[0]=0;

if(ScanNumber(k)==8)//没有进位到10的管子

{

Display(n);

}

else

{

tmp=ScanNumber(k); //有管子=10,赋给临时变量T

n[tmp]=0;                                 ;

n[++tmp]+=1;//前位进1

Display(n);

}

}//end while

}

void testTen()

{

int i;

for(i=0;i<8;i++)

if(n[i]==10)

{

n[i]=0;

n[i++]+=1;

}

}

void Display(uint * x)

{

uint i;uint y[8];

for(i=0;i<8;i++)

{

y[i]=*x;

x++;

}

for(i=0;i<8;i++)

{

Display_Arr(i);

LE=1;

GPIO=table[y[i]];

LE=0;

Delay10ms(1);

}

}

uint ScanNumber(uint k)

{

uint i=0;

for(;i<8;i++)

{

if(n[i]==10)

{

k=i;

return k;

}

}

return 8;        //没有等于10的数组

}

void Display_Arr(uint x) //选择8个数码管的哪个亮

{

switch(x)              //位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0; break;

case(1):

LSA=1;LSB=0;LSC=0; break;

case(2):

LSA=0;LSB=1;LSC=0; break;

case(3):

LSA=1;LSB=1;LSC=0; break;

case(4):

LSA=0;LSB=0;LSC=1; break;

case(5):

LSA=1;LSB=0;LSC=1; break;

case(6):

LSA=0;LSB=1;LSC=1; break;

case(7):

LSA=1;LSB=1;LSC=1; break;

}

}

void Tiner_Int() interrupt 1

{

TH0 = 0xD8;        //定时10MS

TL0 = 0xF0;

time++;

}

void InitTimer0(void)// 定时器0初始化

{

TMOD = 0x01; //方式1

TH0 = 0xD8;        //定时10MS

TL0 = 0xF0;

EA = 1;

ET0 = 1;

TR0 = 1;

}

void Delay10ms(uint c)   //误差 0us

{

unsigned char a,b;

for(;c>0;c--)

for(b=10;b>0;b--)                  //原为38

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值