📄 main.c
字号:
// 通信波特率 9600 8位数据 1位停止位 CRC16校验 (奇校验)
// Crystal: 8.0000Mhz
// Target MCU: 16f648A
#include "pic16f62xa.h"
#include "pic.h"
#include "typedefine.h"
#include "extern.h"
void ioinit(void);
char ParityBit(const char *p_data);
char ParityBitThree(const char *p_data ) ;
bit errorCheckout;
uchar tmp;uchar tmp2;
void test(void)
{
// uint result;
// receBuf[0] = 0xff;
// receBuf[1] = 0xaa;
// receBuf[2] = 0x55;
// receBuf[3] = 0xff;
// receBuf[4] = 0x6f;
// result = CRC16(receBuf,3);
// if(result == receBuf[4]+(receBuf[3]<<8))
// {
// LedShowLink = 116; // setting ok
// }
}
volatile uchar checkoutP;
// 中断程序
void interrupt isr(void) @ 0x04
{
if(T0IE & T0IF)
{
T0IF = 0; // 清Flag
TMR0 = 0x85; // re-load timer 500us every time.
TimeCnt++; // asm("incf _TimeCnt"); // 汇编3条.
timeflag = 0xff;
TimeBase.alltimes = TimeCnt; //importance.
}
if(TXIE & TXIF)
{
if(UartStruct.bits.HostStatus==2)
{
if(sendPosi<sendCount)
{
sendPosi++;
// checkoutP = ParityBit(&sendBuf[sendPosi]); //奇偶校验
TX9D = ParityBit(&sendBuf[sendPosi]);
TXREG = sendBuf[sendPosi];
}
else
{ //一镇发送完成
if(TRMT)
{
UartStruct.bits.frameSendEndTag = 1;
//------------------
TXEN = 0;
TXIE = 0;
}
}
}
}
if(RCIE & RCIF)
{
receTimeOut = FrameOverCou;//30; //通讯超时值
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
if(UartStruct.bits.HostStatus == 1)
{
tmp2 = RX9D;
receBuf[receCount] = RCREG;
if(tmp2 != ParityBitThree(&receBuf[receCount]))
errorCheckout = 1;
receCount++; //接收地址偏移寄存器加1
receCount &= 0x0f; //最多一次只能接收16个字节
}
}
return;
}//void interrupt isr(void) @ 0x04
//芯片初始化.
void sysinit(void)
{
NOP();
time0init();
ioinit();
ledinit();
Uart_ini();
NOP();
}//void sysinit(void)
//引脚初始
void ioinit(void)
{
//setup RA IOpin's currency.
CM0=1;
CM1=1;
CM2=1;
//RA0-RA3 input.
TRISA |= 0x0f;
//RB0, RB3-RB7 input.
TRISB |= 0b11111001;
}//void ioinit(void)
//调用 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 )
//调用 ParityBit(),返回添加奇偶校验位.(64us once)
char ParityBitThree(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 )
//main program.
void main(void)
{
NOP();
NOP();
NOP();
NOP();
NOP();
test();
NOP();
NOP();
sysinit();
GIE = 1; //globe interrupt enable.
// CLRWDT();
do
{
NOP();
if(timeflag) //500us置位一次.
{
MissionFlag.allbits = 0; //任务标记清零.
timeflag = 0;
time_mission();
Admini();
MissionFlag.allbits = 0;
}
CLRWDT();
NOP();
NOP(); // 添加扫描频率要求高的处理函数.
}while(1);
}//void main(void)
//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();
}
}
EEIF = 0;
GIE = 1;
}//void WriteEEPROM().
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -