⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 使用Microchip公司16F648实现4*6键盘程序. 在PICC环境下编译通过,包含RS485通讯. 代码完整,可供参考.
💻 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 + -