diff --git a/nanosoc_board/micropython/nanosoc_demo1.py b/nanosoc_board/micropython/nanosoc_demo1.py
new file mode 100644
index 0000000000000000000000000000000000000000..b8a5045f0991f45506aaf6e7b1213158857e96c1
--- /dev/null
+++ b/nanosoc_board/micropython/nanosoc_demo1.py
@@ -0,0 +1,193 @@
+from machine import Pin, I2C
+import machine
+from micropython import const
+import time
+import rp2
+from rp2 import PIO
+# ----------- #
+# ft1248x1_sm #
+# ----------- #
+
+ft1248x1_sm_SSN_PIN = 24
+ft1248x1_sm_SCLK_PIN = 25
+ft1248x1_sm_MIOSIO_PIN = 22
+ft1248x1_sm_MISO_PIN = 23
+
+@rp2.asm_pio( sideset_init=(rp2.PIO.OUT_LOW, rp2.PIO.OUT_LOW), in_shiftdir=PIO.SHIFT_RIGHT, out_shiftdir=PIO.SHIFT_RIGHT, autopush=False, autopull=False, push_thresh=32, pull_thresh=32, fifo_join=PIO.JOIN_NONE)
+def ft1248x1_sm():
+    wrap_target()
+    set(pindirs, 3)         .side(3)      # 0
+    label("1")
+    mov(y, status)          .side(2)      # 1
+    jmp(not_y, "5")                       # 2
+    jmp(pin, "1")                         # 3
+    jmp("6")                              # 4
+    label("5")
+    wait(0, pin, 2)       .side(0)      # 5
+    label("6")
+    set(pindirs, 2)         .side(0)      # 6
+    set(y, 6)                             # 7
+    label("8")
+    wait(1, pin, 3)                     # 8
+    wait(0, pin, 3)                     # 9
+    in_(pins, 1)                          # 10
+    jmp(y_dec, "8")                       # 11
+    mov(osr, reverse(isr))                # 12
+    out(x, 1)                             # 13
+    wait(1, pin, 3)                     # 14
+    jmp(not_x, "20")                      # 15
+    pull(noblock)                         # 16
+    mov(isr, null)                        # 17
+    set(pindirs, 3)         .side(0)      # 18
+    jmp("21")                             # 19
+    label("20")
+    mov(osr, null)                        # 20
+    label("21")
+    wait(0, pin, 3)                     # 21
+    set(y, 7)                             # 22
+    label("23")
+    out(pins, 1)                          # 23
+    wait(1, pin, 3)                     # 24
+    wait(0, pin, 3)                     # 25
+    in_(pins, 1)                          # 26
+    jmp(y_dec, "23")                      # 27
+    set(pindirs, 3)         .side(3)      # 28
+    jmp(x_dec, "31")                      # 29
+    push(block)                           # 30
+    label("31")
+    wait(1, pin, 2)                     # 31
+    wrap()
+
+
+
+## @rp2.asm_pio(
+#     in_base = ft1248x1_sm_MIOSIO_PIN,
+#     in_shiftdir = PIO.SHIFT_LEFT,
+#     autopush=True, push_thresh=16,
+#     out_base = ft1248x1_sm_MIOSIO_PIN,
+#     set_base = ft1248x1_sm_MIOSIO_PIN,
+#     jmp_pin = ft1248x1_sm_SSN_PIN,
+#     out_shiftdir=0,
+#     autopull=False, pull_thresh=8,
+#     sideset_base = ft1248x1_sm_MIOSIO_PIN,
+#     sideset_init=(rp2.PIO.OUT_LOW, rp2.PIO.OUT_HIGH), out_init=rp2.PIO.OUT_LOW)
+
+#sm0 = rp2.StateMachine(0, ft1248x1_sm, freq=125000,set_base=Pin(ft1248x1_sm_MIOSIO_PIN))
+
+class PIOSFT1248:
+
+    def __init__(self):
+        Pin(ft1248x1_sm_SCLK_PIN, Pin.IN)
+        Pin(ft1248x1_sm_SSN_PIN, Pin.IN)
+        Pin(ft1248x1_sm_MISO_PIN, Pin.OUT)
+        machine.mem32[0x502000CC] = 0x1801F000
+        machine.mem32[0x502000D0] = 0x3FFC0000
+        machine.mem32[0x502000DC] = 0x681B5AD6
+        pio = rp2.PIO(0)
+        pio.state_machine(0)
+        pio.add_program(ft1248x1_sm)
+        machine.mem32[0x502000CC] = 0x1801F000
+        machine.mem32[0x502000D0] = 0x3FFC0000
+        machine.mem32[0x502000DC] = 0x681B5AD6
+        machine.mem32[0x50200000] = 0x1
+    def write_blocking(self,wdata):
+        for b in wdata:
+            while((machine.mem8[0x50200004])&0x10000 != 0):
+                pass
+            machine.mem8[0x50200010]=ord(b)
+
+    def read_blocking(self,n):
+        data = ""
+        for i in range(n):
+            while((machine.mem8[0x5020000C])&const(0xF0) == 0):
+                pass
+            data+=chr((machine.mem8[0x50200023]))
+        return data
+    
+    def enter_adp_mode(self):
+        while((machine.mem8[0x50200004])&0x10000 != 0):
+                pass
+        machine.mem8[0x50200010]=0x1b
+    
+    def download_file(self, file, addr):
+        pass
+
+ #   def write_read_blocking(self,wdata):
+ #       rdata = []
+ #       for b in wdata:
+ #           self._sm.put(b)
+ #           rdata.append(self._sm.get() & 0xff)
+ #       return rdata
+
+
+#MCP23009 GPIO expander device controls reset and clock generator
+MCP23009_ADDR = 0x20
+IODIR_ADDR     = 0
+IPOL_ADDR      = 1
+GPINTEN_ADDR   = 2
+DEFVAL_ADDR    = 3
+INTCON_ADDR    = 4
+IOCON_ADDR     = 5
+GPPU_ADDR      = 6
+INTF_ADDR      = 7
+INTCAP_ADDR    = 8
+GPIO_ADDR      = 9
+OLAT_ADDR      = 10
+
+class I2C_device_bus:
+    def __init__(self):
+        self.i2c=I2C(1, scl=Pin(11,pull=Pin.PULL_UP), sda=Pin(10,pull=Pin.PULL_UP))
+    def scan(self):
+        self.devices = self.i2c.scan()
+        return self.devices
+
+class MCP23009:
+    def init_MCP23009(self,I2C):
+        I2C.writeto_mem(MCP23009_ADDR, IODIR_ADDR, b'\x00')
+        I2C.writeto_mem(MCP23009_ADDR, OLAT_ADDR, b'\x1F')
+        I2C.writeto_mem(MCP23009_ADDR, GPPU_ADDR, b'\x1F')
+        time.sleep_ms(10)
+        I2C.writeto_mem(MCP23009_ADDR, GPPU_ADDR, b'\x3F')
+        I2C.writeto_mem(MCP23009_ADDR, OLAT_ADDR, b'\x3F')
+        
+class nanosoc_system:
+    def __init__(self):
+        self.I2C = I2C_device_bus()
+        self.MCP = MCP23009()
+    def init_nanosoc(self):
+        self.MCP.init_MCP23009(self.I2C.i2c)
+print("Starting")
+machine.freq(125000000)
+FT1248 = PIOSFT1248()
+
+nanosoc = nanosoc_system()
+devices = nanosoc.I2C.scan()
+
+
+if len(devices)==0:
+    print("No i2c device!")
+else:
+    print("I2C devices found: ",len(devices))
+    
+    for device in devices:
+        print("I2C hexadecimal address: ", hex(device))
+
+
+nanosoc.init_nanosoc()
+while ((machine.mem32[0x50200004])&const(0x100) == 0):
+    data = FT1248.read_blocking(2)
+    print((data), end='')
+print("Enter ADP")
+FT1248.enter_adp_mode()
+while ((machine.mem32[0x50200004])&const(0x100) == 0):
+    data = FT1248.read_blocking(2)
+    print((data), end='')
+print("Write address")
+FT1248.write_blocking("A 0x20000000\n")
+
+time.sleep_ms(10)
+while True:
+    if ((machine.mem32[0x5020000C])&const(0xF0) != 0):
+        data = FT1248.read_blocking(10)
+        #s = ''.join(chr(x) for x in data)
+        print((data), end='')
\ No newline at end of file