stc89C51和三位数码管实现计数器功能(启动、暂停、记录、清零)

#include <REGX52.H>
#define  uint unsigned int
#define  uchar unsigned char
    
uchar SegCode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar    Recorded_data[20];//记录数据值
//**********************************
//number 计数值
//Key_State 1为计时器启动  0为关闭
//x,y都为Recorded_data[20]的索引值
//mode P33(s4)的工作模式 1时记录数据  0时显示记录的数据
//**********************************
uchar number,Key_State,x,y,i,mode;

sbit P31=P3^1;//s2
sbit P32=P3^2;//s3
sbit P33=P3^3;//s4
void Delay1ms(unsigned int xms)    
{
    unsigned char i, j;
    while(xms--)
    {
    i = 2;
    j = 239;
    do
    {
        while (--j);
    } while (--i);
    }

void Seg_Display(uchar temp)
{
         P2=0x02;
     P0=~SegCode[temp/100];
     Delay1ms(1);
     P2=0x08;
     P0=~SegCode[temp%10];
     Delay1ms(1);
     P2=0x04;
     P0=~SegCode[temp/10]+0X80;
     Delay1ms(1);    
}

void Timer_State()
{
//计数器模式
        if(P33==0)            
        {
            Delay1ms(20);        
            while(P33==0);    
            Delay1ms(20);        
            Key_State++;Key_State=Key_State%2;
            TR0=Key_State;mode=Key_State;
        }
//清零
        if(P32==0)            
        {
            Delay1ms(20);        
            while(P32==0);    
            Delay1ms(20);        
            number=0;i=0;mode=1;TR0=0;
            TH0=(65536-50000)/256;
            TL0=(65536-50000)%256; 
            
        }
//查询计时模式
        if(mode)
        {
            if(P31==0)
            {
                Delay1ms(20);        
                while(P31==0);Delay1ms(20);        
                Recorded_data[x]=number;
                x++;x=x%20;//防溢出
            }
        
        }
        else
        {
            if(P31==0)
            {
                    Delay1ms(20);        
                    while(P31==0);Delay1ms(20);        
                    y++;y=y%20;//防溢出
            }
        
        }

}

void Timer0_Init()
{
  TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256; 
    EA=1;
  ET0=1;
    TR0=0;
}

void main()
{
    Timer0_Init();
  P0=0x00;
  P2=0x00;
  while(1)
  {
        Timer_State();
        if(mode)    Seg_Display(number);
        else             Seg_Display(Recorded_data[y]);
  }
}
void Counter()interrupt 1
{
     TH0=(65536-50000)/256;
     TL0=(65536-50000)%256; 
     i++;
     if(i==10)
     {
       number++;
       i=0;
             if(number==1000)
                {
                    number=0;
                }
     }

        

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值