# 1 - Moveable Pixel

### Code

```python
from machine import Pin, PWM
import time
import _thread

class LED_Matrix():
    def __init__(self):
        
        # Create a list of pin numbers
        self.row_pins = [6,4,7,5,3,8,2,9]
        self.row_pins.reverse()
        self.col_pins = [10,11,12,13,18,19,20,21]
        
        # Create empty lists to contain the Pin objects
        self.rows = []
        self.cols = []
        
        # Use the list of pin numbers to create
        # Pin objects and add them to the lists
        # created above.
        for i in self.row_pins:
            self.rows.append(Pin(i, Pin.OUT))
            
        for i in self.col_pins:
            self.cols.append(Pin(i, Pin.OUT))
        
        # Create empty 8x8 array
        self.matrix = [[0]*8]*8
        
        # Create a counter for current row
        #self.cur_row = 0
        self.cur_col = 0 # !IMPORTANT! Interating over columns offers better brightness than iterating rows!
        
    def clear(self):
        self.matrix = [
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0]
            ]
        
    def next_row(self):
        # Deactivate current row
        self.cols[self.cur_col].value(0)
        
        # Increment current row
        self.cur_col = (self.cur_col + 1) % 8
        
        # Load next row's columns
        for i in range(8):
            self.rows[i].value(self.matrix[self.cur_col][i])
        
        # Activate next row
        self.cols[self.cur_col].value(1)    

            
class Sprite():
    def __init__(self):
        self.x = 0
        self.y = 0
        
    def right(self):
        self.y += 1
        if self.y >= 8:
            self.y = 7
    
    def left(self):
        self.y -= 1
        if self.y <= -1:
            self.y = 0

    def down(self):
        self.x += 1
        if self.x >= 8:
            self.x = 7
    
    def up(self):
        self.x -= 1
        if self.x <= -1:
            self.x = 0
            

def update_display():
    while True:
        global display
        display.next_row()
        time.sleep_ms(2)

def game_loop():
    # Main Loop for game, runs at 30 Hz
    global display
    while True:
        display.clear()
        
        if not up.value():
            s.up()
        if not down.value():
            s.down()
        if not left.value():
            s.left()
        if not right.value():
            s.right()
        
        # Draw the sprite on the LED matrix
        display.matrix[s.x][s.y] = 1
        
        # Do nothing for 33ms, (30Hz Frame-Rate)
        time.sleep_ms(33)


# Create LED Matrix object        
display = LED_Matrix()

# Create Button Objects
up = Pin(14, Pin.IN, Pin.PULL_UP)
down = Pin(17, Pin.IN, Pin.PULL_UP)
left = Pin(16, Pin.IN, Pin.PULL_UP)
right = Pin(1, Pin.IN, Pin.PULL_UP)

# Create Sprite Object
s = Sprite()

# Use second core to constantly run the display
_thread.start_new_thread(update_display,())

# Use main core to run game loop at 30Hz
game_loop()
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.breadstick.ca/breadstick/pico-slices/slice-3-8x8-dot-matrix/micropython-code/1-moveable-pixel.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
