📄 user.c
字号:
//user.c
#include "pic18.h"
#include "os\os.h"
#include "user\user.h"
#include "user\pcb.h"
static unsigned char CommRxCnt,CommRxOld;
static union
{
unsigned char Buff[32];
struct
{
unsigned int MyAddr;
unsigned int SourceAddr;
unsigned int FuctCode;
unsigned char dLen;
unsigned char Data [];
unsigned char Sum;
}Frame;
}Comm;
unsigned char LockState; //锁状态,0=闭锁,1=开锁
unsigned char DoorState; //门状态,0=关门,1=开门
unsigned char DoorOldState; //门上次的状态,0=关门,1=开门
unsigned char OpenSwState; //出门按钮的状态,0=按下,1=放开
unsigned char OpenSwOldState; //出门按钮上次的状态,1=按下
unsigned char DoorSw; //安装门磁的端口
unsigned char TmrUnLock[PORTS]; //开锁保持时间
unsigned char DoorOpenTime[PORTS]; //门开计时
void userinit(void)
{
}
void WgReader(void)
{
}
void CommCmd(unsigned int cmd) //命令解释
{
switch (cmd)
{
case 0x0101:
{
break;
}
case 0x0102:
{
break;
}
}
}
void CommRxProtocol(void) // 通信接收协议解释任务
{
unsigned char rx;
while(1)
{
while (!osGetCommBuff(1,&rx))
{
DelayOsTicks(1);
}
if (rx==0x7e)
{
if ((CommRxCnt>8)&&(Comm.Frame.Sum==Comm.Buff[CommRxCnt]))
{
CommCmd(Comm.Frame.FuctCode);
}
CommRxCnt=0;
Comm.Frame.Sum=0;
osQuit();
}
else if (CommRxOld==0x7f)
{
if (rx==0x01)
{
rx=0x7e;
CommRxOld=0x01;
}
else if (rx==0x02)
{
rx=0x7f;
CommRxOld=0x02;
}
else //错误
{
CommRxCnt=0;
Comm.Frame.Sum=0;
osQuit();
}
}
else
{
CommRxOld=rx;
}
Comm.Buff[CommRxCnt]=rx;
CommRxCnt ++;
if (CommRxCnt<Comm.Frame.dLen+8)
{
Comm.Frame.Sum += rx;
}
}
}
void CardTask(void)
{
osQuit();
}
void UnLock(unsigned char port)//开锁功能
{
// 从存储器读取开锁保持时间
LockState |= 1<<port ;// 开锁
}
void CloseLockTask(void)//闭锁任务
{
unsigned char port;
while (1)
{
DelayOsTicks(100); //延时1秒
for (port=0;port<PORTS;port++)
{
if (TmrUnLock[port])
{
TmrUnLock[port] --;
if (TmrUnLock[port]==0)
{
;// 如果不在禁止闭锁时间段,则闭锁
}
}
} //for ()
;//刷新继电器状态
} // while (1)
}
void ChkOpenSw(void)//检测出门按钮开关
{
unsigned char port;
while (1)
{
OpenSwOldState=0;
for (port=0;port<PORTS;port++)
{
if (OpenSwState&1<<port)
{
OpenSwOldState |= 1<<port;
}
}
DelayOsTicks(10); //0.1s
for (port=0;port<PORTS;port++)
{
if ((OpenSwState&1<<port)&&(OpenSwOldState&1<<port))
{
UnLock(port);// 开门
}
}
}
}
void ChkDoorSw(void) //门状态检测
{
unsigned char port;
while (1)
{
DelayOsTicks(20); //0.2s
for (port=0;port<PORTS;port++)
{
if (DoorSw&1<<port) //如果安装门磁
{
if (DoorState & (1<<port)) //门开
{
if ((DoorOldState &= 1<<port)&&(LockState | !(1<<port))) // 如果不是开锁状态
{
;//破门报警
}
DoorOldState |= 1<<port;
if (DoorOpenTime[port])
{
DoorOpenTime[port]--;
if (DoorOpenTime[port]==0)
{
; //关门提醒
}
}
}
else
{
DoorOpenTime[port]=200; //0.2*200=40s
DoorOldState &= ~(1<<port);
}
}
}
}
}
void LEDTask(void)
{
}
void BeepTask(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -