|
300黑幣
程序要求按 A 鍵再按 B 鍵后,顯示兩鍵按下之間的時間 t(t <60s),單位為 ms。由于程序框圖的規定要求,我在一位大佬的程序基礎上修改了display()顯示函數,可是修改后能正常顯示,但再一次按下A鍵后沒有反應,仍然循環顯示時間,請問這個函數應該怎樣修改才能實現按鍵后重新計時呢?
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit A1=P3^4;
sbit A2=P3^5;
uint m=0;
uint count,t,d,e,f;
uchar code table[]={0x14,0xde,0x38,0x1a,0xd2,0x13,0x11,0x9e,0x10,0x12};
uchar cnt[6]={0};//小數緩存
bit flag=0;
bit init=0;
void delay(void) //誤差 0us
{
unsigned char a,b,c;
for(c=67;c>0;c--)
for(b=124;b>0;b--)
for(a=167;a>0;a--);
}
void start()
{
TMOD=0x01; //T0 使用工作方式 1
TH0=(65536-1000)/256; //1ms 定時
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display() //顯示子程序,從第一位開始逐位顯示't 00秒 000毫秒'
{
static uint j;
if(flag)
P0=0xbf;//等待計數時顯示'-'
else
{
if(init==1)
for(j=6;j>0;j--)
{P0=cnt[j];
delay();
}
}
}
void main(void)
{
start();
P0=0xb7;//上電提示符
while(1)
{
if(A1==0 && flag==0) //按鍵掃描
{
flag=1;
count=0;
t=0;
init=1;
}
if(A2==0 && flag==1)
{
while(!A2);
flag=0;
cnt[6]=0xbf;
cnt[5]=table[t/10];
cnt[4]=table[t%10];//加秒點
cnt[3]=table[count/100];
cnt[2]=table[count/10%10];
cnt[1]=table[count%10];
m=0;
}
display();
}
}
void time0(void) interrupt 1 //T0 中斷服務子程序
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(flag)
{
count++;
if(count>=1000)
{
count=0;
t++;
if(t>=60)
{
t=0;
}
}
}
}
|
-
捕獲.PNG
(103.72 KB, 下載次數: 70)
下載附件
2020-7-16 11:27 上傳
-
截圖.jpg
(848.47 KB, 下載次數: 66)
下載附件
2020-7-16 11:27 上傳
最佳答案
查看完整內容
//----------------試試以下代碼
#include
#define uchar unsigned char
#define uint unsigned int
sbit A1=P3^4;
sbit A2=P3^5;
uint m=0;
//uint t,d,e,f;
uchar code table[]={0x14,0xde,0x38,0x1a,0xd2,0x13,0x11,0x9e,0x10,0x12};
uchar cnt[6]={0};//小數緩存
bit flag=0;
bit init=0;
unsigned long SysTick,count,t; //new add
void delay(void) //誤差 0us
{
unsigned char a,b,c;
fo ...
|