2020年12月21日 星期一

驅動 128x64 繁體中文 LCD 點、線和面 #MicroPython #ST7920 #ESP8266

網頁最後修改時間:2020/12/21

前幾天,有人在賣場詢問是否有 MicroPython 驅動 128x64 繁體中文 LCD 的範例程式,基本上上商品所附的範例程式還是單晶片(8051)、Arduino 開發版和 ESP8285(Arduino)程式為主。

不過,找了時間在網路上做了一些搜尋,在 Github 上發現了不錯的 Repository 並做了測試。雖然這這些 Repository 能來驅動顯示英文字和畫線、畫方框,但最後沒有直接能找到可顯示繁體中文的 MicroPython 範例程式可做參考。

不過經過一番折騰,還是成功了把原來的程式移植到了MicroPython!

在進入到主題篇之前,本篇要先來用用在 Github 找到用來驅動 128x64 繁體中文 LCD(下面簡稱繁中LCD)顯示點、線和面的 Repository:MicroPython-ST7920

主要內容有:


*********************************************************************************

*********************************************************************************


【(01)韌體與接線】

網頁撰寫當時,範例裡的 NodeMCU 使用的 MicroPython 韌體版本,是 Firmware for Generic ESP8266 module/Stable firmware, 2M or more of flash 小節中的 esp8266-20200911-v1.13.bin(只要是 ESP8266 晶片,MicroPython 的韌體都可以在這個網頁裡找到相對應的韌體燒錄)。

不管是使用 ESP8266 的模組或是開發板,下面是它們的接線圖。如果是使用其它的 MicroPython 開發板,將該開發板的 SPI 的 <MOSI><SCK> 兩隻接腳分別接到繁中LCD<R/W><E> 就可以。

NodeMCU (ESP8266) 與繁中 LCD 接線圖


【(02)MicroPython 程式碼下載和修改】

網頁裡使用 MicroPython-ST7920 的程式碼來做繁中LCD的點、線和面繪製,所以您要先去把它下載回來並解壓縮到資料夾中。

解壓縮之後,資料夾裡看到 5 個 *.py 的檔案。不過在這裡,您所會用到的只有 st7920.pycanvas.pyexample.py 這三個檔案:

  • canvas.py
    畫線、方框的程式碼。
  • st7920.py
    繼承自 canvas.py 的類別,驅動繁中LCD的程式碼。
  • example.py
    繁中LCD使用的範例程式碼。

如果在上傳這三個檔案後能成功執行 examples.py 的話,那麼繁中LCD的顯示會跟網頁開頭照片中的 LCD 一樣。 如果出現 NotImplementedError 的錯誤不能正常執行的話,那麼可以試試如下的修改,將 plot() 直接實做出來並修正幾行程式,同樣可以達到相同的結果。


/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* st7920.py:

由於執行 example.py 時出現 NotImplementedError 的錯誤,找到的原因應該是 create_plotter() 函式生不出 plot()。在不知道怎麼修正這問題的情況之下,解決方法就是直接修改 create_plotter() 為 plot()

def create_plotter(self, set=True):

改成

def plot(self, x, y, set=True):

然後在函數開頭處加入 xy 的範圍限制,再將 def plot(x, y): 所有的程式碼刪除,最後刪除 return plot,這樣就完成 plot() 函式的修改!

st7920.py plot() 函式程式碼


/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* canvas.py:

由於用 plot() 取代了 create_plotter(),因此原來有使用到 plot() 的地方也要一併修正。

修正的方式很簡單,也就是在 canvas.py 裡面有用到 plot() 的都要一併做修改。

函式部分:

def line(self, x1, y1, x2, y2, plot):
def fill_rect(self, x1, y1, x2, y2, plot):
def rect(self, x1, y1, x2, y2, polt):

改成

def line(self, x1, y1, x2, y2, set=True):
def fill_rect(self, x1, y1, x2, y2, set=True):
def rect(self, x1, y1, x2, y2, set=True):

函式裡面有用到 plot() 的部分,都要修改它們最後的一個參數值,像是:

plot(x1, y1)
self.line(x1, y, x2, y, plot)

改成

self.plot(x1, y1, set)
self.line(x1, y, x2, y, set)

因為不再使用 create_plotter 了,所以刪除檔案開頭處的

    create_plotter = raiseError

完成上面的修改,canvas.py 基本上就算完成!


/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* example.py:

example.py 是執行的範例檔案,檔案開頭處需要做一些修改:

import st7920
from machine import Pin

# implicitly uses hardware spi; https://docs.micropython.org/en/latest/esp8266/esp8266/quickref.html#hardware-spi-bus
screen = st7920.Screen(slaveSelectPin=Pin(15), resetDisplayPin=Pin(5))

改成

from st7920 import Screen
import machine

# implicitly uses hardware spi; https://docs.micropython.org/en/latest/esp8266/esp8266/quickref.html#hardware-spi-bus
spi = machine.SPI(1, baudrate=100000, polarity=1, phase=1)
screen = Screen(spi=spi)

這樣就可以了!


/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* (02-04)修改後的程式碼 Github 下載網址:

我跟網友討論和修改之後的檔案,該網友將其整理之後放置在他的 Github 中,有需要的可以直接到下面的 Github 網址下載:

Github cephaswang/st7920_MicroPython


【結論】

因為這個部分已經與網友做過討論,而且也將要修改的部分給了他,因此將這些部分再分享給其他需要的網友;除非上面連結中的程式碼已經遺失或是刪除,要不在這裡就不另外再提供程式碼,請直接由上面所提供的 Github 網址中下載。

如果您對於這個修改的程式碼有不同的解決方法、意見和看法,歡迎在下面留言!


.

.

沒有留言:

張貼留言

留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !