标题:
想实现数码管30秒倒计时,可是数码管一直显示30。是怎么回事?
[打印本页]
作者:
雲暇
时间:
2020-4-12 18:24
标题:
想实现数码管30秒倒计时,可是数码管一直显示30。是怎么回事?
找不出原因,请求教。
代码如下:
#include <reg52.h>
#define DIG_PORT P0
#define unchar unsigned char
#define uint unsignde int
sbit gA = P2^2; // 38译码器输入口A
sbit gB = P2^3; // 38译码器输入口B
sbit gC = P2^4; // 38译码器输入口C
int t,seccnt,msta,tzsta;
int m=0,n,t;
char shi,ge,s=30;
unsigned char code gDuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void ini()//定时器
{
seccnt=0;
msta=tzsta=0;
TMOD=0x01;
TH0=0xFF;
TL0=0x9C;
TR0=1; //开启定时器0
}
void delay(int p)
{
while(p--);
}
void DigDisplayTest(t,n)
{
switch (t) //位选,选择点亮哪个数码管
{
case 0:
gA = 1; gB = 1; gC = 1;
break; //显示第0位
case 1:
gA = 0; gB = 1; gC = 1;
break; //显示第1位
case 2:
gA = 1; gB = 0; gC = 1;
break; //显示第2位
case 3:
gA = 0; gB = 0; gC = 1;
break; //显示第3位
case 4:
gA = 1; gB = 1; gC = 0;
break; //显示第4位
case 5:
gA = 0; gB = 1; gC = 0;
break; //显示第5位
case 6:
gA = 1; gB = 0; gC = 0;
break; //显示第6位
case 7:
gA = 0; gB = 0; gC = 0;
break; //显示第7位
default:
break;
}
DIG_PORT = gDuanMa[n]; // 发送段码
delay(1000); // 间隔一段显示时间
DIG_PORT = 0x00; // 消隐,注意不要漏掉了
}
void work0()
{
shi=s/10;
ge=s%10;
if(m==10000)
{
s--;
m=0;
}
DigDisplayTest(6,shi);
DigDisplayTest(7,ge);
}
void main()
{
ini();//初始化
while(1)//闭环
{
while(TF0==0);//启动主循环
TL0=0x9C;
TH0=0xFF;
TF0=0;
m++;
work0();
}
复制代码
作者:
benclee
时间:
2020-4-12 22:32
void interruptTimer0() interrupt 1
{
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
m++;
}
void main()
{
ini();//初始化
while(1)//闭环
{
work0();
}
这样试试
作者:
wulin
时间:
2020-4-13 06:58
错误比较多,逐条语句对比会有收获。
#include <reg52.h>
#define DIG_PORT P0
#define uchar unsigned char
#define uint unsigned int
sbit gA = P2^2; // 38译码器输入口A
sbit gB = P2^3; // 38译码器输入口B
sbit gC = P2^4; // 38译码器输入口C
//int t,seccnt,msta,tzsta;
uint m=0,n,t;
uchar shi,ge,s=30;
bit i=0;
unsigned char code gDuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void ini()//定时器
{
//seccnt=0;
//msta=tzsta=0;
TMOD=0x01;
TL0 = 0x18; //设置定时初值1ms
TH0 = 0xFC; //设置定时初值1ms
TR0=1; //开启定时器0
}
void delay(int p)
{
while(p--);
}
void DigDisplayTest(t,n)
{
switch (t) //位选,选择点亮哪个数码管
{
case 0:
gA = 1; gB = 1; gC = 1;
break; //显示第0位
case 1:
gA = 0; gB = 1; gC = 1;
break; //显示第1位
case 2:
gA = 1; gB = 0; gC = 1;
break; //显示第2位
case 3:
gA = 0; gB = 0; gC = 1;
break; //显示第3位
case 4:
gA = 1; gB = 1; gC = 0;
break; //显示第4位
case 5:
gA = 0; gB = 1; gC = 0;
break; //显示第5位
case 6:
gA = 1; gB = 0; gC = 0;
break; //显示第6位
case 7:
gA = 0; gB = 0; gC = 0;
break; //显示第7位
default:
break;
}
DIG_PORT = gDuanMa[n]; // 发送段码
delay(100); // 间隔一段显示时间
DIG_PORT = 0x00; // 消隐,注意不要漏掉了
}
void work0()
{
shi=s/10;
ge=s%10;
if(m==1000)
{
m=0;
if(s>0)//约束至0
s--;
}
}
void main()
{
ini();//初始化
while(1)//闭环
{
if(TF0);//查询TF0
{
TL0 = 0x18; //设置定时初值1ms
TH0 = 0xFC; //设置定时初值1ms
TF0=0;
m++;
work0();
}
i=~i;
if(i)
DigDisplayTest(6,shi);
else
DigDisplayTest(7,ge);
}
}
复制代码
作者:
雲暇
时间:
2020-4-13 19:56
wulin 发表于 2020-4-13 06:58
错误比较多,逐条语句对比会有收获。
谢谢,我昨天自己找到出错的地方了
我将消影放到函数前面,然后发现可以显示,但是数码管光暗淡
然后在work0里的函数前调整了一下语句的位置
就可以实现了,猜可能是切到下一个函数的时候太快,给它一个语句的缓冲时间就好了
void DigDisplayTest(t,n)
{
DIG_PORT = 0x00; // 消隐提前
switch (t) //位选,选择点亮哪个数码管
{
case 0:
gA = 1; gB = 1; gC = 1;
break; //显示第0位
case 1:
gA = 0; gB = 1; gC = 1;
break; //显示第1位
case 2:
gA = 1; gB = 0; gC = 1;
break; //显示第2位
case 3:
gA = 0; gB = 0; gC = 1;
break; //显示第3位
case 4:
gA = 1; gB = 1; gC = 0;
break; //显示第4位
case 5:
gA = 0; gB = 1; gC = 0;
break; //显示第5位
case 6:
gA = 1; gB = 0; gC = 0;
break; //显示第6位
case 7:
gA = 0; gB = 0; gC = 0;
break; //显示第7位
default:
break;
}
DIG_PORT = gDuanMa[n]; // 发送段码
delay(1000); // 间隔一段显示时间
}
void work0()
{
if(m==10000)
{
s--;
m=0;
}
shi=s/10;
DigDisplayTest(6,shi);
ge=s%10;
DigDisplayTest(7,ge);
}
复制代码
作者:
雲暇
时间:
2020-4-13 20:02
wulin 发表于 2020-4-13 06:58
错误比较多,逐条语句对比会有收获。
同时也修改了delay函数,因为影响到定时器了,将delay改成定时器计时了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1