📄 main.c
字号:
/*四层楼电梯模拟*/
#include "SPCE061A.h"
#include "a2000.h"
#include "consist.h"
#define watchdog_clear (volatile unsigned int *)0x7102
#define P_IOA_Data (volatile unsigned int *)0x7000; // Write Data into data register and read from IOA pad
#define P_IOB_Data (volatile unsigned int *)0x7005; // Write Data into the data register and read from IOB pad
#define C_BELL 00 //报时声
#define C_T00 01 //0
#define C_T01 02 //1
#define C_T02 03 //2
#define C_T03 04 //3
#define C_T04 15 //4
int up1,up2,up3,down2,down3,down4,goto1,goto2,goto3,goto4; /*记录用户请求*/
int open_color;/*电梯状态颜色*/
int shang,floor;/*相关参数*/
unsigned int uiValue,ko;
unsigned int uiDelay=0x0008;
int keyscan1(void);
int keyscan2(void);
void Clear_WatchDog(void);
void POA_Initial(void);
void POB_Initial(void);
void goto1_off(void);
void goto1_on(void);
void goto2_off(void);
void goto3_on(void);
void goto3_off(void);
void goto3_on(void);
void goto4_off(void);
void goto4_on(void);
void up1_off(void);
void up1_on(void);
void up2_off(void);
void up2_on(void);
void up3_off(void);
void up3_on(void);
void down2_off(void);
void down2_on(void);
void down3_off(void);
void down3_on(void);
void down4_off(void);
void down4_on(void);
void stoplift_off(void);
void stoplift_on(void);
void downlift_off(void);
void downlift_on(void);
void uplift_off(void);
void uplift_on(void);
void screen_1(void);
void screen_2(void);
void screen_3(void);
void screen_4(void);
void delay(void)
{ int i,j;
for(i=1;i<334;i++)
{for(j=0;j<0xffff;j++)
{Clear_WatchDog();
}
}
}
/********************************/
void screen_show(int n)
{switch(n)
{ case 1:screen_1();break;
case 2:screen_2();break;
case 3:screen_3();break;
case 4:screen_4();break;
default:break;
}
}
/************************播放提示语音*********************/
void PlayRespond(unsigned int Result)
{ SACM_A2000_Initial(1);
SACM_A2000_Play(Result,3,3);
while((SACM_A2000_Status()&0x0001) != 0)
{ Clear_WatchDog();
SACM_A2000_ServiceLoop();
}
SACM_A2000_Stop();
}
/*报楼层*/
void playsound(int n)
{PlayRespond(C_BELL);
PlayRespond(n+C_BELL);
}
/*初始化*/
void init(void)
{
up1 = 0;
up2 = 0;
up3 = 0;
down2 = 0;
down3 = 0;
down4 = 0;
up1_off();
up2_off();
up3_off();
down2_off();
down3_off();
down4_off();
stoplift_on();
uplift_off();
downlift_off();
screen_show(floor);
}
void stay(void)
{
init();
}
void stop(void)
{
stoplift_on();
delay();
}
void opendoor(int n)
{ open_color=1;
if(shang = 1)
{
switch(n)
{case 1: up1=0;goto1=0;goto1_off();up1_off();break;
case 2: up2=0;goto2=0;goto2_off();up2_off();break;
case 3: up3=0;goto3=0;goto3_off();up3_off();break;
case 4: goto4=0;down4=0;goto4_off();down4_off();break;
}
}
else
{
switch(n)
{case 1:up1=0;goto1=0;goto1_off();up1_off();break;
case 2:down2=0;goto2=0;goto2_off();down2_off();break;
case 3:down3=0;goto3=0;goto3_off();down3_off();break;
case 4:down4=0;goto4=0;goto4_off();down4_off();break;
}
}
delay();
delay();
delay();
open_color=0;
}
void timer_Load(void)
{ screen_show(floor);
playsound(floor);
if(floor > 4)
{ floor = floor - 2;
shang = 0;
}
if(floor < 1)
{floor = floor + 2;
shang=1;
}
if(up1 == 1 || up2 == 1 || up3 == 1 || down2 == 1 || down3 == 1 || down4 == 1 || goto1 == 1 || goto2 == 1 || goto3 == 1 || goto4 == 1)
{ stoplift_off();
if(shang == 1)
{uplift_on();
downlift_off();
switch(floor)
{ case 1:
if(up1 == 1 || goto1 == 1)
stop();
opendoor(1);
break;
case 2:
if((up2 == 0 && up3 == 0 && down3 == 0 && down4 == 0 && goto3 == 0 && goto4 == 0) && (up1 == 1 || down2 == 1 || goto1 == 1))
{shang=0;
}
if(up2 == 1 || goto2 == 1)
stop();
opendoor(2);
break;
case 3:
if((up3 == 0 && down4 == 0 && goto4 == 0) && (up1 == 1 || down2 == 1 || up2 == 1 || down3 == 1 || goto1 == 1 || goto2 == 1))
{shang=0;
}
if(up3 == 1 || goto3 == 1)
stop();
opendoor(3);
break;
case 4:
if(goto4 == 1)
stop();
opendoor(4);
break;
}
floor++;
}
else
{uplift_off();
downlift_on();
switch(floor)
{ case 1:
if(goto1 == 1)
stop();
opendoor(1);
break;
case 2:
if(up1 == 0 && down2 == 0 && goto1 == 0 && (up2 == 1 || down3 == 1 || up3 == 1 || down4 == 1 || goto3 == 1 || goto4 == 1))
{shang=1;
}
if(down2 == 1 || goto2 == 1)
stop();
opendoor(2);
break;
case 3:
if(up1 == 0 && down2 == 0 && up2 == 0 && down3 == 0 && goto1 == 0 && goto2 == 0 && (up3 == 1 || down4 == 1 || goto4 == 1))
{shang=1;
}
if(down3 == 1 || goto3 == 1)
stop();
opendoor(3);
break;
case 4:
if(down4 == 1 || goto4 == 1)
stop();
opendoor(4);
break;
}
floor--;
}
}
else
{
uiValue=-1;
stay();
}
}
int KeyFind() //键扫描并取得健值
{int keyfirst=0,keylast;
keyfirst=keyscan1(); //取得第一次扫描的值
keylast=keyscan2(); //取得第二次扫描的值
uiValue=0x000f;
keyfirst=uiValue&keyfirst;
uiValue=0x00f0;
keylast=uiValue&keylast;
keyfirst=keyfirst|keylast;
uiValue=0x00ff;
keyfirst^=uiValue; //数据处理得到想要的扫描值
Clear_WatchDog();
switch(keyfirst) //把对应的值赋给uiValue
{
case 0x0000:
break;
case 0x00ee:
uiValue=0;
break;
case 0x00de:
uiValue=1;
break;
case 0x00be:
uiValue=2;
break;
case 0x007e:
uiValue=3;
break;
case 0x00ed:
uiValue=4;
break;
case 0x00dd:
uiValue=5;
break;
case 0x00bd:
uiValue=6;
break;
case 0x007d:
uiValue=7;
break;
case 0x00eb:
uiValue=8;
break;
case 0x00db:
uiValue=9;
break;
case 0x00bb:
uiValue=10;
break;
case 0x007b:
uiValue=11;
break;
case 0x00e7:
uiValue=12;
break;
case 0x00d7:
uiValue=13;
break;
case 0x00b7:
uiValue=14;
break;
case 0x0077:
uiValue=15;
break;
return ;
}
if(uiValue==255)
{ ko=ko;}
else
{
ko=uiValue;
}
return uiValue;
}
void scankey(void)
{ uiValue=KeyFind();
if(uiValue >= 0 )
{switch(uiValue)
{case 0:
up1 = 1;
up1_on();
break;
case 1:
up2 = 1;
up2_on();
break;
case 2:
down2 = 1;
down2_on();
break;
case 3:
up3 = 1;
up3_on();
break;
case 4:
down3 = 1;
down3_on();
break;
case 5:
down4 = 1;
down4_on();
break;
case 6:
goto1_on();
goto1 = 1;
break;
case 7:
goto2_on();
goto2 = 1;
break;
case 8:
goto3_on();
goto3 = 1;
break;
case 9:
goto4_on();
goto4 = 1;
break;
default:
break;
}
}
}
main() //低四位为带下拉电阻的输入端
{
POA_Initial();
POB_Initial();
Clear_WatchDog();
floor=1;
shang=1;
stoplift_on();
uiValue=-1;
init();
while(1)
{scankey();
timer_Load();
Clear_WatchDog();
delay();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -