Hallo Forengemeinde,
ich muss euch mal wieder um Hilfe bitten.
Inzwischen bin ich auch langsam weiter gekommen und habe ein externes Projekt umgesetzt. Das funktioniert einwandfrei, auch wenn ich am Anfang einige Probleme hatte, die jedoch gelöst werden konnten.
Nun möchte ich dieses Display auch an meiner Neuerwerbung einem RasPi Pico verwenden. Dazu habe ich versucht den Ausgangscode zu verwenden.
################################################################################
#
# glcd_module.py
#
# Defines a Phyton class for the Smart I2C Graphics LCD
#
# For details, see http://laagewitt.de/nano-scope-oszilloskop-mit-arduino-und-lcd-display/
#
# Stephan Laage-Witt, 26-Dec-2017
#
################################################################################
import smbus
class glcd:
def __init__(self, i2caddress):
self.i2caddress = i2caddress
self.bus = smbus.SMBus(1)
self.cmd_glcd_on = 1
self.cmd_glcd_off = 2
self.cmd_set_light = 3
self.cmd_set_dim_on = 4
self.cmd_set_dim_off = 5
self.cmd_set_i2c = 6
self.cmd_verbose_on = 7
self.comd_verbose_off = 8
self.cmd_set_auto_scroll_on = 9
self.cmd_set_auto_scroll_off = 10
self.cmd_enter_sleep_mode = 11
self.cmd_clear_screen = 15
self.cmd_draw_line = 17
self.cmd_draw_dotted_ver_line = 19
self.cmd_draw_dotted_hor_line = 20
self.cmd_draw_function = 21
self.cmd_draw_scatter = 22
self.cmd_draw_rectangle = 23
self.cmd_draw_filled_rectangle = 24
self.cmd_draw_circle = 25
self.cmd_draw_filled_circle = 26
self.cmd_draw_char = 32
self.cmd_draw_str = 33
self.cmd_draw_udec = 35
self.cmd_draw_sdec = 36
self.cmd_draw_center_str = 34
self.cmd_set_cursor = 50
self.cmd_set_font = 51
self.cmd_scroll_up = 52
self.cmd_get_str_width = 60
self.cmd_get_cursor = 61
self.cmd_get_font = 62
self.cmd_get_max_xy = 63
self.cmd_get_font_height = 65
def description(self):
return('Graphic LC Display with KS0108')
def set_i2c(self, new_i2c_address):
self.bus.write_word_data(self.i2caddress, self.cmd_set_i2c, new_i2c_address)
def set_glcd_on(self):
self.bus.write_byte(self.i2caddress, self.cmd_glcd_on)
def set_glcd_off(self):
self.bus.write_byte(self.i2caddress, self.cmd_glcd_off)
def set_light(self, value):
self.bus.write_word_data(self.i2caddress, self.cmd_set_light, value)
def set_dim_on(self):
self.bus.write_byte(self.i2caddress, self.cmd_set_dim_on)
def set_dim_off(self):
self.bus.write_byte(self.i2caddress, self.cmd_set_dim_off)
def set_auto_scroll(self, onoff):
if (onoff > 0):
self.bus.write_byte(self.i2caddress, self.cmd_set_auto_scroll_on)
else:
self.bus.write_byte(self.i2caddress, self.cmd_set_auto_scroll_off)
def enter_sleep_mode(self):
self.bus.write_byte(self.i2caddress, self.cmd_enter_sleep_mode)
def draw_line(self, x_start, y_start, x_end, y_end, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_line,[x_start, y_start, x_end, y_end, mode])
def draw_dotted_ver_line(self, x_pos, y_start, y_end, spacing, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_dotted_ver_line,[x_pos, y_start, y_end, spacing, mode])
def draw_dotted_hor_line(self, y_pos, x_start, x_end, spacing, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_dotted_hor_line,[y_pos, x_start, x_end, spacing, mode])
def clear_screen(self):
self.bus.write_word_data(self.i2caddress, self.cmd_clear_screen, 0)
def draw_circle(self, x_org, y_org, radius, sector, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_circle, [x_org, y_org, radius, sector, mode])
def draw_filled_circle(self, x_org, y_org, radius, sector, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_filled_circle, [x_org, y_org, radius, sector, mode])
def verbose(self, flag):
if flag > 0:
self.bus.write_byte(self.i2caddress, self.cmd_verbose_on)
else:
self.bus.write_byte(self.i2caddress, self.cmd_verbose_off)
def draw_rectangle(self, x_start, y_start, x_end, y_end, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_rectangle, [x_start, y_start, x_end, y_end, mode])
def draw_filled_rectangle(self, x_start, y_start, x_end, y_end, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_filled_rectangle, [x_start, y_start, x_end, y_end, mode])
def draw_circle(self, x_org, y_org, radius, sector, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_circle, [x_org, y_org, radius, sector, mode])
def draw_filled_circle(self, x_org, y_org, radius, sector, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_filled_circle, [x_org, y_org, radius, sector, mode])
def draw_pixel(self, x_start, y_start, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_pixel, [x_start, y_start, mode])
def draw_char(self, my_char):
self.bus.write_word_data(self.i2caddress, self.cmd_draw_char, ord(my_char))
def draw_str(self, my_str):
self.bus.write_byte(self.i2caddress, self.cmd_draw_str)
for c in my_str:
self.bus.write_byte(self.i2caddress, ord(c))
self.bus.write_byte(self.i2caddress, 0)
def draw_center_str(self, my_str): # maximum string length is 32 characters
self.bus.write_byte(self.i2caddress, self.cmd_draw_center_str)
for c in my_str:
self.bus.write_byte(self.i2caddress, ord(c))
self.bus.write_byte(self.i2caddress, 0)
def set_cursor(self, x, y):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_set_cursor, [x, y])
def set_font(self, font_number):
self.bus.write_word_data(self.i2caddress, self.cmd_set_font, font_number)
def scroll_up(self, delta_pages):
self.bus.write_word_data(self.i2caddress, self.cmd_scroll_up, delta_pages)
def draw_function(self, n, x_pos, mode, func_array):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_function, [n, x_pos, mode])
for i in range(0,n):
self.bus.write_byte(self.i2caddress, func_array[i])
def draw_scatter(self, n, x_pos, mode, func_array):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_scatter, [n, x_pos, mode])
for i in range(0,n):
self.bus.write_byte(self.i2caddress, func_array[i])
def draw_udec(self, i, pos, dec):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_udec, [int(i >> 8), int(i & 0xff), pos, dec])
def draw_sdec(self, i, pos, dec):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_sdec, [int(i >> 8), int(i & 0xff), pos, dec])
def get_font(self):
self.bus.write_byte(self.i2caddress, self.cmd_get_font)
font = self.bus.read_byte(self.i2caddress)
return(font)
def get_max_xy(self):
self.bus.write_byte(self.i2caddress, self.cmd_get_max_xy)
max_x = self.bus.read_byte(self.i2caddress)
max_y = self.bus.read_byte(self.i2caddress)
return max_x, max_y
def get_cursor(self):
self.bus.write_byte(self.i2caddress, self.cmd_get_cursor)
x = self.bus.read_byte(self.i2caddress)
y = self.bus.read_byte(self.i2caddress)
return x, y
def get_font_height(self):
self.bus.write_byte(self.i2caddress, 65)
font_height = self.bus.read_byte(self.i2caddress)
return font_height
def get_str_width(self, my_str): # maximum string length is 32 characters
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_get_str_width, [ord(c) for c in (my_str + chr(0))])
return(self.bus.read_byte(self.i2caddress))
Display More
Dazu habe ich schon begonnen den Programmcode umzuschreiben, aber scheitere an den einzelnen Befehlen für das Senden = write und Lesen = read.
Mein bisheriger Ansatz:
import machine
class glcd:
def __init__(self, i2caddress, sda_pin, scl_pin):
self.i2caddress = i2caddress
self.sda_pin = sda
self.scl_pin = scl_pin
self.bus = machine.I2C(0, sda = machine.Pin(self.sda_pin), scl = machine.Pin(self.scl_pin), freq = 100000)
self.cmd_glcd_on = 1
self.cmd_glcd_off = 2
self.cmd_set_light = 3
self.cmd_set_dim_on = 4
self.cmd_set_dim_off = 5
self.cmd_set_i2c = 6
self.cmd_verbose_on = 7
self.comd_verbose_off = 8
self.cmd_set_auto_scroll_on = 9
self.cmd_set_auto_scroll_off = 10
self.cmd_enter_sleep_mode = 11
self.cmd_clear_screen = 15
self.cmd_draw_line = 17
self.cmd_draw_dotted_ver_line = 19
self.cmd_draw_dotted_hor_line = 20
self.cmd_draw_function = 21
self.cmd_draw_scatter = 22
self.cmd_draw_rectangle = 23
self.cmd_draw_filled_rectangle = 24
self.cmd_draw_circle = 25
self.cmd_draw_filled_circle = 26
self.cmd_draw_char = 32
self.cmd_draw_str = 33
self.cmd_draw_udec = 35
self.cmd_draw_sdec = 36
self.cmd_draw_center_str = 34
self.cmd_set_cursor = 50
self.cmd_set_font = 51
self.cmd_scroll_up = 52
self.cmd_get_str_width = 60
self.cmd_get_cursor = 61
self.cmd_get_font = 62
self.cmd_get_max_xy = 63
self.cmd_get_font_height = 65
def description(self):
return('Graphic LC Display with KS0108')
def set_i2c(self, new_i2c_address):
self.bus.write_word_data(self.i2caddress, self.cmd_set_i2c, new_i2c_address)
def set_glcd_on(self):
self.bus.write_byte(self.i2caddress, self.cmd_glcd_on)
def set_glcd_off(self):
self.bus.write_byte(self.i2caddress, self.cmd_glcd_off)
def set_light(self, value):
self.bus.write_word_data(self.i2caddress, self.cmd_set_light, value)
def set_dim_on(self):
self.bus.write_byte(self.i2caddress, self.cmd_set_dim_on)
def set_dim_off(self):
self.bus.write_byte(self.i2caddress, self.cmd_set_dim_off)
def set_auto_scroll(self, onoff):
if (onoff > 0):
self.bus.write_byte(self.i2caddress, self.cmd_set_auto_scroll_on)
else:
self.bus.write_byte(self.i2caddress, self.cmd_set_auto_scroll_off)
def enter_sleep_mode(self):
self.bus.write_byte(self.i2caddress, self.cmd_enter_sleep_mode)
def draw_line(self, x_start, y_start, x_end, y_end, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_line,[x_start, y_start, x_end, y_end, mode])
def draw_dotted_ver_line(self, x_pos, y_start, y_end, spacing, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_dotted_ver_line,[x_pos, y_start, y_end, spacing, mode])
def draw_dotted_hor_line(self, y_pos, x_start, x_end, spacing, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_dotted_hor_line,[y_pos, x_start, x_end, spacing, mode])
def clear_screen(self):
self.bus.write_word_data(self.i2caddress, self.cmd_clear_screen, 0)
def draw_circle(self, x_org, y_org, radius, sector, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_circle, [x_org, y_org, radius, sector, mode])
def draw_filled_circle(self, x_org, y_org, radius, sector, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_filled_circle, [x_org, y_org, radius, sector, mode])
def verbose(self, flag):
if flag > 0:
self.bus.write_byte(self.i2caddress, self.cmd_verbose_on)
else:
self.bus.write_byte(self.i2caddress, self.cmd_verbose_off)
def draw_rectangle(self, x_start, y_start, x_end, y_end, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_rectangle, [x_start, y_start, x_end, y_end, mode])
def draw_filled_rectangle(self, x_start, y_start, x_end, y_end, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_filled_rectangle, [x_start, y_start, x_end, y_end, mode])
def draw_circle(self, x_org, y_org, radius, sector, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_circle, [x_org, y_org, radius, sector, mode])
def draw_filled_circle(self, x_org, y_org, radius, sector, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_filled_circle, [x_org, y_org, radius, sector, mode])
def draw_pixel(self, x_start, y_start, mode):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_pixel, [x_start, y_start, mode])
def draw_char(self, my_char):
self.bus.write_word_data(self.i2caddress, self.cmd_draw_char, ord(my_char))
def draw_str(self, my_str):
self.bus.write_byte(self.i2caddress, self.cmd_draw_str)
for c in my_str:
self.bus.write_byte(self.i2caddress, ord(c))
self.bus.write_byte(self.i2caddress, 0)
def draw_center_str(self, my_str): # maximum string length is 32 characters
self.bus.write_byte(self.i2caddress, self.cmd_draw_center_str)
for c in my_str:
self.bus.write_byte(self.i2caddress, ord(c))
self.bus.write_byte(self.i2caddress, 0)
def set_cursor(self, x, y):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_set_cursor, [x, y])
def set_font(self, font_number):
self.bus.write_word_data(self.i2caddress, self.cmd_set_font, font_number)
def scroll_up(self, delta_pages):
self.bus.write_word_data(self.i2caddress, self.cmd_scroll_up, delta_pages)
def draw_function(self, n, x_pos, mode, func_array):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_function, [n, x_pos, mode])
for i in range(0,n):
self.bus.write_byte(self.i2caddress, func_array[i])
def draw_scatter(self, n, x_pos, mode, func_array):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_scatter, [n, x_pos, mode])
for i in range(0,n):
self.bus.write_byte(self.i2caddress, func_array[i])
def draw_udec(self, i, pos, dec):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_udec, [int(i >> 8), int(i & 0xff), pos, dec])
def draw_sdec(self, i, pos, dec):
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_draw_sdec, [int(i >> 8), int(i & 0xff), pos, dec])
def get_font(self):
self.bus.write_byte(self.i2caddress, self.cmd_get_font)
font = self.bus.read_byte(self.i2caddress)
return(font)
def get_max_xy(self):
self.bus.write_byte(self.i2caddress, self.cmd_get_max_xy)
max_x = self.bus.read_byte(self.i2caddress)
max_y = self.bus.read_byte(self.i2caddress)
return max_x, max_y
def get_cursor(self):
self.bus.write_byte(self.i2caddress, self.cmd_get_cursor)
x = self.bus.read_byte(self.i2caddress)
y = self.bus.read_byte(self.i2caddress)
return x, y
def get_font_height(self):
self.bus.write_byte(self.i2caddress, 65)
font_height = self.bus.read_byte(self.i2caddress)
return font_height
def get_str_width(self, my_str): # maximum string length is 32 characters
self.bus.write_i2c_block_data(self.i2caddress, self.cmd_get_str_width, [ord(c) for c in (my_str + chr(0))])
return(self.bus.read_byte(self.i2caddress))
Display More
Wie muss ich nun diese einzelnen Befehle write_word_data, write_byte, write_i2c_block_data, read_byte anpassen, damit das Programm vollständig unter µPYthon lauffähig wird ?
Ich bedanke mich schon ein mal für die Unterstützung.
Roland aus Thüringen