{"id":22253908,"url":"https://github.com/mcauser/micropython-pcd8544-c","last_synced_at":"2025-03-25T12:26:31.646Z","repository":{"id":150620691,"uuid":"206695506","full_name":"mcauser/micropython-pcd8544-c","owner":"mcauser","description":null,"archived":false,"fork":false,"pushed_at":"2020-05-24T16:12:25.000Z","size":12,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-30T11:27:56.514Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mcauser.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-09-06T02:22:03.000Z","updated_at":"2020-05-24T16:12:27.000Z","dependencies_parsed_at":"2023-05-06T09:32:38.061Z","dependency_job_id":null,"html_url":"https://github.com/mcauser/micropython-pcd8544-c","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcauser%2Fmicropython-pcd8544-c","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcauser%2Fmicropython-pcd8544-c/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcauser%2Fmicropython-pcd8544-c/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcauser%2Fmicropython-pcd8544-c/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mcauser","download_url":"https://codeload.github.com/mcauser/micropython-pcd8544-c/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245460718,"owners_count":20619125,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-03T07:21:00.177Z","updated_at":"2025-03-25T12:26:31.600Z","avatar_url":"https://github.com/mcauser.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MicroPython PCD8544 - WIP\n\n⚠️ 👨‍💻 🚧 A WIP MicroPython library for the Philips PCD8544 84x48 monochrome LCD, used by the Nokia 5110 display.\n\n## Build and deploy:\n\n### Wemos D1 Mini (ESP8266)\n\n```\ncd micropython/ports/esp8266\nmake clean\nmake USER_C_MODULES=../../../mikes_modules CFLAGS_EXTRA=-DMODULE_MCD8544_ENABLED=1 all\nmake PORT=/dev/tty.wchusbserial1430 deploy\n```\n\n### ESP32 (TinyPICO)\n\n```\ncd ports/esp32\nmake BOARD=TINYPICO clean\nmake BOARD=TINYPICO\n\nmake USER_C_MODULES=../../../mikes_modules CFLAGS_EXTRA=-DMODULE_MCD8544_ENABLED=1 BOARD=TINYPICO\n\nmake BOARD=TINYPICO erase PORT=/dev/tty.SLAB_USBtoUART\nmake BOARD=TINYPICO deploy PORT=/dev/tty.SLAB_USBtoUART\n```\n\n⚠️ I've called it MCD8544 instead of PCD8544 temporarily, so it can co-exist with my python verison while I'm developing it.\n\n\n# Testing python version\n\n\u003chttps://github.com/mcauser/micropython-pcd8544\u003e\n\n```python\nimport pcd8544\nimport time\nfrom machine import Pin, SPI\n\nspi = SPI(1)\nspi.init(baudrate=2000000, polarity=0, phase=0)\ncs = Pin(2)\ndc = Pin(15)\nrst = Pin(0)\n\n# backlight on\nbl = Pin(12, Pin.OUT, value=0)\n\nplcd = pcd8544.PCD8544(spi, cs, dc, rst)\nplcd.data(bytearray([0xFF] * 504))\nplcd.data(bytearray([0x00] * 504))\n\n# test 1\nstart = time.ticks_us()\nplcd.data(bytearray([0x55, 0xAA] * 42 * 6))\ntime.ticks_diff(time.ticks_us(), start)\n\n# test 20x\nbuf = bytearray([0x55, 0xAA] * 42 * 6)\nticks_us = time.ticks_us\nstart = ticks_us()\nfor i in range(20):\n    plcd.data(buf)\nend = ticks_us()\nduration = time.ticks_diff(end, start) / 20\nprint('Average over 20 tests: ', duration)\n```\n\n# Testing C version\n\n\u003chttps://github.com/mcauser/micropython-pcd8544-c\u003e\n\n```python\nimport mcd8544\nimport time\nfrom machine import Pin, SPI\n\nspi = SPI(1)\nspi.init(baudrate=2000000, polarity=0, phase=0)\ncs = Pin(2, Pin.OUT)\ndc = Pin(15, Pin.OUT)\nrst = Pin(0, Pin.OUT)\nbl = Pin(12, Pin.OUT, value=0)\n\n# swapped dc + cs in constructor so cs can be optional\nlcd = mcd8544.MCD8544(spi, dc, cs, rst)\n\n# test 20x\nbuf = bytearray([0x55, 0xAA] * 42 * 6)\nticks_us = time.ticks_us\nstart = ticks_us()\nfor i in range(20):\n    lcd.data(buf)\nend = ticks_us()\nduration = time.ticks_diff(end, start) / 20\nprint('Average over 20 tests: ', duration)\n```\n\n### Testing C version on TinyPICO\n\n```python\nimport mcd8544\nfrom machine import Pin, SPI\n\nspi = SPI(2, baudrate=8000000, polarity=0, phase=0, bits=8, firstbit=0, sck=Pin(18), mosi=Pin(23), miso=Pin(19))\n\ncs = Pin(21, Pin.OUT, value=1)\ndc = Pin(32, Pin.OUT, value=1)\nrst = Pin(22, Pin.OUT, value=1)\nbl = Pin(33, Pin.OUT, value=1)  # backlight on\n\nlcd = mcd8544.MCD8544(spi, dc, cs, rst)\n# lcd = mcd8544.MCD8544(spi, dc, cs, rst, 0, 63, 4, 2)\n\n# test pattern (50% on)\nlcd.data(bytearray([0x55, 0xAA] * 42 * 6))\n\n# fill\nlcd.data(bytearray([0xff] * 504))\n\n# clear\nlcd.data(bytearray([0x00] * 504))\n\n# words\nlcd.position(0,0)\nlcd.text('Hello')\nlcd.position(0,1)\nlcd.text('World')\n\n# clear/fill\nlcd.fill(0) # throws Guru Meditation Error\nlcd.fill(1) # throws Guru Meditation Error\n\n# nokia hands\nlcd.position(0,0)\nlcd.data(bytearray(b'\\x80\\x00\\x00\\x80\\x00\\x00\\x80\\x00\\x00\\x80\\x00\\x00\\x80\\x00\\x00\\x80\\x00\\x00\\x80\\x80\\x40\\x40\\x40\\x80\\x80\\xC0\\xC0\\x40\\xC0\\xA0\\xE0\\xC0\\xE0\\xE0\\xF0\\xF0\\xF8\\xF8\\xF8\\xFC\\xFC\\xFE\\xEE\\xF4\\xF0\\xF0\\x70\\x30\\x00\\x80\\x00\\x00\\x80\\x00\\x0C\\x9C\\x1C\\x38\\xB8\\x38\\x38\\xB8\\xF8\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xF8\\xF8\\xF8\\xF8\\x88\\x20\\x8A\\x20\\x08\\x22\\x08\\x00\\x0A\\x00\\x00\\x02\\x80\\x71\\xBA\\xDA\\xFD\\xDD\\xED\\xDE\\xEE\\xF7\\xFF\\xFB\\xFD\\xFD\\xFE\\xFF\\x7F\\x3F\\x1F\\x9F\\x3F\\x7F\\x6F\\x0F\\xAF\\x1F\\xBF\\x3E\\x3C\\x7A\\x78\\x70\\x22\\x88\\xA0\\x2A\\x80\\x08\\x62\\xE0\\xE0\\xF2\\xF0\\x58\\xDA\\xF8\\xFC\\x92\\xFE\\xFF\\xFF\\xD3\\xFF\\xFD\\xF3\\xE1\\xF0\\xF9\\x7F\\xBF\\x3F\\x8F\\x2F\\x4F\\xAF\\x0F\\x4F\\xA7\\x0F\\xAF\\x87\\x2F\\x82\\x80\\x20\\xC0\\x80\\x80\\x50\\x40\\xC4\\xD0\\xA0\\xE8\\xE4\\xEA\\xFF\\xFB\\xFD\\xFF\\xFF\\xFF\\xFF\\xFF\\xEF\\x4F\\x27\\x53\\xA8\\x54\\x29\\x4A\\xB5\\x82\\xAC\\xA1\\x8A\\xB6\\x50\\x4D\\x32\\xA4\\x4A\\xB4\\xA9\\x4A\\x52\\xB4\\xAA\\x45\\xA8\\xDA\\x22\\xAC\\xD2\\x2A\\x52\\xA8\\x52\\x4C\\xB0\\xAD\\x43\\x5B\\xB3\\x45\\xA8\\x5B\\xA3\\xAB\\x55\\xA8\\x52\\x54\\xA9\\x56\\xA8\\x45\\xBA\\xA4\\x49\\x5A\\xA2\\x54\\xAA\\x52\\xFE\\xFF\\xFF\\xFE\\xFD\\xFF\\xFF\\xFF\\xFE\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\x7F\\xFF\\xFE\\xBF\\x7F\\xBF\\xBF\\xFF\\xDF\\xBF\\x5F\\xDF\\x7F\\xDF\\x7F\\xDF\\xAF\\x7F\\xEE\\x8E\\xF1\\x6E\\x99\\xF7\\x6A\\xDD\\xB2\\x6E\\xD5\\x7A\\xD7\\xAC\\x75\\xDB\\x6D\\xD5\\x7A\\xD7\\xAC\\x7B\\xE5\\xDE\\xA9\\x77\\xDA\\xB5\\xEE\\x59\\xB6\\xEB\\xDD\\xB6\\x69\\xD6\\xBF\\xE8\\x55\\xEF\\xB9\\xD6\\xED\\xB5\\x5B\\xAB\\xFF\\xFD\\xF7\\xFF\\x01\\x01\\x01\\x01\\xE1\\xC1\\x81\\x03\\x05\\x0F\\x1D\\x2F\\x7E\\x01\\x00\\x01\\x01\\xFF\\xFE\\x03\\x01\\x01\\x00\\xF1\\xF0\\xF1\\x71\\xF1\\xF1\\xB1\\xF1\\x01\\x01\\x01\\x03\\xFE\\xFF\\x01\\x01\\x01\\x01\\xBE\\x1B\\x0D\\x07\\x03\\x41\\xE1\\xF1\\xF9\\x6D\\xFF\\xFF\\x00\\x01\\x01\\x01\\xFF\\xFF\\xEB\\x3E\\x0D\\x03\\x01\\x41\\x71\\x70\\x41\\x01\\x03\\x0E\\x3B\\xEF\\xFE\\xFB\\xEE\\x7D\\xF7\\xFF\\xFF\\xFF\\xFF\\xFE\\xFF\\xF0\\xF0\\xF0\\xF0\\xFF\\xFF\\xFF\\xFF\\xFE\\xFC\\xF8\\xF0\\xF0\\xF0\\xF0\\xF0\\xF0\\xFF\\xFF\\xF8\\xF0\\xF0\\xF0\\xF1\\xF1\\xF1\\xF1\\xF1\\xF1\\xF1\\xF1\\xF0\\xF0\\xF0\\xF8\\xFF\\xFF\\xF0\\xF0\\xF0\\xF0\\xFF\\xFF\\xFE\\xFC\\xF8\\xF0\\xF0\\xF1\\xF3\\xF7\\xFF\\xFF\\xF0\\xF0\\xF0\\xF0\\xFF\\xF3\\xF0\\xF0\\xF0\\xFC\\xFC\\xFC\\xFC\\xFC\\xFC\\xFC\\xFC\\xF0\\xF0\\xF0\\xF3\\xFF\\xFF\\xFF\\xFF\\xFF'))\n```\n\n## Tested, works:\n\n```\n# lcd.power(on)\nlcd.power(False)\nlcd.power(0)\nlcd.power(True)\nlcd.power(1)\n\n# lcd.display(on)\nlcd.display(False)\nlcd.display(0)\nlcd.display(True)\nlcd.display(1)\n\n# lcd.invert(inverted)\nlcd.invert(False)\nlcd.invert(0)\nlcd.invert(True)\nlcd.invert(1)\n\n# lcd.test(testing)\nlcd.test(False)\nlcd.test(0)\nlcd.test(True)\nlcd.test(1)\n\n# lcd.position(x, y)\nlcd.position(0,0)\nlcd.data(bytearray([0xff]))\nlcd.position(1,1)\nlcd.position(0,3)\n\n# lcd.init(addressing, vop, bias, temp)\nlcd.init(0)\nlcd.init(1)\nlcd.init(1,63)\nlcd.init(1,53,4)\nlcd.init(1,63,4,2)\n\nlcd.position(0,0)\nlcd.data(bytearray([0xff]))\nlcd.data(bytearray([0x55, 0xAA] * 42 * 6))  # 50% on\nlcd.data(bytearray([0xFF] * 84))   # page on\nlcd.data(bytearray([0xFF] * 504))  # all on\nlcd.data(bytearray([0x00] * 504))  # all off\n\nlcd.position(0,0)\nlcd.text('My PCD8544')\nlcd.position(0,1)\nlcd.text('driver')\n\nlcd.reset()\nlcd.init()\n\nlcd.init()\nlcd.display(0)\nlcd.position(0,0)\nlcd.text('Hello')\nlcd.display(1)\n\nlcd.init()\nlcd.power(0)\nlcd.position(0,0)\nlcd.text('World')\nlcd.power(1)\n\nlcd.fill(0) # throws Guru Meditation Error\nlcd.fill(1) # throws Guru Meditation Error\n```\n\n## WIP\n\n```python\nlcd.fill(colour)\n  # crashes and resets\n  # this writes zeros to the ddram - its faster to just reset() it - same outcome, but need to persist horiz, vop, bias and temp\n\n  # Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.\n  # Core 1 register dump:\n  # PC      : 0x400e17a5  PS      : 0x00060130  A0      : 0x800fc211  A1      : 0x3ffce7f0\n  # A2      : 0x00000000  A3      : 0x00000001  A4      : 0x3ffce830  A5      : 0x00000000\n  # A6      : 0x00000008  A7      : 0x3ffce9b0  A8      : 0x00000000  A9      : 0x00000015\n  # A10     : 0x00000000  A11     : 0x00000000  A12     : 0x00000028  A13     : 0x3ffce7e8\n  # A14     : 0x00000002  A15     : 0x00000002  SAR     : 0x00000001  EXCCAUSE: 0x0000001c\n  # EXCVADDR: 0x00000000  LBEG    : 0x40093cb0  LEND    : 0x40093cde  LCOUNT  : 0xffffffff\n  #\n  # ELF file SHA256: 0000000000000000000000000000000000000000000000000000000000000000\n  #\n  # Backtrace: 0x400e17a5:0x3ffce7f0 0x400fc20e:0x3ffce810 0x400fc275:0x3ffce830 0x400e3fc9:0x3ffce860 0x400dfda5:0x3ffce880 0x400dfed9:0x3ffce8a0 0x400ede63:0x3ffce8c0 0x400e4124:0x3ffce960 0x400dfda5:0x3ffce9d0 0x400dfdce:0x3ffce9f0 0x4010751b:0x3ffcea10 0x40107735:0x3ffceaa0 0x400f71ac:0x3ffceae0 0x4009453a:0x3ffceb10\n  #\n  # Rebooting...\n\n\nlcd.contrast(vop, bias, temp)\n  # decided not to include this, instead call init(addressing, vop, bias, temp)\n\nlcd.text()\n  # simple version working, using stm32 petme font\n  # be nice if i could add an inverted version\n  # add x and y args and internally set position before printing\n```\n\n## Connections\n\nWeMos D1 Mini | PCD8544 LCD\n------------- | ----------\nD3 (GPIO0)    | 1 RST\nD4 (GPIO2)    | 2 CE\nD8 (GPIO15)   | 3 DC\nD7 (GPIO13)   | 4 Din\nD5 (GPIO14)   | 5 Clk\n3V3           | 6 Vcc\nD6 (GPIO12)   | 7 BL\nG             | 8 GND\n\nTinyPICO | PCD8544 LCD\n-------- | ----------\nGPIO22   | 1 RST\nGPIO21   | 2 CE\nGPIO32   | 3 DC\nGPIO23   | 4 Din\nGPIO18   | 5 Clk\n3V3      | 6 Vcc\nGPIO33   | 7 BL\nG        | 8 GND\n\n## License\n\nLicensed under the [MIT License](http://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmcauser%2Fmicropython-pcd8544-c","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmcauser%2Fmicropython-pcd8544-c","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmcauser%2Fmicropython-pcd8544-c/lists"}