📄 main.c
字号:
ET2 = 0; // Disable timer2 interrupt
T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
while (n_10ms--)
{
while (!TF2)
{
if (CmdValid || CmdReceived)
{
TR2 = FALSE;
TF2 = FALSE;
return;
}
}
TF2 = FALSE;
}
TR2 = FALSE;
}
#ifdef NOP_DELAY
/****************************************************************************
* *
* Function: delay_50us_NOP *
* *
* Input: - *
* Output: - *
* *
* Description: 延时函数 *
* *
* *
* *
****************************************************************************/
void delay_50us_NOP (void)
{
uchar i;
for(i=0; i<81; i++) _nop_();
}
#endif
/****************************************************************************
* *
* Function: delay_8us_NOP *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void delay_8us_NOP (void)
{
uchar i;
for(i=0; i<14; i++) _nop_();
}
/*****************************************************
*******************************************************/
void RingOn (void)
{
BEEP = 0;
delay_10ms(2);
BEEP = 1;
delay_10ms(2);
BEEP = 0;
delay_10ms(2);
BEEP = 1;
delay_10ms(2);
BEEP = 0;
delay_10ms(2);
BEEP = 1;
}
#pragma aregs
/****************************************************************************
* *
* Function: xtoa_h *
* *
* Input: _byte *
* Output: ASCII High-Nibble *
* *
* Description: *
* *
* Wandelt das High-Nibble des 乥ergebenen Bytes in ein ASCII-Zeichen um. *
* *
****************************************************************************/
uchar xtoa_h (uchar _byte)
{
uchar nibble = _byte >> 4;
return ((nibble > 9)? nibble + 'A' - 10 : nibble + '0');
}
/****************************************************************************
* *
* Function: xtoa_l *
* *
* Input: _byte *
* Output: ASCII Low-Nibble *
* *
* Description: *
* *
* Wandelt das Low-Nibble des 乥ergebenen Bytes in ein ASCII-Zeichen um. *
* *
****************************************************************************/
uchar xtoa_l (uchar _byte)
{
uchar nibble = _byte & 0x0F;
return ((nibble > 9)? nibble + 'A' - 10 : nibble + '0');
}
/****************************************************************************
* *
* Function: isr_timer0 *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void isr_timer0 (void) interrupt 1 using 2
{
if (Timer0Cnt)
{
--Timer0Cnt;
}
else
{
STOP_T0();
#ifdef AUTODELAY
if (DelayRate < MAXDELAYRATE && CmdCnt > 0)
{
DelayRate++;
DelayRateLocked = FALSE;
}
#endif
RecvState = RECV_STX;
if (!SendReady && LLfReady)
{
if (RepCnt < MAXREPCNT)
{
RepCnt++;
CALL_isr_UART();
}
else
{
RepCnt = 0;
Quit = FALSE;
SendReady = TRUE;
}
}
}
}
/****************************************************************************
* *
* Function: isr_UART *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* Diese Interrupt-Funktion wird vom UART aufgerufen und bearbeitet das *
* serielle Protokoll. *
* *
****************************************************************************/
void isr_UART (void) interrupt 4 using 1
{
uchar c ;
//uchar oldRecvState, chk;
if (RI)
{
c = SBUF ;
RI = 0 ;
if (FrameEnd==1)
{
if( !(ChkSum ^=c) )
{
FrameOk = 1;
LED = ON;
}
else
FrameOk = 0 ;
FrameEnd = 0 ;
}
if (FrameHead&(c !=ETX)&!FrameEnd)
{
PcData[DataNum++] = c ;
ChkSum ^= c;
DataLen++;
}
if( c == STX )
{
Pt = PcData;
DataLen =0 ;
FrameHead = 1;
FrameEnd = 0;
DataNum = 0;
ChkSum = 0;
}
if( c == ETX )
{
FrameEnd = 1;
FrameHead = 0;
}
}
}
/***************************************************************************/
unsigned char AsiToHex(unsigned char ch1,unsigned char ch2)
{
unsigned char i,j,num1,num2,HexNum;
i = ch1; j = ch2;
if ((i>=0x30)&&(i<=0x39))
{
i-=0x30 ;
num1 = i<<4 ;
}
else
{
i-= 0x41;
num1 = i ;
switch (num1)
{
case 0 : num1 = 0xa0; break;
case 1 : num1 = 0xb0; break;
case 2 : num1 = 0xc0; break;
case 3 : num1 = 0xd0; break;
case 4 : num1 = 0xe0; break;
case 5 : num1 = 0xf0; break;
}
}
if((j>=0x30)&&(j<=0x39))
{
j-= 0x30;
num2 = j ;
}
else
{
j-= 0x41;
num2 = j ;
switch (num2)
{
case 0 : num2 = 0x0a; break;
case 1 : num2 = 0x0b; break;
case 2 : num2 = 0x0c; break;
case 3 : num2 = 0x0d; break;
case 4 : num2 = 0x0e; break;
case 5 : num2 = 0x0f; break;
}
}
HexNum = num1+num2;
return HexNum ;
}
void TransAsiHex(unsigned char *PtData1,unsigned char *PtData2,unsigned char cnt)
{
unsigned char *Pt0,*Pt1;
unsigned char i,cnt0,ch1,ch2;
Pt0 = PtData1;
Pt1 = PtData2;
cnt0 = cnt/2;
for(i=0;i<cnt0;i++)
{
ch1 = *Pt0++;
ch2 = *Pt0++;
*Pt1 = AsiToHex(ch1,ch2);
Pt1++;
}
}
void TransHexAsi(unsigned char *PtData1,unsigned char *PtData2,unsigned char cnt)
{
unsigned char *Pt0,*Pt1;
unsigned char i,cnt0,ch1;
Pt0 = PtData1;
Pt1 = PtData2;
cnt0 = cnt;
for(i=0;i<cnt0;i++)
{
ch1 = *Pt0;
HexToAsi(ch1,Pt1);
Pt0++;
Pt1++; Pt1++;
}
}
void HexToAsi(unsigned char ch,unsigned char *Ptm)
{
unsigned char i,j;
unsigned char *Pt0;
Pt0 = Ptm;
i = ch;
i = (i&0xf0)>>4;
if(i<=9)
i+=0x30;
else
{
switch(i)
{
case 0x0a: i = 0x41; break;
case 0x0b: i = 0x42; break;
case 0x0c: i = 0x43; break;
case 0x0d: i = 0x44; break;
case 0x0e: i = 0x45; break;
case 0x0f: i = 0x46; break;
}
}
*Pt0 = i;
j = ch;
j = ch&0x0f;
if(j<=9)
j += 0x30;
else
{
switch(j)
{
case 0x0a: j = 0x41; break;
case 0x0b: j = 0x42; break;
case 0x0c: j = 0x43; break;
case 0x0d: j = 0x44; break;
case 0x0e: j = 0x45; break;
case 0x0f: j = 0x46; break;
}
}
Pt0++;
*Pt0 = j;
}
void SendDataToPc(uchar *Ptm,uchar cnt)
{
unsigned char i;
unsigned char checksum = 0;
SBUF = STX ;
while(!TI);
TI = 0;
for(i=0; i<cnt ; i++)
{
SBUF = *Ptm ;
while(!TI);
TI = 0;
checksum ^= *Ptm;
++Ptm;
}
SBUF = ETX ;
while(!TI);
TI = 0;
SBUF = checksum ;
while(!TI);
TI = 0;
}
void SendSnrToPc(uchar *Ptm,uchar cnt)
{
unsigned char i;
unsigned char checksum = 0;
SBUF = STX ;
while(!TI);
TI = 0;
for(i=0; i<cnt ; i++)
{
SBUF = *Ptm ;
while(!TI);
TI = 0;
++Ptm;
}
SBUF = 0x0d;
while(!TI);
TI = 0;
SBUF = 0x0a;
while(!TI);
TI = 0;
SBUF = ETX ;
while(!TI);
TI = 0;
}
// 将 PtData1:PC ASCII 码 命令帧转换为 HEX 数据 并存放到首地址PtData2
void TransData(uchar *PtData1, uchar *PtData2,uchar cnt)
{
TransAsiHex(PtData1,PtData2, cnt);
}
void test(void)
{
uchar i = 0,j=10;
uchar code str[]="ChangZhou ALED Electronic Corp.";
uchar xdata *Ptm,*Pts;
Ptm = 0x380;
Pts = str;
for(i=0; i<36; i++)
{
*Ptm = *Pts;
Ptm++;
Pts++;
}
}
void ChangCardSnr(void)
{
uchar data checksum = 0;
CardSnrNum[0] = 0x00;
CardSnrNum[1] = card_snr[3];
CardSnrNum[2] = card_snr[2];
CardSnrNum[3] = card_snr[1];
CardSnrNum[4] = card_snr[0];
checksum ^= CardSnrNum[0];
checksum ^= CardSnrNum[1];
checksum ^= CardSnrNum[2];
checksum ^= CardSnrNum[3];
checksum ^= CardSnrNum[4];
CardSnrNum[5] = checksum;
}
void SendSnrNum(void)
{
ChangCardSnr();
TransHexAsi(CardSnrNum,CardData,6);
SendSnrToPc(CardData,12);
}
void FlashLED(void)
{
uchar data FlashNum =5;
while(FlashNum--)
{
LED = !LED;
delay_10ms(5);
}
}
uchar CheckSnrNum(void)
{
uchar data SnrNumErr;
if(card_snr[3] == 0x30)
{
if(card_snr[2] == 0x30)
{
if(card_snr[1] == 0x30)
{
if(card_snr[0] == 0x30)
SnrNumErr = 1;
else
SnrNumErr = 0;
}
else
SnrNumErr = 0;
}
else
SnrNumErr = 0;
}
else
SnrNumErr = 0;
return SnrNumErr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -