51单片机秒表程序

/*配置并启动T0,ms-T0定时时间*/
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;	  //临时变量
	tmp = 11059200/12;	 //定时器计数频率
    tmp = (tmp * ms)/1000;	//计算所需的计数值
	tmp = 65536 - tmp;		//计算定时器重载值
	tmp = tmp + 18;			//补偿中断响应延时造成的误差
	T0RH = (unsigned char)(tmp >> 8);  //定时器重载值拆分为高低字节
	T0RL = (unsigned char)tmp;	
	TMOD &= 0xF0;	  //清零T0的控制位
	TMOD |= 0x01;	  //配置T0为模式1
	TH0 = T0RH;	      //加载T0中断`
	TL0 = T0RL;
	ET0 = 1;		  //使能T0中断
	TR0 = 1; 		  //启动T0
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/201909032214203.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDg4NDU0NQ==,size_16,color_FFFFFF,t_70)
/*按键扫描函数,需在定时中断中的调用*/
void KeyScan()
{
    unsigned char i;
	static unsigned char keybuf[4] = {	 //按键扫描缓冲区
	   0xFF, 0xFF, 0xFF, 0xFF
	};

	//按键值移位缓冲区,8bit每次向左移动1位,|上按键的值
	keybuf[0] = (keybuf[0]<<1) | KEY1;
	keybuf[1] = (keybuf[1]<<1) | KEY2;
	keybuf[2] = (keybuf[2]<<1) | KEY3;
	keybuf[3] = (keybuf[3]<<1) | KEY4;

	//消抖后更新按键状态
	for(i = 0; i < 4;i++)
	{
	    if(keybuf[i] == 0x00)
		{				   //连续8次扫描值为0,即16ms内都是按下状态时,可认可按键以稳定地按下
		    KeySta[i] = 0;
		}
		else if(keybuf[i] == 0xFF)
		{				   //连续8次扫描值为1,即16ms内都是弹起状态时,可认为按键已稳定地弹起
		    KeySta[i] = 1;
		}
	}
}

所要的定时功能

  • 定时器计数``
    • 数码管显示
      • 按键控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值