欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
想實現數碼管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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1