First download and install Python and is modules from github.com https://github.com/Bingzo/replicape/tree/master/libs/spi
download spimodule.c and setup.py
More info:https://learn.adafruit.com/micropython-hardware-spi-devices/spi-master
and more info https://randomnerdtutorials.com/micropython-oled-display-esp32-esp8266/
More info:https://learn.adafruit.com/micropython-hardware-spi-devices/spi-master
and more info https://randomnerdtutorials.com/micropython-oled-display-esp32-esp8266/
#sudo sudo python setup.py build
and install (if you do not wish to use this module you and only build and use it from the build directory with out install)
sudo sudo python setup.py  install
Pinout
The olimex MOD-LCD3310 UEXT pinout is shown bellow. 
Rasberri Pi pinout and it's numbering can be found here https://pinout.xyz/ 
For my setup i used Raspberri Pi4 pins as follows
----------------------------------------- | Raspberri PI | | | | Physical pin | MOD-LCD331 | Name | |--------------|--------------|-----------| | 1 | 1 | 3.3V | | 19 | 8 | MOSI | | 21 | 7 | MISO | | 23 | 9 | SCLK/SCK | | 24 | 10 | CE0/SSEL |
| 39 | 2 | GNT | | 27 | 6 | GPIO0/SDA| | 28 | 5 | GPIO1/SCL| -----------------------------------------
Something like this :)
Download the 3310.py code from github https://github.com/OLIMEX/raspberrypi/tree/master/MOD-LCD-3310
Install missing python modules to Raspberri and enable spi via raspi-config --> Interfacing Options --> SPI
pip install termcolor RPi.GPIO
Execute code using old spi module
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(0, GPIO.OUT)     #SDA -> LCD_C/#D
GPIO.setup(1, GPIO.OUT)     #SCL -> #LCD_RESET
GPIO.output(0, True)
GPIO.output(1, True)
from spi import SPI
lcd = SPI(0, 0)
lcd.msh = 1000000
#define some variables
SEND_CMD = 0
SEND_CHR = 1
LCD_X_RES = 84
LCD_Y_RES = 48
PIXEL_OFF = 0
PIXEL_ON = 1
PIXEL_XOR = 2
FONT_1X = 1
FONT_2X = 2
LCD_CACHE_SIZE = ((LCD_X_RES * LCD_Y_RES) / 8)
LcdMemIdx = 0
LcdMemory = [0x00] * LCD_CACHE_SIZE
LCD_START_LINE_ADDR = 64
SEND_CMD = 0
SEND_CHR = 1
def LCD_DC_HIGH():
    GPIO.output(0, True)
    return
def LCD_DC_LOW():
    GPIO.output(0, False)
    return
def LCDClear():
    #"Clear LCD"
    for i in range(LCD_CACHE_SIZE):
        LcdMemory[i] = 0x00
    return
def LCDReset():
    GPIO.output(1, False)
    time.sleep(0.05)
    GPIO.output(1, True)
def LCDUpdate():
    #"Update LCD memory"
    
    for y in range(6):
        LCDSend(0x80, SEND_CMD)
        LCDSend(0x40 | y, SEND_CMD)
        for x in range(84):
            LCDSend(LcdMemory[(y * 84) +x], SEND_CHR)
    return
def LCDSend(data, cd):
    #print
    if cd == SEND_CHR:
        LCD_DC_HIGH()
    else:
        LCD_DC_LOW()
        
    lcd.writebytes([data])    
    return
    
    
def LCDInit():
    #"Init LCD Controller"
    LCDReset()
    
    LCDSend(0x03, SEND_CMD)
    time.sleep(1)
    LCDSend( 0x21, SEND_CMD)                                        #LCD Extended Commands
    LCDSend( 0xC8, SEND_CMD)                                        #Set KCD Vop (contrast)
    LCDSend( 0x04 | int(not(not(LCD_START_LINE_ADDR & (1 << 6)))), SEND_CMD)   #Set Temp S6 for start line
    LCDSend( 0x40 | (LCD_START_LINE_ADDR & ((1<<6 0x08="" 0x0c="" 0x12="" 0x20="" 1:68="" addressing="" bias="" blank="" commands="" contrast="" def="" et="" extended="" for="" horizontal="" in="" lcd="" lcdclear="" lcdcontrast="" lcdsend="" lcdupdate="" line="" mode="" normal="" ontrast="" pre="" s="" send_cmd="" standard="" start="" temp="" vop="" x20="" x21="" x80="" xff="">
Code with SPIDEV:
import RPi.GPIO as GPIO
import time
import spidev
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(0, GPIO.OUT)     #SDA -> LCD_C/#D
GPIO.setup(1, GPIO.OUT)     #SCL -> #LCD_RESET
GPIO.output(0, True)
GPIO.output(1, True)
lcd = spidev.SpiDev()
lcd.open(0,0)
lcd.max_speed_hz = 1000000
#define some variables
SEND_CMD = 0
SEND_CHR = 1
LCD_X_RES = 84
LCD_Y_RES = 48
PIXEL_OFF = 0
PIXEL_ON = 1
PIXEL_XOR = 2
FONT_1X = 1
FONT_2X = 2
LCD_CACHE_SIZE = ((LCD_X_RES * LCD_Y_RES) / 8)
LcdMemIdx = 0
LcdMemory = [0x00] * LCD_CACHE_SIZE
LCD_START_LINE_ADDR = 64
SEND_CMD = 0
SEND_CHR = 1
def LCD_DC_HIGH():
    GPIO.output(0, True)
    return
def LCD_DC_LOW():
    GPIO.output(0, False)
    return
def LCDClear():
    #"Clear LCD"
    for i in range(LCD_CACHE_SIZE):
        LcdMemory[i] = 0x00
    return
def LCDReset():
    GPIO.output(1, False)
    time.sleep(0.05)
    GPIO.output(1, True)
def LCDUpdate():
    #"Update LCD memory"
    
    for y in range(6):
        LCDSend(0x80, SEND_CMD)
        LCDSend(0x40 | y, SEND_CMD)
        for x in range(84):
            LCDSend(LcdMemory[(y * 84) +x], SEND_CHR)
    return
def LCDSend(data, cd):
    #print
    if cd == SEND_CHR:
        LCD_DC_HIGH()
    else:
        LCD_DC_LOW()
        
    lcd.writebytes([data])    
    return
    
    
def LCDInit():
    #"Init LCD Controller"
    LCDReset()
    
    LCDSend(0x03, SEND_CMD)
    time.sleep(1)
    LCDSend( 0x21, SEND_CMD)                                        #LCD Extended Commands
    LCDSend( 0xC8, SEND_CMD)                                        #Set KCD Vop (contrast)
    LCDSend( 0x04 | int(not(not(LCD_START_LINE_ADDR & (1 << 6)))), SEND_CMD)   #Set Temp S6 for start line
    LCDSend( 0x40 | (LCD_START_LINE_ADDR & ((1<<6 0x08="" 0x0c="" 0x12="" 0x20="" 1:68="" __name__="=" addressing="" bias="" blank="" commands="" contrast="" def="" et="" extended="" for="" horizontal="" if="" in="" lcd="" lcdclear="" lcdcontrast="" lcdsend="" lcdupdate="" line="" main__="" mode="" normal="" ontrast="" pre="" s="" send_cmd="" standard="" start="" temp="" vop="" x20="" x21="" x80="" xff="">
6>
6>

 
No comments:
Post a Comment