📄 main.c
字号:
/* This program is used for Signalmachine.
Copyright by Wangr
2006-05-27
LOG:
2006-05-27: C8051F020 configured
*/
#include <intrins.h>
#include <absacc.h>
#include <math.h>
#include <string.h>
#include <config.c>
#include <maindef.h>
#include <Flash.c>
#include <ram.c>
#include <calender.c>
/******* parameter declare *********/
/******* *********/
uchar xdata Com0RecBuf[RecBufLen], Com1RecBuf[RecBufLen],Com0SendBuf[SendBufLen], Com1SendBuf[SendBufLen], ComProcessBuf[RecBufLen];
uchar xdata Com0RecBufIdx, Com1RecBufIdx;
bit Com0SaveEn, Com1SaveEn, Com0RecComplete, Com1RecComplete;
uchar xdata SystemState, PhaseNum, DectNum, RunMode, RunPlanNum, TotalPlanNum;
/******* function declare *********/
/******* *********/
void config (void);
void McuInit (void);
void delayus(uchar delayvalue);
void ComDataProcess(uchar *ComRecDataAdr, uchar *ComSendDataAdr);
void FlashWE(void) ;/*Write Enable (WREN) Instruction*/
void FlashWD(void);/*Write Disable (WRDI) Instruction*/
uchar FlashRDSR(void) ;/*Read Status Register (RDSR) Instruction*/
/*Status Register :bit7-2 non-used; bit1 WEL(write enable latch); bit0 WIP(write in progress)*/
void FlashRDB(uint PageAdr, uchar Colum, uchar length, uchar *FlashBuf);/*Read Data Bytes (READ)*/
void FlashReadFast(uint PageAdr, uchar Colum, uchar length, uchar *FlashBuf) ;/*Read Data Bytes at Higher Speed (FAST_READ)*/
void FlashPW(uint PageAdr, uchar Colum, uchar length, uchar *FlashBuf);/*Page Write (PW)*/
void FlashPE(uint PageAdr, uchar Colum) ;/*Page Erase (PE)*/
void FlashSE(uint PageAdr, uchar Colum) ;/*Sector Erase (SE)*/
void RamByteWR(uchar RowAdr, uchar ColumnAdr, uchar ramdata);/*write 1 byte to RAM*/
uchar RamByteRD(uchar RowAdr, uchar ColumnAdr);/*read 1 byte from RAM*/
/******* main function *********/
/******* *********/
void main()
{
config();
McuInit();
/*read info from flash*/
do
{
FlashRDB(BasicInfoStartAddr, 0x00, 256, FlashBuf);
}while(FlashBuf[0]==0xFF);/*judge the first use ?*/
PhaseNum = FlashBuf[64];
DectNum = FlashBuf[65];
FlashRDB(BasicInfoStartAddr+1, 0x00, 256, FlashBuf);
RunMode = FlashBuf[0];
RunPlanNum = FlashBuf[1];
TotalPlanNum = FlashBuf[2];
do
{
if(Com0RecComplete)
{
ComDataProcess(Com0RecBuf, Com0SendBuf);
Com0RecComplete = 0;
}
if(Com1RecComplete)
{
Com1RecComplete = 0;
}
}while(1);
}
/******* function body *********/
/******* *********/
void McuInit (void)
{
/*Timer2 for UART0; Timer4 for UART1; Timer3 for 1 second control
SPI for FLASH; I2C for calender IC*/
/***** UART *****/
Com0RecBufIdx = 0;
Com1RecBufIdx = 0;
Com0SaveEn = 0;
Com1SaveEn = 0;
Com0RecComplete = 0;
Com1RecComplete = 0;
/* FLASH */
FlashCS = 1;
FlashWD();/*Flash writtten disabled*/
/*I2C master mode*/
i2c_init();
}
/* delay function ; us unit for 22.1184 MHz*/
void delayus(uchar delayvalue)
{
uchar idata i;
for(i=0;i<delayvalue;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/**** timer3 for 1 second control ****/
void timer3_int(void) interrupt 14 using 0
{
TMR3CN &= 0x7F;
}
void serial0_int(void) interrupt 4 using 1
{
if(RI0)
{
RI0 = 0;
if(Com0SaveEn)
{
Com0RecBuf[Com0RecBufIdx++] = SBUF0;
if(Com0RecBufIdx==RecBufLen)
{
Com0SaveEn = 0;
Com0RecComplete = 1;
}
}
else
{
Com0RecBuf[0] = Com0RecBuf[1];
Com0RecBuf[1] = SBUF0;
if(Com0RecBuf[0]==0xEB&&Com0RecBuf[1]==0x90)
{
Com0SaveEn = 1;
Com0RecBufIdx = 2;
}
}
}
if(TI0)
{
TI0=0;
/* if (PacketIdx < TxPacketLen) // Downlink Packet is unique to 32 Bytes.
{
IsTxBusy = TRUE;
SBUF = *(BYTE *)(pTX_Buf + PacketIdx);
PacketIdx ++;
}
else
{
IsTxBusy = FALSE;
SBUF0 = 0x55;
}*/
}
}
void serial1_int(void) interrupt 20 using 2
{
if((SCON1&0x01)==1)
{
SCON1 &= 0xFE;
if(Com1SaveEn)
{
Com1RecBuf[Com1RecBufIdx++] = SBUF1;
if(Com1RecBufIdx==RecBufLen)
{
Com1SaveEn = 0;
Com1RecComplete = 1;
}
}
else
{
Com1RecBuf[0] = Com1RecBuf[1];
Com1RecBuf[1] = SBUF1;
if(Com1RecBuf[0]==0xEB&&Com1RecBuf[1]==0x90)
{
Com1SaveEn = 1;
Com1RecBufIdx = 2;
}
}
}
if((SCON1&0x02)==1)
{
SCON1 &= 0xFD;
/* if (PacketIdx < TxPacketLen) // Downlink Packet is unique to 32 Bytes.
{
IsTxBusy = TRUE;
SBUF = *(BYTE *)(pTX_Buf + PacketIdx);
PacketIdx ++;
}
else
{
IsTxBusy = FALSE;
SBUF1 = 0x55;
}*/
}
}
/*process data received from com0 or com1*/
void ComDataProcess(uchar *ComRecDataAdr, uchar *ComSendDataAdr)
{
uchar idata i,temp;
uchar idata *point;
uchar idata PlanNum, StageNum, TotalStage;
uint idata PageAdr;
uchar idata Colum, length;
point = ComRecDataAdr;
for(i=0;i<RecBufLen;i++)
{
ComProcessBuf[i] = *(point+i);
}
temp = ComProcessBuf[2];
for(i=3;i<RecBufLen-1;i++)
{
temp ^= ComProcessBuf[i];
}
if(temp==ComProcessBuf[RecBufLen-1]) /*valid data frame, process data received*/
{
switch (ComProcessBuf[2])
{
case WritePlans: /*write plans to Flash*/
RunMode = IsSetMode;
PlanNum = ComProcessBuf[3];
TotalStage = ComProcessBuf[4];
StageNum = ComProcessBuf[5];
PageAdr = PlanStartAddr + (uint)(PlanNum*10) + (uint)(StageNum/10);
Colum = (StageNum%10)*25;
length = 25;
FlashWE();
FlashPW(PageAdr, Colum, length, ComProcessBuf+6);
if(StageNum==0x00)
{
PageAdr = PlanStartAddr + (uint)(PlanNum*10);
Colum = 250;
length = 1;
*point = TotalStage;
FlashPW(PageAdr, Colum, length, point);
}
break;
case ReadPlans: /*read plans from Flash and send*/
PlanNum = ComProcessBuf[3];
StageNum = ComProcessBuf[5];
PageAdr = PlanStartAddr + (uint)(PlanNum*10) + (uint)(StageNum/10);
Colum = (StageNum%10)*25;
length = 25;
FlashWE();
FlashRDB(PageAdr, Colum, length, ComSendDataAdr+6);
for(i=0;i<6;i++)
{
*(ComSendDataAdr+i) = *(ComProcessBuf+i);
}
temp = *(ComSendDataAdr+2);
for(i=3;i<RecBufLen-1;i++)
{
temp ^= *(ComSendDataAdr+i);
}
*(ComSendDataAdr+RecBufLen-1) = temp;
if(Com0RecComplete)
{
TI0 = 1;
}
if(Com1RecComplete)
{
SCON1 |= 0x02;
}
break;
case WriteFaultTables:
break;
case ReadFaultTables:
break;
case WriteUserInfo:
break;
case ReadUserInfo:
break;
case WriteHardwareInfo:
break;
case ReadHardwareInfo:
break;
case WriteRunInfo:
break;
case ReadRunInfo:
break;
case WriteCalender:
break;
case ReadCalender:
break;
case DelLog:
break;
case ReadLog:
break;
case WriteDatetoPlan:
break;
case WritePhasetoVehicleDect:
break;
default:
break;
}
}
else /*invalid data frame*/
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -