Memprogram 24LC64 dengan Port Serial

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace _24LC64
{
    /// 
<summary>
    /// Pin 3 (TX)  --          -- CS
    /// pin 4 (DTR) -- SCL      -- SCK
    /// Pin 6 (DSR) -- SDA IN   -- 
    /// Pin 7 (RTS) -- SDA OUT  -- MOSI (DO)
    /// Pin 8 (CTS) --          -- MISO (DI)
    /// </summary>


    public partial class Form1 : Form
    {
        public const bool H = true, L = false;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.BaudRate = 9600;
            serialPort1.PortName = textBox1.Text;
            serialPort1.Open();

            //serialPort1.DtrEnable = true;
            //serialPort1.RtsEnable = true;

            //perintah Write
            StartBit();
            kirim(0xA0);
            bit(1); //ACK
            
            //Alamat memory (0x001)
            //0x00 
            kirim(0x00);
            bit(1); //ACK
            //0x01
            kirim(0x01);
            bit(1); //ACK

            //Data (0x33)
            //kirim(0x33);
            byte[] data = StringToByteArray(textBox2.Text);
            kirim(data[0]);
            bit(1); //ACK
            
            StopBit();


            serialPort1.Close();

        }
        void kirim(int byteData) {
            for (int i = 7; i >= 0; i--) 
            {
                int bitData = (byteData >> i & 0x01);
                bit(bitData);
            }
        }
        void StartBit()
        {
            SDA(H); SCL(H);
            Thread.Sleep(1);
            SDA(L); SCL(H);
            Thread.Sleep(1);
        }
        void StopBit()
        {
            SDA(L); SCL(H);
            Thread.Sleep(1);
            SDA(H); SCL(H);
            Thread.Sleep(1);
        }
        void bit(int val) 
        {
            SCL(L);
            if (val == 0) SDA(L);
            else SDA(H);
            SCL(H);
            Thread.Sleep(1);
            SCL(L);
            SDA(H);
            Thread.Sleep(1);
        }

        void SCL(bool status)
        {
            serialPort1.DtrEnable = status;
        }
        void SDA(bool status)
        {
            serialPort1.RtsEnable = status;
        }

        int bacaBit() {
            int bitData = 0;
            SCL(L);
            SCL(H);
            bool bit = serialPort1.DsrHolding;
            if (bit == true) bitData = 1;
            Thread.Sleep(1);
            SCL(L);
            SDA(H);
            Thread.Sleep(1);
            return bitData;
        }

        public static byte[] StringToByteArray(string hex)
        {
            return Enumerable.Range(0, hex.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                             .ToArray();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.BaudRate = 9600;
            serialPort1.PortName = textBox1.Text;
            serialPort1.Open();


            //perintah Write
            StartBit();
            kirim(0xA0);
            bit(1); //ACK

            //Alamat memory (0x001)
            //0x00 
            kirim(0x00);
            bit(1); //ACK
            //0x01
            kirim(0x01);
            bit(1); //ACK

            //perintah Read
            kirim(0xA1);
            bit(1); //ACK


            int data = 0;
            for (int i = 7; i >= 0; i--)
            {
                data = data << 1;
                data = data | bacaBit();
            }
            bit(1); //ACK

            StopBit();


            serialPort1.Close();
            byte[] hasil = new byte[1]; hasil[0] = (byte)data;
            textBox2.Text = BitConverter.ToString(hasil);
        }
    }
}