```

include

include

include

define output(directions,pin) (directions |= pin) // set port direction for output

define set(port,pin) (port |= pin) // set port pin

define clear(port,pin) (port &= (~pin)) // clear port pin

define pin_test(pins,pin) (pins & pin) // test for port pin

define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set

define bit_delay_time 8.5 // bit delay for 115200 with overhead

define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay

define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay

define char_delay() _delay_ms(10) // char delay

define serial_port PORTA

define serial_direction DDRA

define serial_pins PINA

define serial_pin_in (1 << PA0)

define serial_pin_out (1 << PA1)

define max_buffer 25

void get_char(volatile unsigned char pins, unsigned char pin, char rxbyte) {
//
// read character into rxbyte on pins pin
// assumes line driver (inverts bits)
//
rxbyte = 0;
while (pin_test(
pins,pin))
//
// wait for start bit
//
;
//
// delay to middle of first data bit
//
half_bit_delay();
bit_delay();
//
// unrolled loop to read data bits
//
if pin_test(pins,pin)
rxbyte |= (1 << 0);
else
rxbyte |= (0 << 0);
bit_delay();
if pin_test(
pins,pin)
rxbyte |= (1 << 1);
else
rxbyte |= (0 << 1);
bit_delay();
if pin_test(pins,pin)
rxbyte |= (1 << 2);
else
rxbyte |= (0 << 2);
bit_delay();
if pin_test(
pins,pin)
rxbyte |= (1 << 3);
else
rxbyte |= (0 << 3);
bit_delay();
if pin_test(pins,pin)
rxbyte |= (1 << 4);
else
rxbyte |= (0 << 4);
bit_delay();
if pin_test(
pins,pin)
rxbyte |= (1 << 5);
else
rxbyte |= (0 << 5);
bit_delay();
if pin_test(pins,pin)
rxbyte |= (1 << 6);
else
rxbyte |= (0 << 6);
bit_delay();
if pin_test(
pins,pin)
rxbyte |= (1 << 7);
else
rxbyte |= (0 << 7);
//
// wait for stop bit
//
bit_delay();
half_bit_delay();
}
```