📄 host.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 + -