Код: Выделить всё
// Driver for COM_PORT_PIC16F84A
// CopyRight (C) Dima Lerich, Vladivostok
#define sDelayTimer 169 // 9,618 Hz for 4 MHz
#define sTimer2 210 // 15000 Hz for 4 MHz
// PORT A
#define TxData PORTA.F1
// PORT B
#define RxData PORTB.F7
#define GIE INTCON.GIE
#define T0IF INTCON.T0IF
#define T0IE INTCON.T0IE
#define RBIE INTCON.RBIE
#define RBIF INTCON.RBIF
#define T0SE OPTION_REG.T0SE
#define T0CS OPTION_REG.T0CS
#define PSA OPTION_REG.PSA
unsigned char Tx_BIT_Enabled=0, Rx_BIT_Enabled=0, f_BIT_Done=0; // разрядные перменные
unsigned char Rx_BIT_Bit, Rx_BIT_BitOld; // для порта В_В
unsigned char TxByte, RxByte; // байтовые переменные
char numRxBit, numTxBit;
char Port_B;
void interrupt (void)
{
GIE = 0; // разрешение прерываний
if(T0IF) // если флаг переполнения таймера установлен
{
TMR0 = sDelayTimer; // устанавливаем в таймер значение задержки
T0IF = 0; // флаг сбрасываем
if(Tx_BIT_Enabled) // если передача разрешена
{
if(numTxBit==0) // номер бита 0
{
numTxBit=1; // номер становится первым
TxData = 0; // ставим 0 на линию передачи портА = 0
}
else if(numTxBit>8) // иначе если номер бита более 8
{
TxData = 1; // ставим 1 на линию передачи на портА = 1
numTxBit=0; // номер бита = 0 ОБНУЛЯЕМ
Tx_BIT_Enabled=0; // запрещение передачи
}
else // иначе
{
if(TxByte&1) // если Данные байта и 1
TxData = 1; // данные передачи выдаются на портА = 1
else // иначе
TxData = 0; // данные передачи на портА = 0
TxByte >>= 1; // сдвинем на 1 вправо
numTxBit++; // увеличим номер бита на 1
}
}
if(Rx_BIT_Enabled) // если разрешен прием
{
if(numRxBit>8) // номер бита больше 8
{
Rx_BIT_Enabled=0; // запрещен прием
Port_B = PORTB; // в переменную заносим значение портаВ
RBIF=0; // запретим прерыванияч по портуВ
f_BIT_Done=1; // закончили прием
}
else if(numRxBit<8) // если номер бита менее 8
{
RxByte>>=1; // сдвигаем число на 1 разряд вправо
if(RxData==1) RxByte+=128; // если = 1 то прибавим 128
}
numRxBit++; // номер бита увеличим на единицу
}
}
if(RBIF) // если взведен флаг прерывания по порту В
{
RBIF=0; // сбросим флаг прерывания на порту В
Port_B = PORTB; // снимем данные с порта В
if(RxData) // если разряд 7 порта В в состоянии 1 тогда
Rx_BIT_Bit=1; //
else
Rx_BIT_Bit=0; //
if(Rx_BIT_Enabled==0 && numRxBit==0)
{
if(Rx_BIT_Bit==0 && Rx_BIT_BitOld)
{
f_BIT_Done =0; // завершения приема нет
RxByte =0; //
numRxBit=0; //
Rx_BIT_Enabled = 1; // поступает разрешение на прием байта с порта
RBIE = 0; // запрещаются прерывания с порта В
T0IF = 0; // флаг переполнения сбрасывается
TMR0 = sTimer2; // устанавливается новое значение таймера
}
}
Rx_BIT_BitOld = Rx_BIT_Bit;
}
if(Tx_BIT_Enabled==0)
{
TxData = 1;
}
GIE = 1; // разрешим все прерывания // MSG = 0;
}
InitPic()
{
OPTION_REG = 0;
f_BIT_Done = 0;
TxData = 1;
numTxBit = 0;
numRxBit = 0;
TMR0 = sDelayTimer;
Tx_BIT_Enabled=0;
Rx_BIT_Enabled=0;
T0SE = 1;
T0CS = 0;
PSA = 1;
RBIE = 0;
TRISB = 128; // = 128 Input 10000000 =13 input
TRISA = 1; // = 1 Input 00000001 =18 output
T0IE = 1;
GIE = 1;
}
void InitRx()
{
RxByte=0;
f_BIT_Done=0;
numRxBit=0;
Rx_BIT_Enabled=0;
Port_B=PORTB&128;
RBIE=1;
}
void SendRs(unsigned char x)
{
while(Tx_BIT_Enabled);
numTxBit=0;
TxByte=x;
Tx_BIT_Enabled=1; // передача разрешена!
}
char Command()
{
if (f_BIT_Done==0) return 0; // если ноль, то уходим
RBIE=0;
SendRs (RxByte);
InitRx();
return 1;
}
main(void)
{
InitPic();
InitRx ();
while(1) { Command(); }
}
Компилируйте например в МИКРОС и вперед. Я переписал с хайтека на микроС. Для особо неверующих привожу хексы:
:10000000D328FF3FFF3FFF3FCF00030E8301970040
:10001000040896000A0898008A0141089B004008DD
:100020009A008B130B1D5428A93081000B110C086A
:10003000031935280D08003A031D222801308D00D0
:10004000851035280D08083C03182A2885148D01D1
:100050008C01352801300E05C000031931288514A4
:10006000322885108E0C8E138D0A0F080319542820
:100070001008083C031843288F01060891000B1054
:100080000130920053280830100203185328930CB3
:1000900093130030861B0130C1004108013A031D53
:1000A000532880309307900A0B1C79280B10060800
:1000B0009100861F5E28013094005F2894010F088C
:1000C000003A031D77281008003A031D772814080A
:1000D000003A031D77281508031977289201930128
:1000E000900101308F008B110B11D2308100140868
:1000F00095000C08003A031D7E2885148B171B08F9
:10010000C1001A08C00018088A0016088400170EDB
:100110008300CF0E4F0E0900031383120C08031D3A
:100120008C288D0119088E0001308C000800031303
:1001300083129301920190018F0180300605910096
:100140008B15080003138316810192018312851415
:100150008D019001A93081008C018F018316011659
:10016000811281158B1180308600013085008B163D
:100170008B170800031383121208003A031DC228CC
:10018000C00108008B11130899008C2097200130C2
:10019000C00008000030031383128C0000308F0071
:1001A000003092000800CA20A2209720BA20D6284A
:1001B000D828FF3FFF3FFF3FFF3FFF3FFF3FFF3F8D
:00000001FF
А теперь плиз все кто выражал сомнения и прочее недовольство, жду от Вас объяснений Ваших действий. С уважением, Дима Лерич.