求大神帮忙完善 秒表仿真图如图

2019-07-16 01:33发布

       #include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar C,KS,KT,KF,KM,KA,KB,KC;  //C:定时/计数溢出次数;KS:K1按键初始状态;KF:K1按键按下次数;KT:K2按键初始状态;KM:K3按键初始状态
sbit K1=P1^0;   //开始暂停按键
sbit K2=P1^1;   //记录
sbit K3=P1^2;   //上翻
sbit K4=P1^3;     //下翻
sbit K5=P1^4;   //倒计时
sbit K6=P1^5;   //清零按键   
sbit BEEP=P1^6;    //扬声器口
sbit D=P0^7;    //秒和毫秒之间的点
uchar code SMG4[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //0--9对应的段码
uchar SD[]={0,0,0,0}; //SD[]表示4段数码管显示的数字
uchar CC[][4]={0};   //存储时间
//延时函数
void Delay(uchar x)
{
uint i;
while(--x) for(i=0;i<120;i++);
}
//数码管显示0
void r()
{  
   uchar f;
  for(f=0;f<4;f++)
    SD[f]=0;
}
//蜂鸣器
void Beep()
{
  uchar i,j=2;
  for(i=0;i<120;i++)
  {
  while(--j);   BEEP=~BEEP;
  }
  BEEP=0;
  }
//K1按键处理函数 开始暂停
void KE()
{   
if(KS==0)
{  KF=(KF+1)%2;
switch(KF)
{
  case 1:EA=1;ET0=1;TR0=1;Beep();break;      //数码管开始计时
  case 0:EA=1;ET0=0;TR0=0;Beep();break;  //数码管停止计时
}
}
}
//K2按键处理函数,存储时间
void KW()   
{
uchar f;
uchar i=0 ;
if(KT==0)
{  i++;
Beep();  
for(f=0;f<4;f++)
{
CC[i][f]=SD[f];
}
  }
}
/*for(f=0;f<4;f++) CC[f]=SD[f];*/
//K3按键处理函数
void KX()
{ uchar i=0;
    uchar f;
  if(KA==0)
{ i++;
Beep();
  for(f=0;f<4;f++)
{
SD[f]= CC[i][f];
}
}
}
//K6按键处理函数,计时清零
void KZ()
{
   if(KM==0)
   {
    Beep();
    EA=1;ET0=0;TR0=0;r();
}
}

//主程序
void main()
{
uchar i,j;
P0=0x00;
P3=0xff;
C=0;
KF=0;
KT=1;   
KM=1;
KS=1;
KA=1;   
KB=1;
KC=1;   
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;   //50ms定
while(1)
{
  j=0x7f;
  for(i=0;i<=3;i++)      //从低往高显示位数
  {
   j=_crol_(j,1);
P3=j;
P0=SMG4[SD[i]];        //显示数字
if(i==2) D=1;
Delay(2);
  }
if(KS!=K1)     //判断K1是否有按键按下
  {
    Delay(10);
KS=K1;
KE();
}
if(KT!=K2)     //判断K2是否有按键按下
  {
    Delay(10);
KT=K2;
KW();
}
if(KA!=K3)     //判断K3是否有按键按下
  {
    Delay(10);
KA=K3;
KX();
}
/*if(KB!=K4)     //判断K4是否有按键按下
  {
    Delay(10);
KB=K4;
KY();
}
  if(KC!=K5)     //判断K5是否有按键按下
  {
    Delay(10);
KC=K5;
KU();
} */
if(KM!=K6)     //判断K6是否有按键按下
  {
    Delay(10);
KM=K6;
KZ();
}
}
}
//T0中断函数
void timer0() interrupt 1
{
uchar i;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;   //50ms定时
if(++C!=10) return;   
C=0;
SD[0]++;                //0.1s位累加
for(i=0;i<=3;i++)    //进位处理
{
  if(SD[i]==10)
  {
   SD[i]=0;
   if(i!=3) SD[i+1]++;
  }
  else break;
}
}

仿真图在压缩包里,急用,请大神帮忙
KP{W2L~Q`XRVL1RT`R%T5]8.jpg
新建文件夹.rar 下载积分: 积分 -1 分
17.47 KB, 下载次数: 8, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。