| 本帖最后由 晓飛飛 于 2024-11-5 20:34 编辑 
 下面的例子用的是1ms周期的中断,实际中,考虑到上述延迟最大公约数是50ms,可以配置定时器中断周期为50ms,状态机里面的延迟变量值就可以由变350ms改为7,150ms改为3等等,还可以大幅度降低进入定时中断的周期,提高效率。
 
 
 复制代码//1ms中断程序,写字板里面写的代码,未经验证,如有错误请自行排查,
//大概思路就是如下
void Timer0_Isr(void) interrupt 1
{
        static unsigned char sta;        //状态变量
        static unsigned int delay;        //定时变量
        switch(sta)
        {
                case 0:                //状态机初始状态
                        P0=~0x011;        //第一拍动作,只执行一次                
                        delay = 300;        //设置定时值,倒计时方法,
                        sta = 1;        //转下个状态
                        break;
                case 1:                //第二拍动作
                        if(delay)  delay--;  //定时变量倒计时,延迟没到就减一
                        else                                 //延迟到了转下个动作,配置下个延迟
                        {
                                P0=~0x55;
                                delay = 200;
                                sta++;        //转下个状态
                        }
                        break;
                case 2:                //第三拍动作
                        if(delay)  delay--;
                        else 
                        {
                                P0=~0xAA;
                                delay = 350;
                                sta++;        //转下个状态
                        }
                        break;
                case 3:                //第四拍动作
                        if(delay)  delay--;
                        else 
                        {
                                P0=~0x0f;
                                delay = 150;
                                sta++;        //转下个状态
                        }
                        break;
                case 4:                //第一拍动作
                        if(delay)  delay--;
                        else 
                        {
                                P0=~0x011;
                                delay = 300;
                                sta = 1;        //转第二拍动作
                        }
                        break;
                default:
                                sta = 0;
                        break;                        
        }
}
void Timer0_Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xCD;                                //设置定时初始值
        TH0 = 0xD4;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
 
 
 
 |