diff --git a/examples/conwaylife.py b/examples/conwaylife.py
index 89ef94c8c6593131d4efdfde6f52c24947ffebdd..f99796175f5c0714f4b9e04fbed9ff92ae23e0ba 100644
--- a/examples/conwaylife.py
+++ b/examples/conwaylife.py
@@ -1,7 +1,9 @@
 #import essential libraries
-import lcd
 import pyb
 
+lcd = pyb.LCD('x')
+lcd.light(1)
+
 # do 1 iteration of Conway's Game of Life
 def conway_step():
     for x in range(128):        # loop over x coordinates
@@ -21,26 +23,24 @@ def conway_step():
 
             # apply the rules of life
             if self and not (2 <= num_neighbours <= 3):
-                lcd.reset(x, y) # not enough, or too many neighbours: cell dies
+                lcd.pixel(x, y, 0) # not enough, or too many neighbours: cell dies
             elif not self and num_neighbours == 3:
-                lcd.set(x, y)   # exactly 3 neigbours around an empty cell: cell is born
+                lcd.pixel(x, y, 1)   # exactly 3 neigbours around an empty cell: cell is born
 
 # randomise the start
 def conway_rand():
-    lcd.clear()                 # clear the LCD
+    lcd.fill(0)                 # clear the LCD
     for x in range(128):        # loop over x coordinates
         for y in range(32):     # loop over y coordinates
-            if pyb.rand() & 1:  # get a 1-bit random number
-                lcd.set(x, y)   # set the pixel randomly
+            lcd.pixel(x, y, pyb.rng() & 1)   # set the pixel randomly
 
 # loop for a certain number of frames, doing iterations of Conway's Game of Life
 def conway_go(num_frames):
     for i in range(num_frames):
         conway_step()           # do 1 iteration
         lcd.show()              # update the LCD
-        pyb.delay(300)
+        pyb.delay(50)
 
-# PC testing
-lcd = lcd.LCD(128, 32)
+# testing
 conway_rand()
-conway_go(1000)
+conway_go(100)
diff --git a/examples/lcd.py b/examples/lcd.py
deleted file mode 100644
index 3303337bfb0e1ddb14719bf2b0c98d369ea07b17..0000000000000000000000000000000000000000
--- a/examples/lcd.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# LCD testing object for PC
-# uses double buffering
-class LCD:
-    def __init__(self, width, height):
-        self.width = width
-        self.height = height
-        self.buf1 = [[0 for x in range(self.width)] for y in range(self.height)]
-        self.buf2 = [[0 for x in range(self.width)] for y in range(self.height)]
-
-    def clear(self):
-        for y in range(self.height):
-            for x in range(self.width):
-                self.buf1[y][x] = self.buf2[y][x] = 0
-
-    def show(self):
-        print('') # blank line to separate frames
-        for y in range(self.height):
-            for x in range(self.width):
-                self.buf1[y][x] = self.buf2[y][x]
-        for y in range(self.height):
-            row = ''.join(['*' if self.buf1[y][x] else ' ' for x in range(self.width)])
-            print(row)
-
-    def get(self, x, y):
-        if 0 <= x < self.width and 0 <= y < self.height:
-            return self.buf1[y][x]
-        else:
-            return 0
-
-    def reset(self, x, y):
-        if 0 <= x < self.width and 0 <= y < self.height:
-            self.buf2[y][x] = 0
-
-    def set(self, x, y):
-        if 0 <= x < self.width and 0 <= y < self.height:
-            self.buf2[y][x] = 1
diff --git a/examples/pyb.py b/examples/pyb.py
index 65fed6647ef8776cba76b3a40589d27258b693d3..b303777e5a8e14999a31087cf3fa1d952f3ba4ef 100644
--- a/examples/pyb.py
+++ b/examples/pyb.py
@@ -6,8 +6,44 @@ def delay(n):
     pass
 
 rand_seed = 1
-def rand():
+def rng():
     global rand_seed
     # for these choice of numbers, see P L'Ecuyer, "Tables of linear congruential generators of different sizes and good lattice structure"
     rand_seed = (rand_seed * 653276) % 8388593
     return rand_seed
+
+# LCD testing object for PC
+# uses double buffering
+class LCD:
+    def __init__(self, port):
+        self.width = 128
+        self.height = 32
+        self.buf1 = [[0 for x in range(self.width)] for y in range(self.height)]
+        self.buf2 = [[0 for x in range(self.width)] for y in range(self.height)]
+
+    def light(self, value):
+        pass
+
+    def fill(self, value):
+        for y in range(self.height):
+            for x in range(self.width):
+                self.buf1[y][x] = self.buf2[y][x] = value
+
+    def show(self):
+        print('') # blank line to separate frames
+        for y in range(self.height):
+            for x in range(self.width):
+                self.buf1[y][x] = self.buf2[y][x]
+        for y in range(self.height):
+            row = ''.join(['*' if self.buf1[y][x] else ' ' for x in range(self.width)])
+            print(row)
+
+    def get(self, x, y):
+        if 0 <= x < self.width and 0 <= y < self.height:
+            return self.buf1[y][x]
+        else:
+            return 0
+
+    def pixel(self, x, y, value):
+        if 0 <= x < self.width and 0 <= y < self.height:
+            self.buf2[y][x] = value