📄 main.c
字号:
#include "pic16f62xa.h"
#include "pic.h"
#include "typedefine.h"
#include "extern.h"
extern void time0init(void);
char ParityBit(const char *p_data ) ;
//uchar testAddr=0xd3;
bank1 uchar RX9DBuf;
void test(void)
{
// RecFrameCheck(receBuf,receCount)
LedSLink = 10;
}
//eeprom 写入
//数组首地址指针,写入数组长,写入的地址.
void WriteEEPROM(uchar *p_eedata,uchar length,uchar addr)
{
uchar var_ii;
GIE = 0;
for(var_ii=0;var_ii<length;var_ii++)
{
EEDATA = *p_eedata++;
EEADR = addr++;
#asm
NOP
BSF _STATUS,5 //RP0
BSF _EECON1,2 //WREN
BCF _INTCON,7 //GIE
BTFSC _INTCON,7
GOTO $-2
MOVLW 0X55
MOVWF _EECON2
MOVLW 0XAA
MOVWF _EECON2
BSF _EECON1,1 //WR
#endasm
while(WR!=0)
{
NOP();
}
}
GIE = 1;
}
void interrupt isr(void) @ 0x04
{
uchar tmp;
if(T0IE & T0IF)
{
T0IF = 0; // 清Flag
TMR0 = 0x84; // 1ms every time.
timeBase.bits.bt1ms = 1;
}
/*
if(TXIE & TXIF)
{
if(UartSlaveStruct.bits.SendEnd)
{
UartSlaveDelayStruct.SendLastStatus.bits.LastByteCountTag = 1;
UartSlaveStruct.bits.SendEnd = 0;
goto Tloop;
}
TXREG = GetDataBus[sendPosi++];
if(SendFrameLength == sendPosi) // TxCnt考虑
{
sendPosi = 0;
UartSlaveStruct.bits.SendEnd = 1;
}
NOP();
}
*/
if(TXIE&TXIF)
{
#ifdef TEST_TX
RA1 = !RA1;
#endif
#ifdef TEST_RB4
RB4 = !RB4;
#endif
if(sendPosi<sendCount)
{
sendPosi++;
// TX9D = ParityBit(sendBuf[sendPosi]);
TXREG = sendBuf[sendPosi];
}
else
{
// receEnable(); //485芯片
if(TRMT){
receCount = 0;
checkoutError = 0;
//-----------------------
TXIE = 0; //在一组数据发送完成后关闭
//TXEN = 0;
sendCount = 0;
//--------------------------
}
}
}
// if(RCIE&RCIF)
// {
// if( UartSlaveStruct.bits.SlaveStatus==0 )
// {
// UartSlaveStruct.bits.SlaveStatus = 1;
// UartSlaveDelayStruct.ReceiveCountStatus.bits.ReceiveCountTag = 1;
// }
// UartSlaveDelayStruct.RecevieCou = 0;
// if(FERR | OERR)
// {
// FERR = 0;
// OERR = 0;
// UartSlaveStruct.bits.GetByteErr = 1;
// }
// RCBuf = RCREG ; // 取数据.
// if(UartSlaveStruct.bits.GetByteErr)
// {
// UartSlaveStruct.bits.GetByteErr = 0;
// }
// else
// {
// receBuf[GetCnt++] = RCBuf;
// }
// }
if(RCIE&RCIF)
{
#ifdef TEST_RB4
RB4 = !RB4;
#endif
receTimeOut = 10; //通讯超时值
if(FERR==1)
{
#ifdef TEST_RX
RA1 = !RA1;
#endif
// receCount = 0;
CREN = 0;
FERR = 0;
CREN = 1;
tmp = RCREG;
//-------------------------------------------
}
else if(OERR==1)
{
#ifdef TEST_RX
RA1 = !RA1;
#endif
// receCount = 0;
//--------------test error code--------------
// EEDATA = 0xa5;
//-------------------------------------------
CREN = 0;
OERR = 0;
CREN = 1;
tmp = RCREG;
}
else
{
// receTimeOut = 10;//FrameOverCou; // 通讯超时值 4ms
RX9DBuf = RX9D;
receBuf[receCount] = RCREG;
if(RX9DBuf != ParityBit(&receBuf[receCount]) )
checkoutError = 1;
receCount++; // 接收地址偏移寄存器加1.
receCount &= 0x0f;
}
} //if(RCIE&RCIF);
NOP();
return;
} // void interrupt isr(void) @ 0x04
//----------------
void main(void)
{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
test();
sysinit();
GIE = 1;
while(1)
{
NOP();
time_mission();
ReceiveFrameDisFun();
NOP();
LedDrive();
}
}
void IOinit(void)
{
CM0=1;
CM1=1;
CM2=1;
TRISA &= ~0b00000010;
TRISA |= 0b00000111;
RA1 = 0;
TRISB4 = 0;
RB4 = 1;
}
void sysinit(void)
{
NOP();
IOinit();
time0init();
Uart_init();
NOP();
}
//调用 ParityBit(),返回添加奇偶校验位.(64us once)
char ParityBit(const char *p_data )
{
char tempchar=0, tempcount ,temp_a=0,result=0;
tempchar = *p_data;
for(tempcount = 8; tempcount > 0; tempcount--)
{
temp_a = tempchar & 0x01;
if(1 == temp_a)
{
result += 1;
}
tempchar >>= 1;
}
return(result&0x01);
}//char ParityBit(const char *p_data )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -