1N]6F6L54DC9R}5RD4Y80V0.png (99.74 KB, 下載次數: 54)
下載附件
下二樓
2019-5-15 22:13 上傳
Y6MKK@052_8TL3K{N[})DEN.png (96.38 KB, 下載次數: 59)
下載附件
上3樓
2019-5-15 22:13 上傳
單片機源程序如下:
- #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);
- }
- }
復制代碼
0.png (6.3 KB, 下載次數: 60)
下載附件
2019-5-15 23:20 上傳
全部資料51hei下載地址:
11.zip
(129.92 KB, 下載次數: 119)
2019-5-15 22:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|