社区导航

 
查看: 702|回复: 2

[原创] 【micropython教程】+4 SPI驱动OLED显示成功

[复制链接]

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-7-11 19:41:02 | 显示全部楼层 |阅读模式

看了不少人驱动OLED都是使用I2C,但是手上的OLED模块已经焊接好SPI的,所以尝试使用SPI进行驱动。。。
参考了ESP8266 SPI驱动OLED
http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=508570
下面是我移植过来到PYboard CN2上面,一样是可以成功显示的。
话不多说,上代码
  1. # main.py -- put your code here!

  2. from pyb import LED  #add LED
  3. import machine
  4. from machine import Pin
  5. from machine import I2C
  6. from machine import SPI
  7. import ssd1306
  8. import math
  9. import time

  10. # construct an I2C bus
  11. #i2c = I2C(scl=Pin(14), sda=Pin(2), freq=100000)
  12. #display = ssd1306.SSD1306_I2C(128,64, i2c)

  13. # construct an SPI bus on the given pins
  14. # polarity is the idle state of SCK
  15. # phase=0 means sample on the first edge of SCK, phase=1 means the second

  16. #                                  CN2    OLED
  17. #Pin(14)--SCK  machine.Pin("Y6 ") --B13  --D0
  18. #Pin(13)--MOSI machine.Pin("Y8 ") --B15  --D1
  19. #Pin(12)--MISO machine.Pin("Y7 ") --B14  --
  20. #Pin(16)--CS   machine.Pin("Y11") --B0   --CS
  21. #Pin(4)--RES   machine.Pin("Y9")  --B10  --RES
  22. #Pin(5)--DC    machine.Pin("Y10") --B11  --DC


  23. spi = SPI(baudrate=10000000, polarity=1, phase=0, sck=machine.Pin("Y6"), mosi=machine.Pin("Y8"), miso=machine.Pin("Y7"))
  24. display = ssd1306.SSD1306_SPI(128, 64, spi, machine.Pin("Y10"),machine.Pin("Y9"), machine.Pin("Y11"))

  25. led_blue = LED(4)
  26. led_blue.on()

  27. try:
  28.   display.poweron()
  29.   display.init_display()

  30.   display.text('ESP-mp SPI OLED',1,1)
  31.   display.text('Hi, MicroPython!',1,16)
  32.   display.text('By: hbzjt2012',1,31)
  33.   
  34.   # Write display buffer
  35.   display.show()
  36.   time.sleep(3)

  37.   display.fill(0)
  38.   for x in range(0, 128):
  39.     display.pixel(x, 32+int(math.sin(x/64*math.pi)*7 + 8), 1)
  40.   display.show()
  41.   time.sleep(3)

  42.   display.fill(0)

  43.   x = 0
  44.   y = 0
  45.   direction_x = True
  46.   direction_y = True

  47.   while True:
  48.     # Clear the previous lines
  49.     prev_x = x
  50.     prev_y = y

  51.     # Move bars
  52.     x += (1 if direction_x else -1)
  53.     y += (1 if direction_y else -1)

  54.     # Bounce back, if required
  55.     if x == 128:
  56.        direction_x = False
  57.        x = 126
  58.     elif x == -1:
  59.        direction_x = True
  60.        x = 1
  61.     if y == 64:
  62.        direction_y = False
  63.        y = 63
  64.     elif y == -1:
  65.        direction_y = True
  66.        y = 1

  67.     # Draw new lines
  68.     for i in range(64):
  69.       display.pixel(prev_x, i, False)
  70.       display.pixel(x, i, True)
  71.     for i in range(128):
  72.       display.pixel(i, prev_y, False)
  73.       display.pixel(i, y, True)

  74.     # Make sure the corners are active
  75.     display.pixel(0,   0,  True)
  76.     display.pixel(127, 0,  True)
  77.     display.pixel(0,   63, True)
  78.     display.pixel(127, 63, True)
  79.    
  80.     # Write display buffer
  81.     display.show()


  82. except Exception as ex:
  83.   led_blue.off()
  84.   print('Unexpected error: {0}'.format(ex))
  85.   display.poweroff()
复制代码



主要是修改了Pin管脚锁定和LED的增加,
另外板上是没有ssd1306.py文件,见附件 ssd1306.py (5.35 KB, 下载次数: 6)

评分

1

查看全部评分



回复

使用道具 举报

1171

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-7-12 09:25:03 | 显示全部楼层
I2C刷屏慢,适合做菜单显示,
SPI速度快,可以快速刷屏


回复

使用道具 举报

7039

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-7-12 10:47:50 | 显示全部楼层


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-9-20 08:02 , Processed in 0.168537 second(s), 19 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表