/*配置并启动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
}

/*按键扫描函数,需在定时中断中的调用*/
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;
}
}
}
所要的定时功能