⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer1.c

📁 protues仿真keil程序 初学者的福音
💻 C
📖 第 1 页 / 共 2 页
字号:


//每隔50ms会执行一次 每次根据按键的值执行对应的键盘子程序
void KeyProgram(void)
{
    keyScan();
    //检测一次按键。
    
    //P11按下一次的检测 带有消抖功能,消抖时间为50ms。
    //如果曾经有P11按键按下被检测到了,则现在已经过了50ms再次检测
    if(IsKeyPressed==1)
    {
        IsKeyPressed=0 ;
        if(KeyPressing1)
        KeyCode=KeyPressing1 ;
        if(KeyPressing2)
        KeyCode=KeyPressing2|0x30 ;
    }
    
    //有P1P2有任何按键曾经按下,则该端口不为0
    if(KeyPressed1)IsKeyPressed=1 ;
    if(KeyPressed2)IsKeyPressed=1 ;
    //补充根据KeyCode的值执行的函数代码,最后恢复按键的值为0。
    switch(KeyCode)
    {
        
        case YELLOW :
        if(MachineState==WORK)
        {
            CurrLed=0 ;
            //这一路正在运行
            if(IsRun[CurrLed]==1)
            {
                PLed0=1 ;
                IsRun[CurrLed]=0 ;
                //停止并数据复位。
                TimeDelay[CurrLed]=0 ;
            }
            else 
            {
                PLed0=0 ;
                IsRun[CurrLed]=1 ;
                TimeDelay[CurrLed]=TimeSave[CurrLed];
            }
        }
        else 
        {
            PLed0=0 ;
            MachineState=SET1 ;
            if(TimeSave[0]>=100)
            TimeSave[0]-=100 ;
            IsSetFirst=1 ;
        }
        break ;
        
        case ORANGE :
        if(MachineState==WORK)
        {
            CurrLed=1 ;
            //这一路正在运行
            if(IsRun[CurrLed]==1)
            {
                PLed1=1 ;
                IsRun[CurrLed]=0 ;
                //停止并数据复位。
                TimeDelay[CurrLed]=0 ;
            }
            else 
            {
                PLed1=0 ;
                IsRun[CurrLed]=1 ;
                TimeDelay[CurrLed]=TimeSave[CurrLed];
            }
        }
        else 
        {
            PLed1=0 ;
            MachineState=SET2 ;
            if(TimeSave[1]>=100)
            TimeSave[1]-=100 ;
            IsSetFirst=1 ;
        }
        break ;
        
        case PURPLE :
        if(MachineState==WORK)
        {
            CurrLed=2 ;
            //这一路正在运行
            if(IsRun[CurrLed]==1)
            {
                PLed2=1 ;
                IsRun[CurrLed]=0 ;
                //停止并数据复位。
                TimeDelay[CurrLed]=0 ;
            }
            else 
            {
                PLed2=0 ;
                IsRun[CurrLed]=1 ;
                TimeDelay[CurrLed]=TimeSave[CurrLed];
            }
        }
        
        else 
        {
            PLed2=0 ;
            MachineState=SET3 ;
            if(TimeSave[2]>=100)
            TimeSave[2]-=100 ;
            IsSetFirst=1 ;
        }
        break ;
        
        case RED :
        if(MachineState==WORK)
        {
            CurrLed=3 ;
            //这一路正在运行
            if(IsRun[CurrLed]==1)
            {
                PLed3=1 ;
                IsRun[CurrLed]=0 ;
                //停止并数据复位。
                TimeDelay[CurrLed]=0 ;
            }
            else 
            {
                PLed3=0 ;
                IsRun[CurrLed]=1 ;
                TimeDelay[CurrLed]=TimeSave[CurrLed];
            }
        }
        
        
        else 
        {
            PLed3=0 ;
            MachineState=SET4 ;
            if(TimeSave[3]>=100)
            TimeSave[3]-=100 ;
            IsSetFirst=1 ;
        }
        break ;
        
        case GREEN :
        if(MachineState==WORK)
        {
            CurrLed=4 ;
            //这一路正在运行
            if(IsRun[CurrLed]==1)
            {
                PLed4=1 ;
                IsRun[CurrLed]=0 ;
                //停止并数据复位。
                TimeDelay[CurrLed]=0 ;
            }
            else 
            {
                PLed4=0 ;
                IsRun[CurrLed]=1 ;
                TimeDelay[CurrLed]=TimeSave[CurrLed];
            }
        }
        
        
        else 
        {
            PLed4=0 ;
            MachineState=SET5 ;
            if(TimeSave[4]>=100)
            TimeSave[4]-=100 ;
            IsSetFirst=1 ;
        }
        break ;
        
        case BLUE :
        if(MachineState==WORK)
        {
            CurrLed=5 ;
            //这一路正在运行
            if(IsRun[CurrLed]==1)
            {
                PLed5=1 ;
                IsRun[CurrLed]=0 ;
                //停止并数据复位。
                TimeDelay[CurrLed]=0 ;
            }
            else 
            {
                PLed5=0 ;
                IsRun[CurrLed]=1 ;
                TimeDelay[CurrLed]=TimeSave[CurrLed];
            }
        }
        
        else 
        {
            PLed5=0 ;
            MachineState=SET6 ;
            if(TimeSave[5]>=100)
            TimeSave[5]-=100 ;
            IsSetFirst=1 ;
        }
        break ;
        
        case UP :
        funUp();
        break ;
        case DOWN :
        funDown();
        break ;
        
        case LEFT :
        funLeft();
        break ;
        case RIGHT :
        funRight();
        break ;
        case OK :
        funOk();
        break ;
        default :
        break ;
    }
    KeyCode=0x00 ;
    
    
    
    //按键p1持续按下的代码
    if(KeyPressing1)
    {
        if(MachineState!=WORK)
        {
            
            //持续按下的时间超过50*20=1000ms则
            if(++Key1PressingTime>=20)
            {
                //每200ms会执行一次keycode++;
                if(Key1PressingTime%5==0)
                switch(KeyPressing1)
                {
                    case YELLOW :
                    PLed0=0 ;
                    MachineState=SET1 ;
                    IsSetFirst=1 ;
                    if(TimeSave[0]<100)TimeSave[0]+=100 ;
                    IsSetFirst=1 ;
                    break ;
                    case ORANGE :
                    PLed1=0 ;
                    MachineState=SET2 ;
                    IsSetFirst=1 ;
                    if(TimeSave[1]<100)TimeSave[1]+=100 ;
                    IsSetFirst=1 ;
                    break ;
                    case PURPLE :
                    PLed2=0 ;
                    MachineState=SET3 ;
                    IsSetFirst=1 ;
                    if(TimeSave[2]<100)TimeSave[2]+=100 ;
                    IsSetFirst=1 ;
                    break ;
                    case RED :
                    PLed3=0 ;
                    MachineState=SET4 ;
                    IsSetFirst=1 ;
                    if(TimeSave[3]<100)TimeSave[3]+=100 ;
                    IsSetFirst=1 ;
                    break ;
                    case GREEN :
                    PLed4=0 ;
                    MachineState=SET5 ;
                    IsSetFirst=1 ;
                    if(TimeSave[4]<100)TimeSave[4]+=100 ;
                    IsSetFirst=1 ;
                    break ;
                    case BLUE :
                    PLed5=0 ;
                    MachineState=SET6 ;
                    IsSetFirst=1 ;
                    if(TimeSave[5]<100)TimeSave[5]+=100 ;
                    IsSetFirst=1 ;
                    break ;
                    case UP :
                    IsFlashTime=0 ;
                    funUp();
                    break ;
                    case DOWN :
                    IsFlashTime=0 ;
                    funDown();
                    break ;
                    default :
                    break ;
                }
            }
            
        }
    }
    else 
    Key1PressingTime=0 ;
    //该按键出现弹起现象,则时间恢复为0
    
    //按键p2持续按下的代码
    if(KeyPressing2)
    {
        //持续按下的时间超过50*20=1000ms则
        if(++Key2PressingTime>=20)
            if(KeyPressing2==(OK&0x0e))
                if(MachineState==WORK)
                {
                    MachineState=SET1 ;
                    if(TimeSave[0]>=100)
                    TimeSave[0]-=100 ;
                    IsSetFirst=1 ;
                    
                }
        
    }
    else 
    Key2PressingTime=0 ;
    //该按键出现弹起现象,则时间恢复为0
    
    
}


void funUp(void)
{
    if(MachineState!=WORK)
    {
        if(IsFlash[2])
        {
            if(++DisplayData[2]>=10)
            DisplayData[2]=0 ;
        }
        else 
        {
            if(++DisplayData[3]>=10)
            DisplayData[3]=0 ;
        }
    }
}
void funDown(void)
{
    if(MachineState!=WORK)
    {
        if(IsFlash[2])
        {
            if(--DisplayData[2]>=10)
            DisplayData[2]=9 ;
        }
        else 
        {
            if(--DisplayData[3]>=10)
            DisplayData[3]=9 ;
        }
    }
    
}


void funLeft(void)
{
    if(MachineState!=WORK)
    {
        IsFlash[2]=0x01 ;
        IsFlash[3]=0x00 ;
    }
}
void funRight(void)
{
    if(MachineState!=WORK)
    {
        IsFlash[2]=0x00 ;
        IsFlash[3]=0x01 ;
    }
    
}
void funOk(void)
{
    unsigned char i ;
    //保存数据并进入倒计时暂停状态
    if(MachineState!=WORK)
    {
        
        IsFlash[2]=0x00 ;
        IsFlash[3]=0x00 ;
        if(TimeSave[MachineState-1]<100)
        TimeSave[MachineState-1]=DisplayData[2]*10+DisplayData[3];
        else 
        TimeSave[MachineState-1]=DisplayData[2]*10+DisplayData[3]+100 ;
        
        MachineState=WORK ;
        for(i=0;i<6;i++)
        {
            TimeDelay[i]=TimeSave[i];
            IsRun[i]=0 ;
        }
        //这里保存数据到eeprom
 	   sector_erase(0x4000);
 	   sequential_write_flash_in_one_sector(0x4000, 6, TimeSave );
    }
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -