|
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;
}
}
}
}
|
最佳答案
查看完整内容
//----------------试试以下代码
#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 ...
|