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

📄 host.c

📁 模拟串口通讯
💻 C
字号:


#include <pic.h>
#include "lcd_595.h"
#include "delay.h"


#define RC_DIR         TRISB0
#define TX_DIR		   TRISD6	
#define RC_DATA	       RB0
#define TX_DATA		   RD6
#define TIMERCONST	   0x12
#define STARTE		   RB6
#define	STOP		   RB7


unsigned char RC_BUF;
unsigned char TX_BUF;
unsigned char TX_FLAG;
unsigned char RC_FLAG;
unsigned char RC_REG;
unsigned char INT_FLAG;
unsigned char Data;
unsigned char BitCounter;
unsigned char TmrCounter;
unsigned char data1[] = {"Tx:"};
unsigned char data2[] = {"Rc:"};
bit PARITY;
bit bActiveFlag;
bit bBusEnable;
unsigned int count1;
unsigned int count2;
unsigned int count3;

	


	void Delay(void)
{
	unsigned char i;
	for(i=8;--i;)
	{
		DelayMs(250);
	}
}

	
	
void set_port(void)
{
	ADCON1 = 0x06;
	PSPMODE = 0;
}



bit EvenParity(unsigned char data) 
{ 
	#asm 
	swapf ?a_EvenParity+0,w 
	xorwf ?a_EvenParity+0,f 
	rrf ?a_EvenParity+0,w 
	xorwf ?a_EvenParity+0,f 
	btfsc ?a_EvenParity+0,2 
	incf ?a_EvenParity+0,f 
	#endasm 
	if (data&0x01) 
		return (1); 
	else 
		return (0); 
} 


void interrupt ISQ(void)
{
		if(INTE && INTF)
		{
			INTE = 0;
			T0IF = 0;
			TmrCounter = 3;
			TMR0 = TIMERCONST;
		//	RC2 = 1;
			INT_FLAG = 1;                       //开始接收数据标志位
			RC_BUF = 0;
			RC7 = !RC7;
		}
		if(T0IF)
		{
			T0IF = 0;
			--TmrCounter;
			if(TmrCounter==0)
			{
				if(INT_FLAG)
				{
					--BitCounter;
					if(BitCounter==0)
					{RC7 = !RC7;
						if(RC_DATA != 0)
						{
							RC_REG = RC_BUF;
							RC_FLAG = 1;
						}
						BitCounter = 10;
						INT_FLAG = 0;
						INTF = 0;
						INTE = 1;
						RC7 = 1;
					//	RC2 = 0;
					}
					else
					{
						if(BitCounter==1)
						{	PARITY = RC_DATA;  
											}
						else
						{	RC_BUF |= ((RC_DATA & 0x01) << (9-BitCounter));}
							RC7 = !RC7;
					}
				}		
				TX_FLAG = 1;                  //一位数据已经传完了
				TmrCounter = 2;               //
			}
			TMR0 = TIMERCONST;
		}	
}




void SingleBusTx(unsigned char data)
{
	TX_BUF = data;
	INTE = 0;                                       //传送数据的时候,外部中断R0/INT关闭,不接收数据
	TX_DATA = 0;                                    //发送起始位0
	TX_FLAG = 0;                                    //发送标志位 

	TmrCounter = 2;
	TMR0 = TIMERCONST;
	while(!TX_FLAG);
	TX_FLAG = 0;
	for(BitCounter=10;--BitCounter;)
	{
		if(BitCounter==1)
			TX_DATA = EvenParity(data);
		else
			TX_DATA = TX_BUF & 0x01;		
		TmrCounter = 2;
		TMR0 = TIMERCONST;
		while(!TX_FLAG);
		TX_FLAG = 0;
		TX_BUF >>= 1;
	}
	
	TX_DATA = 1;                                    
	BitCounter = 10;                                  //发送结束位
	INTE = 1;                                         //一个字节发送完后,重新开外部中断RB0/INT,允许接收数据
}








	
void main(void)
{   int i;
	GIE = 1;
	T0IE = 1;
	INTE = 1;
	OPTION = 0x00;
	Data = 0;
	BitCounter = 10;
	TmrCounter = 2;
	TRISC6 = 0;
	TRISC2 = 0;
	TRISC7 = 0;
	TRISB6 = 1;		//	按钮用RB高二位
	TRISB7 = 1;
 	RC7 = 1;
	RC_DIR = 1;
	TX_DIR = 0;
	RC2 = 1;
	TX_DATA = 1;
	RC_DATA = 1;
	count1 = 1;
	count2 = 0;
	set_port();
	lcd_initial();
	lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putstr(data1);
	lcd_gotoxy(0,1);
	lcd_putstr(data2);
	
    while(1)
	{
		if(RC_FLAG)
		{
			RC_FLAG = 0 ;
			if(PARITY==EvenParity(RC_REG))
			{
				lcd_gotoxy(3,1);
				lcd_disphex(RC_REG);
			//	lcd_gotoxy(6,1);
			//	lcd_disphex(PARITY);
			//	lcd_gotoxy(9,1);
			//	lcd_disphex(EvenParity(RC_REG));
				Data = RC_REG+1;
			    
				SingleBusTx(Data);
				lcd_gotoxy(3,0);
				lcd_disphex(Data);
			}
		}

	}
}	


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -