下二楼
上3楼
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define UCHAR unsigned char
- #define UINT unsigned int
- #define IDATA idata
- #define BUZZER_ON 0
- #define BUZZER_OFF 1
- #define ON 1
- #define OFF 0
- //--------硬件功能IO端口定义--------Start
- sbit sbBUZZER=P3^7; //蜂鸣器
- //1位数码管的a/b/c/d/e/f/g为P1.0-P1.6
- //按键定义
- enum KEY_LIST
- {
- KEY_SET=0,
- KEY_INCREASE,
- KEY_REDUCE,
- KEY_EXIT,
- KEY_MAX
- };
- //电梯按键 共5层,1楼只有上行按键,5楼只有下行按键,2/3/4楼既有上行又有下行按键
- //上行
- sbit sbL1KeyUp = P2^0;
- sbit sbL2KeyUp = P2^2;
- sbit sbL3KeyUp = P2^6;
- sbit sbL4KeyUp = P0^5;
- //下行
- sbit sbL2KeyDown = P2^4;
- sbit sbL3KeyDown = P0^7;
- sbit sbL4KeyDown = P0^3;
- sbit sbL5KeyDown = P0^1;
- //电梯楼层上/下指示灯
- //上行指示灯
- sbit sbL1LedUp = P2^1;
- sbit sbL2LedUp = P2^3;
- sbit sbL3LedUp = P2^7;
- sbit sbL4LedUp = P0^4;
- //下行指示灯
- sbit sbL2LedDown = P2^5;
- sbit sbL3LedDown = P0^6;
- sbit sbL4LedDown = P0^2;
- sbit sbL5LedDown = P0^0;
- //电梯运行指示箭头LED控制
- sbit sbUpPoint = P3^3; //上箭头
- sbit sbMidPoint = P3^4; //中竖条
- sbit sbDownPoint = P3^5; //下箭头
- //步进电机控制
- UCHAR code FFW[]=
- {
- 0x03,0x06,0x0c,0x09
- };
- UCHAR code REV[]=
- {
- 0x09,0x0c,0x06,0x03
- };
- sbit sbMotor0Blue = P3^0;
- sbit sbMotor1Pink = P3^6;
- sbit sbMotor2Yellow = P3^2;
- sbit sbMotor3Orange = P1^7;
- //--------硬件功能IO端口定义--------End
- //--------常量定义--------Start
- //****晶振参数定义
- #define CRYSTAL_110592M 0 //11.0592Mhz晶振
- #define CRYSTAL_12M 1 //12Mhz晶振
- #define CRYSTAL_SELECT CRYSTAL_12M
- //FOSC为晶振频率,如选用11.0592M晶振则FOSC=11059200
- #if (CRYSTAL_SELECT == CRYSTAL_110592M)
- //定时器T0计数器初值
- //#define SEQ_TIMER0_H 0xDC //16位定时器,6T,5ms
- //#define SEQ_TIMER0_L 0x00
- #define SEQ_TIMER0_H 0xF8 //16位定时器,6T,1ms
- #define SEQ_TIMER0_L 0xCD
- #else
- #define SEQ_TIMER0_H 0xEC //16位定时器,12T,5ms
- #define SEQ_TIMER0_L 0xF0
- //#define SEQ_TIMER0_H 0xD8 //16位定时器,12T,10ms
- //#define SEQ_TIMER0_L 0xF0
- #endif
- #define TIME_50MS_COUNT 10 //T0为5ms
- //支持STC单片机,特别是内部EEP
- //建议仅在使用STC单片机时开启即#define SUPPORT_STC_MCU 1
- //其他情况(包括proteus仿真)都需要关闭#define SUPPORT_STC_MCU 0
- #define SUPPORT_STC_MCU 0
- //数码管显示定义
- enum LED_DISPLAY_CODE
- {
- LED_NUM_0 = 0,
- LED_NUM_1,
- LED_NUM_2,
- LED_NUM_3,
- LED_NUM_4,
- LED_NUM_5,
- LED_NUM_6,
- LED_NUM_7,
- LED_NUM_8,
- LED_NUM_9,
- LED_0_DOT ,
- LED_1_DOT,
- LED_2_DOT,
- LED_3_DOT,
- LED_4_DOT,
- LED_5_DOT,
- LED_6_DOT,
- LED_7_DOT,
- LED_8_DOT,
- LED_9_DOT,
- LED_ASC_L,
- LED_ASC_H,
- LED_ASC_HDOT,
- LED_ASC_P,
- LED_ASC_PDOT,
- LED_ASC_A,
- LED_ASC_SPLIT,
- LED_ASC_BLANK,
- LED_ASC_O,
- LED_ASC_E,
- LED_ASC_EDOT,
- LED_ASC_N,
- LED_ASC_C,
- LED_ASC_CDOT,
- LED_ASC_DOT,
- LED_ASC_r,
- LED_ASC_K,
- LED_ASC_F,
- LED_ASC_b,
- LED_ASC_d,
- LED_ASC_g,
- LED_ASC_U,
- LED_ASC_n,
- LED_ASC_S,
- LED_ASC_y,
- LED_ASC_LDOT,
- LED_ASC_FDOT,
- LED_MAX
- };
- UCHAR code LED_DISP_NUM[LED_MAX]=
- // 0 1 2 3 4 5 6 7 8 9
- {0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98
- };
- #define DEF_IDLE_DISP_CHAR LED_NUM_1
- #define LED_FLASH_INTERVAL 20 // 1 second
- UCHAR code TBL_DISP_POS_VALUE[]={0xF7,0xEF,0xDF,0xBF};
- //--------变量定义--------Start
- //时钟
- UCHAR ucBaseTimeCount; //基础计数(记至50ms为一个循环),用于整个系统基础计时
- //数码管显示
- #define KEY_MAX_LEN 4
- UCHAR DisBuffer;
- UCHAR ucDispState;
- enum DISP_STATE
- {
- DS_IDLE = 0, //空闲待机状态
- DS_KEY_INPUT, //按键输入状态
- DS_MAX
- };
- UCHAR ucDispIdleChar; //空闲待机时显示的字符
- //蜂鸣器
- bit bSoundfgTips;
- //按键
- //按键IO口定义
- #define KEY_DOWN 0
- #define KEY_UP 1
- //LED状态指示灯IO口定义
- #define LED_ON 0
- #define LED_OFF 1
- //楼层列表
- enum FLOOR_LIST
- {
- FL_1 = 0, // 1层
- FL_2, // 2层
- FL_3, // 3层
- FL_4, // 4层
- FL_5, // 5层
- FL_MAX //
- };
- #define FLOOR_MIN FL_1 // 1层
- #define FLOOR_MAX FL_5 // 5层
- //电梯运行箭头指示灯分解
- enum SET_EVLEVATOR_LED
- {
- SEL_NONE = 0, // 全部熄灭
- SEL_UP , // 上行
- SEL_DOWN, // 下行
- SEL_ALL, // 全部点亮
- SEL_MAX
- };
- //住户呼叫电梯动作
- enum CALL_EVLEVATOR_LIST
- {
- CEL_UP = 0, // 上行
- CEL_DOWN, // 下行
- CEL_MAX
- };
- enum FLOOR_CALL_LIST
- {
- FCL_FL1_UP = 0,
- FCL_FL2_UP,
- FCL_FL3_UP,
- FCL_FL4_UP,
- FCL_FL2_DOWN,
- FCL_FL3_DOWN,
- FCL_FL4_DOWN,
- FCL_FL5_DOWN,
- FCL_MAX
- };
- #define FCL_UP_MIN FCL_FL1_UP
- #define FCL_UP_MAX FCL_FL4_UP
- #define FCL_DOWN_MIN FCL_FL2_DOWN
- #define FCL_DOWN_MAX FCL_FL5_DOWN
- UCHAR ucFloorCallList[FCL_MAX] ={FCL_MAX,FCL_MAX,FCL_MAX,FCL_MAX,FCL_MAX,FCL_MAX,FCL_MAX,FCL_MAX};
- UCHAR ucFCLLen;
- //电梯状态
- enum EVLEVATOR_STATE_LIST
- {
- ESL_STANDBY = 0, // 停留在某层等待楼层呼叫
- ESL_UP, // 电梯上行
- ESL_DOWN, // 电梯下行
- ESL_MAX
- };
- UCHAR ucElevatorState; //电梯状态
- UCHAR ucElevatorFL; //电梯当前所处的楼层
- UCHAR ucElevatorTargetFL; //电梯当前准备前往的楼层
- UCHAR ucElevatorTargetFLListID; //电梯当前准备前往的楼层
- UCHAR ucCallElevatorState; //呼叫方向
- UCHAR ucFLLedUp[FL_MAX] ={LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_OFF};
- UCHAR ucFLLedDown[FL_MAX] ={LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_OFF};
- UCHAR ucElevatorTimeCount; //电梯运行计数
- UCHAR ucElevatorTimeOut; //电梯计数限值
- #define TIME_ELEVATOR_FLOOR_SPEED 60 //电梯运行一层的时间
- #define TIME_ELEVATOR_OPEN_DOOR 40 //电梯开门时间
- #define TIME_ELEVATOR_FLOOR_WAIT 40 //电梯等待时间
- #define TIME_ELEVATOR_CLOSE_DOOR 40 //电梯关门门时间
- //空闲中
- #define TIME_IDLE_LED_ON_COUNT 20
- #define TIME_IDLE_LED_OFF_COUNT 20
- //按键输入中
- #define TIME_KEYINPUT_LED_ON_COUNT 10
- #define TIME_KEYINPUT_LED_OFF_COUNT 10
- //--------变量定义--------End
- //--------函数定义--------Start
- //--------函数定义--------End
- //按键
- bit bKeyReleased;
- bit bKeyReaded;
- bit bSoundfgKey;
- bit bKeyRepeated;
- UCHAR IDATA ucKeyDet; //已经检测到的按键
- UCHAR IDATA ucKeyCur; //当前检测到正按下的按键
- UINT IDATA uiKeyTimeCount;
- UCHAR IDATA ucKeyDownCount; //检测按键按下延迟时间
- #define TIME_KEY_DOWN_COUNT 2 //按键按下时间超过4*50=200ms即认为按键有效,否则无效
- #define TIME_KEY_REPEAT_COUNT 10 //按键按下时间超过10*50=500ms即认为按键有效,否则无效
- //蜂鸣器
- bit bSoundfgTips; //蜂鸣器提示声标识
- //空闲中
- #define TIME_IDLE_LED_ON_COUNT 20
- #define TIME_IDLE_LED_OFF_COUNT 20
- //设置状态中
- #define TIME_SETTING_LED_ON_COUNT 10
- #define TIME_SETTING_LED_OFF_COUNT 10
- //闹铃状态中
- #define TIME_ALARMCLOCK_LED_ON_COUNT 5
- #define TIME_ALARMCLOCK_LED_OFF_COUNT 5
- //系统状态
- enum STATE_LIST
- {
- SL_IDLE = 0, // 空闲
- SL_SETTING, //设置
- SL_ALARM,//闹铃or 报警
- SL_MAX
- };
- UCHAR IDATA ucSysState; //系统状态
- //时钟
- //箭头闪烁控制
- UCHAR IDATA ucFlashArrowTimeCount; //闪烁计时
- bit bFlashShowArrow; //是否当前显示空白
- #define TIME_FLASH_ARROW_COUNT 2 //每0.25S闪烁一次
- //字符闪烁
- UCHAR IDATA ucFlashTimeCount; //闪烁计时
- bit bFlashShowBlanking; //是否当前显示空白
- #define TIME_FLASH_FREQ_COUNT 10 //每0.5S闪烁一次
- //提示声
- bit bAlarmingSoundOn; //闹铃提示音
- UCHAR IDATA ucAlarmingCount; //报警计数
- UCHAR IDATA ucAlarmingTimeOut;//延时
- #define TIME_ALARM_ON_COUNT 5
- #define TIME_ALARM_OFF_COUNT 5
- #define TIME_ALARM_REPEAT_COUNT 6
- #define TIME_ALARM_INTERVAL_COUNT 20
- //延时1ms,有误差
- void DelayMS(UINT ms)
- {
- UCHAR n = 100;
- while(ms--)
- {
- while (n--)
- {
- _nop_();
- _nop_();
- }
- }
- }
- //蜂鸣器
- void vSoundOnOff(UCHAR ucOnOff, UINT uiDelayTime)
- {
- if (ucOnOff == ON)
- {
- sbBUZZER = BUZZER_ON;
- bSoundfgTips = 1;
- if (uiDelayTime>0)
- {
- //vDelayTime1Ms(uiDelayTime);
- DelayMS(uiDelayTime);
- }
- }
- else
- {
- sbBUZZER = BUZZER_OFF;
- bSoundfgTips = 0;
- if (uiDelayTime>0)
- {
- //vDelayTime1Ms(uiDelayTime);
- DelayMS(uiDelayTime);
- }
- }
- }
- //
- void vAdd2FCL(UCHAR ucFclItem)
- {
- UCHAR i;
- for(i=0;i<ucFCLLen;i++)
- {
- if (ucFloorCallList[i]==ucFclItem)
- {
- return ;
- }
- }
- if (ucFCLLen<FCL_MAX)
- {
- ucFloorCallList[ucFCLLen] = ucFclItem;
- ucFCLLen ++;
- }
- }
- //
- /*
- void vDelFCLItem(UCHAR ucFclItem)
- {
- UCHAR i,j;
- if ((ucFclItem<FCL_MAX)&&(ucFCLLen>0))
- {
- j= FCL_MAX;
- for (i=0;i<ucFCLLen;i++)
- {
- if (ucFloorCallList[i]==ucFclItem)
- {
- ucFloorCallList[i] = FCL_MAX;
- j=i;
- break;
- }
- }
- if (j<FCL_MAX)
- {
- for (i=j;i<ucFCLLen;i++)
- {
- ucFloorCallList[i] = ucFloorCallList[i+1];
- }
- ucFloorCallList[ucFCLLen-1] = FCL_MAX;
- }
- ucFCLLen --;
- }
- }
- */
- void vDelFCLItem(UCHAR ucFclItemListID)
- {
- UCHAR i;
- if ((ucFclItemListID<ucFCLLen)&&(ucFCLLen>0))
- {
- for (i=ucFclItemListID;i<ucFCLLen;i++)
- {
- ucFloorCallList[i] = ucFloorCallList[i+1];
- }
- ucFloorCallList[ucFCLLen-1] = FCL_MAX;
- ucFCLLen --;
- }
- }
- //
- void dj()
- {
- sbMotor0Blue=0;
- DelayMS(100);
- sbMotor1Pink =0;
- DelayMS(100);
- sbMotor2Yellow =0;
- DelayMS(100);
- sbMotor3Orange=1;
- DelayMS(100);
- }
- UCHAR ucGetFloorByFCL(UCHAR ucFCLItem)
- {
- UCHAR ucFloor;
- ucFloor = FL_MAX;
- switch (ucFCLItem)
- {
- case FCL_FL1_UP:
- ucFloor = FL_1;
- break;
- case FCL_FL2_UP:
- case FCL_FL2_DOWN:
- ucFloor = FL_2;
- break;
- case FCL_FL3_UP:
- case FCL_FL3_DOWN:
- ucFloor = FL_3;
- break;
- case FCL_FL4_UP:
- case FCL_FL4_DOWN:
- ucFloor = FL_4;
- break;
- case FCL_FL5_DOWN:
- ucFloor = FL_5;
- break;
- }
- return ucFloor;
- }
- //设置电梯箭头方向灯
- void vSetElevatorLed(UCHAR ucCall)
- {
- if (ucCall>=SEL_MAX)
- {
- return ;
- }
- switch (ucCall)
- {
- case SEL_NONE:
- sbUpPoint = 1;
- sbMidPoint= 1;
- sbDownPoint = 1;
-
- break;
- case SEL_UP:
- sbUpPoint = 0;
- sbMidPoint= 0;
- sbDownPoint = 1; dj();
- break;
- case SEL_DOWN:
- sbUpPoint = 1;
- sbMidPoint= 0;
- sbDownPoint = 0;
-
- break;
- case SEL_ALL:
- sbUpPoint = 0;
- sbMidPoint= 0;
- sbDownPoint = 0;
-
- break;
- }
- }
- //设置楼层按键上行or下行指示灯
- void vSetFloorLed(UCHAR ucFloor,UCHAR ucCall,UCHAR ucOnOff)
- {
- if ((ucFloor>=FL_MAX)||(ucCall>=CEL_MAX) ||((ucFloor==FL_1)&&(ucCall==CEL_DOWN))||((ucFloor==FL_5)&&(ucCall==CEL_UP)))
- {
- return ;
- }
- if ((ucCall==CEL_UP)&&(ucFloor<FL_5))
- {
- ucFLLedUp[ucFloor] = ucOnOff;
- switch (ucFloor)
- {
- case FL_1:
- sbL1LedUp = ucOnOff;
- break;
- case FL_2:
- sbL2LedUp = ucOnOff;
- break;
- case FL_3:
- sbL3LedUp = ucOnOff;
- break;
- case FL_4:
- sbL4LedUp = ucOnOff;
- break;
- }
- }
- else if ((ucCall==CEL_DOWN)&&(ucFloor>FL_1))
- {
- ucFLLedDown[ucFloor] = ucOnOff;
- switch (ucFloor)
- {
- case FL_2:
- sbL2LedDown= ucOnOff;
- break;
- case FL_3:
- sbL3LedDown = ucOnOff;
- break;
- case FL_4:
- sbL4LedDown = ucOnOff;
- break;
- case FL_5:
- sbL5LedDown = ucOnOff;
- break;
- }
- }
- }
- //软硬件初始化函数
- void vInit()
- {
- UCHAR i;
- //时钟
- ucBaseTimeCount = 0;
- //蜂鸣器
- bSoundfgTips = 0;
- //按键
- bKeyReleased = 1;
- bSoundfgKey = 0;
- bKeyRepeated = 0;
- uiKeyTimeCount = 0;
- ucKeyDownCount= 0;
- ucKeyDet = KEY_MAX;
- ucKeyCur = KEY_MAX;
- //电梯初始状态,停留在1层
- ucElevatorState = ESL_STANDBY;
- ucCallElevatorState = ESL_MAX;
- ucElevatorFL = FL_1;
- ucElevatorTimeCount = 0; //电梯运行计数
- ucElevatorTimeOut = 0; //电梯计数限值
- ucFCLLen = 0;
- //设置电梯运行箭头
- vSetElevatorLed(SEL_NONE);
- //设置各个楼层的上行按键灯
- sbL1LedUp = LED_OFF;
- sbL2LedUp = LED_OFF;
- sbL3LedUp = LED_OFF;
- sbL4LedUp = LED_OFF;
- for (i=0;i<FL_MAX;i++)
- {
- ucFLLedUp[i] = LED_OFF;
- }
- //设置各个楼层的下行按键灯
- sbL2LedDown= LED_OFF;
- sbL3LedDown = LED_OFF;
- sbL4LedDown = LED_OFF;
- sbL5LedDown = LED_OFF;
- for (i=0;i<FL_MAX;i++)
- {
- ucFLLedDown[i] = LED_OFF;
- }
- //状态
- ucSysState = SL_IDLE;
- //显示
- DisBuffer = DEF_IDLE_DISP_CHAR;
- ucDispState = DS_IDLE;
- P1 = LED_DISP_NUM[ucElevatorFL+1];
- ucFlashArrowTimeCount = 0; //闪烁计时
- bFlashShowArrow = 1; //是否当前显示空白
- //定时器配置
- TMOD = 0x11; //T0:16位定时器 T1:8位定时器
- //T0 配置
- TH0 = SEQ_TIMER0_H; //T0附初值
- TL0 = SEQ_TIMER0_L;
- ET0 = 1; //使能T0中断
- TR0 = 1; //使能T0
- //T1配置
- /*
- TH1 = SEQ_TIMER1_H;
- TL1 = SEQ_TIMER1_L;
- ET1 = 0;
- TR1 = 0;
- */
- /*
- //串口配置
- PCON = 0x00; //SMOD=0 即波特率无倍增
- SCON = 0x50; //8位数据,可变波特率
- RCLK = 0; //设置T1为串口的波特率发生器
- TCLK = 0;
- TH1= RELOAD_BAUD_9600;
- TL1 = RELOAD_BAUD_9600;
- ET1 = 0;//禁止定时器1中断
- TR1 = 1;//启动定时器1
- ES = 1; //启动串口中断
- */
- EA=1;//使能总中断
- //启动完成提示音
- vSoundOnOff(ON,200);
- vSoundOnOff(OFF,0);
- }
- /*
- //计算运行方向及目标楼层
- UCHAR ucGetElevatorUpTarget()
- {
- UCHAR i,ucTargetFl;
- ucTargetFl = FL_MAX;
- if(ucElevatorFL<FLOOR_MAX)
- {
- for (i=ucElevatorFL+1;i<FL_MAX;i++) //查找是否有上行呼叫
- {
- if (ucFLLedUp[i]==LED_ON)
- {
- ucTargetFl=i;
- break;
- }
- }
- }
- return ucTargetFl;
- }
- //计算运行方向及目标楼层
- UCHAR ucGetElevatorDownTarget()
- {
- UCHAR i,ucTargetFl;
- ucTargetFl = FL_MAX;
- if(ucElevatorFL>FLOOR_MIN+1)
- {
- for (i=ucElevatorFL-1;i>FL_1;i--) //查找是否有下行呼叫
- {
- if (ucFLLedDown[i]==LED_ON)
- {
- ucTargetFl=i;
- break;
- }
- }
- }
- return ucTargetFl;
- }
- */
- //计算运行方向及目标楼层
- UCHAR ucGetDirection()
- {
- UCHAR i,ucTemp;
- UCHAR ucDirection;
- if (ucFCLLen==0)
- {
- return ESL_STANDBY;
- }
- ucDirection = ESL_MAX;
- //ucDirection = ucElevatorState;
- ucElevatorTargetFL = FCL_MAX;
- if (ucElevatorFL == FLOOR_MIN) //电梯停留在1楼
- {
- for(i=0;i<ucFCLLen;i++)
- {
- if ((ucFloorCallList[i]>=FCL_UP_MIN)&&(ucFloorCallList[i]<=FCL_UP_MAX))
- {
- ucDirection = ESL_UP;
- ucCallElevatorState = ESL_UP;
- ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
- if (ucElevatorTargetFL==FCL_MAX)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- else if (ucElevatorTargetFL>ucTemp)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- //break;
- }
- }
- if (ucDirection == ESL_MAX)
- {
- for(i=0;i<ucFCLLen;i++)
- {
- if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX))
- {
- ucDirection = ESL_UP;
- ucCallElevatorState = ESL_DOWN;
- ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
- if (ucElevatorTargetFL==FCL_MAX)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- else if (ucElevatorTargetFL<ucTemp)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- }
- }
- //ucDirection = ESL_UP;
- //ucCallElevatorState = ESL_DOWN;
- }
- }
- else if ((ucElevatorFL > FLOOR_MIN)&&(ucElevatorFL < FLOOR_MAX)) //中间楼层
- {
- if (ucElevatorState==ESL_STANDBY)
- {
- #if 1
- if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
- {
- ucCallElevatorState = ESL_UP;
- ucDirection = ESL_UP;
- for(i=0;i<ucFCLLen;i++)
- {
- if ((ucFloorCallList[i]>=FCL_UP_MIN)&&(ucFloorCallList[i]<=FCL_UP_MAX))
- {
- ucCallElevatorState = ESL_UP;
- ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
- if (ucElevatorTargetFL==FCL_MAX)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- else if (ucElevatorTargetFL>ucTemp)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- //break;
- }
- }
- //ucTemp = ucGetFloorByFCL(ucFloorCallList[0]);
- //ucElevatorTargetFL = ucTemp;
- //ucElevatorTargetFLListID = 0;
- if (ucElevatorFL<ucElevatorTargetFL)
- {
- ucDirection = ESL_UP;
- }
- else
- {
- ucDirection = ESL_DOWN;
- }
- }
- else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
- {
- ucCallElevatorState = ESL_DOWN;
- for(i=0;i<ucFCLLen;i++)
- {
- if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX))
- {
- ucDirection = ESL_UP;
- ucCallElevatorState = ESL_DOWN;
- ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
- if (ucElevatorTargetFL==FCL_MAX)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- else if (ucElevatorTargetFL<ucTemp)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- }
- }
- //ucTemp = ucGetFloorByFCL(ucFloorCallList[0]);
- //ucElevatorTargetFL = ucTemp;
- //ucElevatorTargetFLListID = 0;
- if (ucElevatorFL<ucElevatorTargetFL)
- {
- ucDirection = ESL_UP;
- }
- else
- {
- ucDirection = ESL_DOWN;
- }
- }
- #else
- if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
- {
- ucCallElevatorState = ESL_UP;
- ucTemp = ucGetFloorByFCL(ucFloorCallList[0]);
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = 0;
- if (ucElevatorFL<ucTemp)
- {
- ucDirection = ESL_UP;
- }
- else
- {
- ucDirection = ESL_DOWN;
- }
- }
- else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
- {
- ucCallElevatorState = ESL_DOWN;
- ucTemp = ucGetFloorByFCL(ucFloorCallList[0]);
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = 0;
- if (ucElevatorFL<ucTemp)
- {
- ucDirection = ESL_UP;
- }
- else
- {
- ucDirection = ESL_DOWN;
- }
- }
- #endif
- }
- else if (ucElevatorState==ESL_UP)
- {
- for(i=0;i<ucFCLLen;i++)
- {
- ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
- if ((ucFloorCallList[i]>=FCL_UP_MIN)&&(ucFloorCallList[i]<=FCL_UP_MAX)
- &&(ucElevatorFL<ucTemp))
- {
- ucDirection = ESL_UP;
- ucCallElevatorState = ESL_UP;
- if (ucElevatorTargetFL==FCL_MAX)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- else if (ucElevatorTargetFL>ucTemp)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- //break;
- }
- }
- #if 0
- if (ucDirection == ESL_MAX)
- {
- ucDirection = ESL_STANDBY;
- /*
- if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
- {
- ucCallElevatorState = ESL_UP;
- if (ucElevatorFL<ucGetFloorByFCL(ucFloorCallList[i]))
- {
- ucDirection = ESL_UP;
- }
- else
- {
- ucDirection = ESL_DOWN;
- }
- }
- else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
- {
- ucCallElevatorState = ESL_DOWN;
- if (ucElevatorFL<ucGetFloorByFCL(ucFloorCallList[i]))
- {
- ucDirection = ESL_UP;
- }
- else
- {
- ucDirection = ESL_DOWN;
- }
- }
- */
- }
- #endif
- }
- else if (ucElevatorState==ESL_DOWN)
- {
- ucElevatorTargetFL= FCL_MAX;
- for(i=0;i<ucFCLLen;i++)
- {
- ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
- if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX)
- &&(ucElevatorFL<ucGetFloorByFCL(ucFloorCallList[i])))
- {
- ucDirection = ESL_DOWN;
- ucCallElevatorState = ESL_DOWN;
- if (ucElevatorTargetFL==FCL_MAX)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- else if (ucElevatorTargetFL<ucTemp)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- }
- }
- #if 0
- if (ucDirection == ESL_MAX)
- {
- ucDirection = ESL_STANDBY;
- /*
- if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
- {
- ucCallElevatorState = ESL_UP;
- if (ucElevatorFL<ucGetFloorByFCL(ucFloorCallList[i]))
- {
- ucDirection = ESL_UP;
- }
- else
- {
- ucDirection = ESL_DOWN;
- }
- }
- else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
- {
- ucCallElevatorState = ESL_DOWN;
- if (ucElevatorFL<ucGetFloorByFCL(ucFloorCallList[i]))
- {
- ucDirection = ESL_UP;
- }
- else
- {
- ucDirection = ESL_DOWN;
- }
- }
- */
- }
- #endif
- }
- }
- else if (ucElevatorFL == FLOOR_MAX)
- {
- #if 1
- ucDirection = ESL_MAX;
- //优先查找下行呼叫
- for(i=0;i<ucFCLLen;i++)
- {
- ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
- if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX))
- {
- ucDirection = ESL_DOWN;
- ucCallElevatorState = ESL_DOWN;
- if (ucElevatorTargetFL==FCL_MAX)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- else if (ucElevatorTargetFL<ucTemp)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- }
- }
- //无下行呼叫开始查找上行呼叫
- if (ucDirection == ESL_MAX)
- {
- for(i=0;i<ucFCLLen;i++)
- {
- ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
- if ((ucFloorCallList[i]>=FCL_UP_MIN)&&(ucFloorCallList[i]<=FCL_UP_MAX))
- {
- ucDirection = ESL_DOWN;
- ucCallElevatorState = ESL_UP;
- if (ucElevatorTargetFL==FCL_MAX)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- else if (ucElevatorTargetFL>ucTemp)
- {
- ucElevatorTargetFL = ucTemp;
- ucElevatorTargetFLListID = i;
- }
- }
- }
- }
- #else
- for(i=0;i<ucFCLLen;i++)
- {
- if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX))
- {
- ucDirection = ESL_DOWN;
- ucCallElevatorState = ESL_DOWN;
- break;
- }
- }
- if (ucDirection == ESL_MAX)
- {
- ucDirection = ESL_DOWN;
- ucCallElevatorState = ESL_UP;
- }
- #endif
- }
- return ucDirection;
- }
- //电梯运行
- //规则
- //1.电梯停留在最底层时上行优先
- //2.电梯停留在中间层时,先按键的楼层呼叫优先
- //3.电梯停留在最顶层时,下行优先
- //4.与电梯运行方向相同的呼叫优先
- //5.电梯到达楼层蜂鸣器提示
- //6.电梯当前停留的楼层上行、下行按键均不作用
- #if 1
- void vElevatorState()
- {
- UCHAR i;
- if (ucFCLLen==0)
- {
- return ;
- }
- if (ucElevatorState==ESL_STANDBY) //电梯处于静止待机状态
- {
- ucElevatorState = ucGetDirection();
- if ((ucElevatorState==ESL_UP)||(ucElevatorState==ESL_DOWN))
- {
- if (ucElevatorState == ESL_UP)
- {
- vSetElevatorLed(SEL_UP);
- }
- else
- {
- vSetElevatorLed(SEL_DOWN);
- }
- bFlashShowArrow = 1;
- ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
- ucElevatorTimeCount = 0;
- }
- else
- {
- ucElevatorState = ESL_STANDBY;
- vSetElevatorLed(SEL_NONE);
- }
- }
- else if (ucElevatorState==ESL_UP)
- {
- if (ucElevatorTimeCount>=ucElevatorTimeOut)
- {
- if (ucElevatorFL<FLOOR_MAX)
- {
- ucElevatorFL ++;
- DisBuffer = ucElevatorFL+1;
- P1= LED_DISP_NUM[ucElevatorFL+1];
- }
- //DelayMS(1000);
- //P1= LED_DISP_NUM[ucElevatorTargetFL+1]; //test
- //DelayMS(1000);
- if (ucElevatorTargetFL == ucElevatorFL)
- {
- if ((ucFloorCallList[ucElevatorTargetFLListID]>=FCL_UP_MIN)&&(ucFloorCallList[ucElevatorTargetFLListID]<=FCL_UP_MAX))
- {
- vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
- }
- else if ((ucFloorCallList[ucElevatorTargetFLListID]>=FCL_DOWN_MIN)&&(ucFloorCallList[ucElevatorTargetFLListID]<=FCL_DOWN_MAX))
- {
- vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- }
- vDelFCLItem(ucElevatorTargetFLListID);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,50);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,0);
- //此层上行及下行按钮均按下了且目前只有此层有呼叫
- if (ucFCLLen==1)
- {
- if (ucElevatorFL==ucGetFloorByFCL(ucFloorCallList[0]))
- {
- if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
- {
- vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
- }
- else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
- {
- vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- }
- vDelFCLItem(0);
- }
- }
- }
- //已经到达最顶层
- if (ucElevatorFL==FLOOR_MAX)
- {
- for(i=0;i<ucFCLLen;i++)
- {
- if (ucElevatorFL==ucGetFloorByFCL(ucFloorCallList[i]))
- {
- if ((ucFloorCallList[i]>=FCL_UP_MIN)&&(ucFloorCallList[i]<=FCL_UP_MAX))
- {
- vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
- }
- else if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX))
- {
- vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- }
- //vDelFCLItem(ucFloorCallList[i]);
- //vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,50);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,0);
- break;
- }
- }
- }
- //计算接下来的方向及楼层
- ucElevatorState = ucGetDirection();
- //P1= LED_DISP_NUM[ucElevatorTargetFL+1]; //test
- //DelayMS(1000);
- if ((ucElevatorState==ESL_UP)||(ucElevatorState==ESL_DOWN))
- {
- if (ucElevatorState == ESL_UP)
- {
- vSetElevatorLed(SEL_UP);
- }
- else
- {
- vSetElevatorLed(SEL_DOWN);
- }
- bFlashShowArrow = 1;
- }
- else
- {
- ucElevatorState = ESL_STANDBY;
- /*
- if (ucElevatorTargetFL = ucElevatorFL)
- {
- vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
- vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- }
- */
- vSetElevatorLed(SEL_NONE);
- }
- ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
- ucElevatorTimeCount = 0;
- }
- }
- else if (ucElevatorState==ESL_DOWN)
- {
- if (ucElevatorTimeCount>=ucElevatorTimeOut)
- {
- if (ucElevatorFL>FLOOR_MIN)
- {
- ucElevatorFL --;
- DisBuffer = ucElevatorFL+1;
- P1= LED_DISP_NUM[ucElevatorFL+1];
- }
- if (ucElevatorTargetFL == ucElevatorFL)
- {
- if ((ucFloorCallList[ucElevatorTargetFLListID]>=FCL_UP_MIN)&&(ucFloorCallList[ucElevatorTargetFLListID]<=FCL_UP_MAX))
- {
- vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
- }
- else if ((ucFloorCallList[ucElevatorTargetFLListID]>=FCL_DOWN_MIN)&&(ucFloorCallList[ucElevatorTargetFLListID]<=FCL_DOWN_MAX))
- {
- vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- }
- //vDelFCLItem(ucFloorCallList[ucElevatorTargetFLListID]);
- vDelFCLItem(ucElevatorTargetFLListID);
- //vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,50);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,0);
- //此层上行及下行按钮均按下了且目前只有此层有呼叫
- if (ucFCLLen==1)
- {
- if (ucElevatorFL==ucGetFloorByFCL(ucFloorCallList[0]))
- {
- if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
- {
- vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
- }
- else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
- {
- vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- }
- vDelFCLItem(0);
- }
- }
- }
- /*
- for(i=0;i<ucFCLLen;i++)
- {
- if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX)
- &&(ucElevatorFL==ucGetFloorByFCL(ucFloorCallList[i]))
- )
- {
- vDelFCLItem(ucFloorCallList[i]);
- vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,50);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,0);
- break;
- }
- }
- */
- ucElevatorState = ucGetDirection();
- if ((ucElevatorState==ESL_UP)||(ucElevatorState==ESL_DOWN))
- {
- if (ucElevatorState == ESL_UP)
- {
- vSetElevatorLed(SEL_UP);
- }
- else
- {
- vSetElevatorLed(SEL_DOWN);
- }
- bFlashShowArrow = 1;
- }
- else
- {
- ucElevatorState = ESL_STANDBY;
- if (ucElevatorTargetFL == ucElevatorFL)
- {
- vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
- vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- }
- vSetElevatorLed(SEL_NONE);
- }
- ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
- ucElevatorTimeCount = 0;
- }
- }
- }
- #else
- void vElevatorState()
- {
- UCHAR i,ucTargetFl;
- if (ucElevatorState==ESL_STANDBY) //电梯处于静止待机状态
- {
- ucTargetFl = ucGetElevatorUpTarget();
- if (ucTargetFl!=FL_MAX)
- {
- ucElevatorTargetFL = ucTargetFl;
- ucElevatorState = ESL_UP;
- vSetElevatorLed(SEL_UP);
- bFlashShowArrow = 1;
- ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
- ucElevatorTimeCount = 0;
- }
- else
- {
- ucTargetFl = ucGetElevatorDownTarget();
- if (ucTargetFl!=FL_MAX)
- {
- ucElevatorTargetFL = ucTargetFl;
- ucElevatorState = ESL_DOWN;
- vSetElevatorLed(SEL_DOWN);
- bFlashShowArrow = 1;
- ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
- ucElevatorTimeCount = 0;
- }
- }
- }
- else if (ucElevatorState==ESL_UP) //电梯处于向上运行状态
- {
- if (ucElevatorTimeCount>=ucElevatorTimeOut)
- {
- if (ucElevatorFL<FLOOR_MAX)
- {
- ucElevatorFL ++;
- DisBuffer = ucElevatorFL+1;
- P1= LED_DISP_NUM[ucElevatorFL+1];
- }
- if (ucElevatorFL==ucElevatorTargetFL)
- {
- vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,50);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,0);
- }
- if (ucElevatorFL <FLOOR_MAX)
- {
- ucTargetFl = ucGetElevatorUpTarget();
- if (ucTargetFl!=FL_MAX)
- {
- ucElevatorTargetFL = ucTargetFl;
- ucElevatorState = ESL_UP;
- vSetElevatorLed(SEL_UP);
- bFlashShowArrow = 1;
- ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
- ucElevatorTimeCount = 0;
- }
- else
- {
- ucTargetFl = ucGetElevatorDownTarget();
- if (ucTargetFl!=FL_MAX)
- {
- ucElevatorTargetFL = ucTargetFl;
- ucElevatorState = ESL_DOWN;
- vSetElevatorLed(SEL_DOWN);
- bFlashShowArrow = 1;
- ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
- ucElevatorTimeCount = 0;
- }
- else
- {
- ucElevatorState = ESL_STANDBY;
- vSetElevatorLed(SEL_NONE);
- }
- }
- }
- else
- {
- vSetElevatorLed(SEL_NONE);
- }
- ucElevatorTimeCount = 0;
- }
- }
- else if (ucElevatorState==ESL_DOWN) //电梯处于向下运行状态
- {
- if (ucElevatorTimeCount>=ucElevatorTimeOut)
- {
- if (ucElevatorFL>FLOOR_MIN)
- {
- ucElevatorFL --;
- DisBuffer = ucElevatorFL+1;
- P1= LED_DISP_NUM[ucElevatorFL+1];
- }
- if (ucElevatorFL==ucElevatorTargetFL)
- {
- vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,50);
- vSoundOnOff(ON,50);
- vSoundOnOff(OFF,0);
- }
- if (ucElevatorFL >FLOOR_MIN)
- {
- ucTargetFl = ucGetElevatorDownTarget();
- if (ucTargetFl!=FL_MAX)
- {
- ucElevatorTargetFL = ucTargetFl;
- ucElevatorState = ESL_DOWN;
- vSetElevatorLed(SEL_DOWN);
- bFlashShowArrow = 1;
- ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
- ucElevatorTimeCount = 0;
- }
- else
- {
- ucTargetFl = ucGetElevatorUpTarget();
- if (ucTargetFl!=FL_MAX)
- {
- ucElevatorTargetFL = ucTargetFl;
- ucElevatorState = ESL_UP;
- vSetElevatorLed(SEL_UP);
- bFlashShowArrow = 1;
- ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
- ucElevatorTimeCount = 0;
- }
- else
- {
- ucElevatorState = ESL_STANDBY;
- vSetElevatorLed(SEL_NONE);
- }
- }
- }
- else
- {
- vSetElevatorLed(SEL_NONE);
- }
- ucElevatorTimeCount = 0;
- }
- }
- }
- #endif
- //LED状态灯控制
- void vLedState()
- {
- }
- //箭头闪烁控制
- void vFlahArrow()
- {
- if ((ucElevatorState!=ESL_UP)&&(ucElevatorState!=ESL_DOWN))
- {
- return ;
- }
- if (ucFlashArrowTimeCount>=TIME_FLASH_ARROW_COUNT)
- {
- if ((bFlashShowArrow)) //当前显示的是内容
- {
- vSetElevatorLed(SEL_NONE);
- bFlashShowArrow = 0;
- }
- else //当前显示的是空白
- {
- if (ucElevatorState== ESL_UP)
- {
- vSetElevatorLed(SEL_UP);
- }
- else if (ucElevatorState == ESL_DOWN)
- {
- vSetElevatorLed(SEL_DOWN);
- }
- bFlashShowArrow = 1;
- }
- ucFlashArrowTimeCount= 0;
- }
- }
- //字符闪烁控制
- void vFlashChar()
- {
- if (ucFlashTimeCount>=TIME_FLASH_FREQ_COUNT)
- {
- if ((bFlashShowBlanking)||(bKeyRepeated)) //当前显示的是空白,按键连续动作时取消闪烁
- {
- bFlashShowBlanking = 0;
- }
- else //当前显示的是内容
- {
- bFlashShowBlanking = 1;
- }
- ucFlashTimeCount = 0;
- }
- }
- //读取按键及处理
- void vReadKey()
- {
- if (!bKeyReaded)
- {
- return ;
- }
- switch(ucKeyDet)
- {
-
- default:
- break;
- }
- bKeyReaded = 0;
- ucKeyDet = KEY_MAX;
- }
- //主函数
- main()
- {
- //软硬件初始化
- vInit();
- while (1)
- {
- //键盘处理
- //LED状态灯
- vLedState();
- //字符闪烁控制
- vFlashChar();
- //电梯运行
- vElevatorState();
- //箭头闪烁控制
- vFlahArrow();
- }
- }
- //时钟中断处理函数(含显示及按键检测)
- void vTimeStateMachine() interrupt 1
- {
- //T0为10ms中断
- //UCHAR ucKeyDecode;
- TH0 = SEQ_TIMER0_H;
- TL0 = SEQ_TIMER0_L;
- ucBaseTimeCount ++;
- if (ucBaseTimeCount>=TIME_50MS_COUNT) //50ms计数
- {
- ucBaseTimeCount = 0;
- //按键状态计数
- uiKeyTimeCount ++;
- //按键按下延时检测
- if (ucKeyDownCount<TIME_KEY_REPEAT_COUNT)
- {
- ucKeyDownCount ++;
- }
- //电梯运行计数
- if ((ucElevatorState==ESL_UP)||(ucElevatorState==ESL_DOWN))
- {
- if (ucElevatorTimeCount<ucElevatorTimeOut)
- {
- ucElevatorTimeCount ++;
- }
- if (ucFlashArrowTimeCount<TIME_FLASH_ARROW_COUNT)
- {
- ucFlashArrowTimeCount ++;
- }
- }
- }
- //按键检测
- //上行
- if ((sbL1KeyUp==KEY_DOWN)&&(ucElevatorFL!=FL_1))
- {
- vSetFloorLed(FL_1,CEL_UP,LED_ON);
- vAdd2FCL(FCL_FL1_UP);
- }
- if ((sbL2KeyUp==KEY_DOWN)&&(ucElevatorFL!=FL_2))
- {
- vSetFloorLed(FL_2,CEL_UP,LED_ON);
- vAdd2FCL(FCL_FL2_UP);
- }
- if ((sbL3KeyUp==KEY_DOWN)&&(ucElevatorFL!=FL_3))
- {
- vSetFloorLed(FL_3,CEL_UP,LED_ON);
- vAdd2FCL(FCL_FL3_UP);
- }
- if ((sbL4KeyUp==KEY_DOWN)&&(ucElevatorFL!=FL_4))
- {
- vSetFloorLed(FL_4,CEL_UP,LED_ON);
- vAdd2FCL(FCL_FL4_UP);
- }
- //下行
- if ((sbL2KeyDown==KEY_DOWN)&&(ucElevatorFL!=FL_2))
- {
- vSetFloorLed(FL_2,CEL_DOWN,LED_ON);
- vAdd2FCL(FCL_FL2_DOWN);
- }
- if ((sbL3KeyDown==KEY_DOWN)&&(ucElevatorFL!=FL_3))
- {
- vSetFloorLed(FL_3,CEL_DOWN,LED_ON);
- vAdd2FCL(FCL_FL3_DOWN);
- }
- if ((sbL4KeyDown==KEY_DOWN)&&(ucElevatorFL!=FL_4))
- {
- vSetFloorLed(FL_4,CEL_DOWN,LED_ON);
- vAdd2FCL(FCL_FL4_DOWN);
- }
- if ((sbL5KeyDown==KEY_DOWN)&&(ucElevatorFL!=FL_5))
- {
- vSetFloorLed(FL_5,CEL_DOWN,LED_ON);
- vAdd2FCL(FCL_FL5_DOWN);
- }
- }
复制代码
全部资料51hei下载地址:
11.zip
(129.92 KB, 下载次数: 118)
|