+void serial_send(uint8_t data)
+{
+ /* signal state: IDLE: ON, START: OFF, STOP: ON, DATA0: OFF, DATA1: ON */
+ /* start bit */
+ SERIAL_TXD_OFF();
+ _delay_us(WAIT_US);
+
+#ifdef SERIAL_BIT_ORDER_MSB
+ uint8_t mask = 0x80;
+#else
+ uint8_t mask = 0x01;
+#endif
+ while (mask) {
+ if (data&mask) { SERIAL_TXD_ON(); } else { SERIAL_TXD_OFF(); }
+ _delay_us(WAIT_US);
+
+#ifdef SERIAL_BIT_ORDER_MSB
+ mask >>= 1;
+#else
+ mask <<= 1;
+#endif
+ }
+
+ /* stop bit */
+ SERIAL_TXD_ON();
+ _delay_us(WAIT_US);
+}
+
+/* detect edge of start bit */