查看: 3643|回复: 0

MicroPython-ESP8266开发板控制OLED液晶显示屏教程实例附代码

[复制链接]
  • TA的每日心情
    开心
    2016-9-7 16:50
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-6-5 14:58:43 | 显示全部楼层 |阅读模式
    分享到:
      1.实验目的

      1.学习在PC机系统中扩展简单I/O接口的方法。

      2.进一步学习编制数据输出程序的设计方法。

      3.学习TPYBoardv202控制OLED显示字符。

      2.所需元器件

      TPYBoardv202开发板一块

      数据线一条

      杜邦线若干

      OLED液晶屏一块

      3.什么是OLED显示屏

      (1)OLED显示屏简介

      有机发光二极管(organiclight-emittingdiode,OLED)是一种由柯达公司开发并拥有专利的显示技术,这项技术使用有机聚合材料作为发光二极管中的半导体(semiconductor)材料。聚合材料可以是天然的,也可能是人工合成的,可能尺寸很大,也可能尺寸很小。其广泛运用于手机、数码摄像机、DVD机、个人数字助理(PDA)、笔记本电脑、汽车音响和电视。OLED显示器很薄很轻,因为它不使用背光。

      本例中使用0.96寸OLED显示屏,该屏具有高亮度,低功耗屏,显示颜色纯正,在阳光下有很好的可视效果。模块供电可以是3.3V也可以是5V,不需要修改模块电路,同时兼容3种通信方式:4线SPI、3线SPI、IIC,通信模式的选择可以根据提供的BOM表进行跳选。该模块一共有三种颜色:蓝色、白色、黄蓝双色。OLED屏具有多个控制指令,可以控制OLED的亮度、对比度、开关升压电路等指令。操作方便,功能丰富。同时为了方便应用在产品上,预留4个M2固定孔,方便用户固定在机壳上。0.96寸OLED显示屏的驱动芯片为:SSD1306(已集成在屏中)。

      (2)实际显示效果

    1.jpg



      (3)OLED接口定义

      1>GND=电源地

      2>VCC=电源地(2.8V~5.5V)

      3>D0=时钟线

      4>D1=数据线

      5>RES=复位线

      6>DC=数据/命令

      7>CS=片选

      4.具体接线方法
      
    TPYboard v202
      
    OLED
    GND
    GND
    3.3V
    VCC
    SCK
    D0
    MO
    D1
    G4
    RES
    G5
    DC
    G16
    CS



      5.实物接线图

    2.jpg


     6.程序源代码
     main.py 程序源代码
    1. # main.py -- put your code here!
    2. import machine
    3. from machine import Pin,I2C,SPI
    4. import ssd1306
    5. import math
    6. import time

    7. spi = SPI(baudrate=10000000, polarity=1, phase=0, sck=Pin(14,Pin.OUT), mosi=Pin(13,Pin.OUT), miso=Pin(12))
    8. display = ssd1306.SSD1306_SPI(128, 64, spi, Pin(5),Pin(4), Pin(16))

    9. led_blue = machine.Pin(2, Pin.OUT)  # 设置 GPIO2 为输出
    10. led_blue.high()

    11. try:
    12.   display.poweron()
    13.   display.init_display()

    14.   display.text('TPYBoard V202',1,1)
    15.   display.text('Hi, TurnipSmart',1,16)
    16.   display.text('I Love You',1,31)
    17.   display.text('This is DNA!!',1,46)
    18.   display.show()
    19.   time.sleep(3)
    20.   display.fill(0)
    21.   #显示DNA
    22.   for x in range(0, 128):
    23.     display.pixel(x, 32+int(math.cos(x/64*math.pi)*30 +2), 1)
    24.     display.pixel(x, 32+int(math.cos((x+64)/64*math.pi)*30+2), 1)
    25.   display.show()
    26. except Exception as ex:
    27.   led_blue.low()
    28.   print('Unexpected error: {0}'.format(ex))
    29.   display.poweroff()
    复制代码
     ssd1306程序源代码
    1. import pyb
    2. import font

    3. # Constants
    4. DISPLAYOFF          = 0xAE
    5. SETCONTRAST         = 0x81
    6. DISPLAYALLON_RESUME = 0xA4
    7. DISPLAYALLON        = 0xA5
    8. NORMALDISPLAY       = 0xA6
    9. INVERTDISPLAY       = 0xA7
    10. DISPLAYON           = 0xAF
    11. SETDISPLAYOFFSET    = 0xD3
    12. SETCOMPINS          = 0xDA
    13. SETVCOMDETECT       = 0xDB
    14. SETDISPLAYCLOCKDIV  = 0xD5
    15. SETPRECHARGE        = 0xD9
    16. SETMULTIPLEX        = 0xA8
    17. SETLOWCOLUMN        = 0x00
    18. SETHIGHCOLUMN       = 0x10
    19. SETSTARTLINE        = 0x40
    20. MEMORYMODE          = 0x20
    21. COLUMNADDR          = 0x21
    22. PAGEADDR            = 0x22
    23. COMSCANINC          = 0xC0
    24. COMSCANDEC          = 0xC8
    25. SEGREMAP            = 0xA0
    26. CHARGEPUMP          = 0x8D
    27. EXTERNALVCC         = 0x10
    28. SWITCHCAPVCC        = 0x20
    29. SETPAGEADDR         = 0xB0
    30. SETCOLADDR_LOW      = 0x00
    31. SETCOLADDR_HIGH     = 0x10
    32. ACTIVATE_SCROLL                      = 0x2F
    33. DEACTIVATE_SCROLL                    = 0x2E
    34. SET_VERTICAL_SCROLL_AREA             = 0xA3
    35. RIGHT_HORIZONTAL_SCROLL              = 0x26
    36. LEFT_HORIZONTAL_SCROLL               = 0x27
    37. VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL = 0x29
    38. VERTICAL_AND_LEFT_HORIZONTAL_SCROLL  = 0x2A

    39. # I2C devices are accessed through a Device ID. This is a 7-bit
    40. # value but is sometimes expressed left-shifted by 1 as an 8-bit value.
    41. # A pin on SSD1306 allows it to respond to ID 0x3C or 0x3D. The board
    42. # I bought from ebay used a 0-ohm resistor to select between "0x78"
    43. # (0x3c << 1) or "0x7a" (0x3d << 1). The default was set to "0x78"
    44. DEVID = 0x3c

    45. # I2C communication here is either <DEVID> <CTL_CMD> <command byte>
    46. # or <DEVID> <CTL_DAT> <display buffer bytes> <> <> <> <>...
    47. # These two values encode the Co (Continuation) bit as b7 and the
    48. # D/C# (Data/Command Selection) bit as b6.
    49. CTL_CMD = 0x80
    50. CTL_DAT = 0x40

    51. class SSD1306(object):

    52.   def __init__(self, pinout, height=32, external_vcc=True, i2c_devid=DEVID):
    53.     self.external_vcc = external_vcc
    54.     self.height       = 32 if height == 32 else 64
    55.     self.pages        = int(self.height / 8)
    56.     self.columns      = 128

    57.     # Infer interface type from entries in pinout{}
    58.     if 'dc' in pinout:
    59.       # SPI
    60.       rate = 16 * 1024 * 1024
    61.       self.spi = pyb.SPI(1, pyb.SPI.MASTER, baudrate=rate, polarity=1, phase=0)  # SCK: Y6: MOSI: Y8
    62.       self.dc  = pyb.Pin(pinout['dc'],  pyb.Pin.OUT_PP, pyb.Pin.PULL_DOWN)
    63.       self.res = pyb.Pin(pinout['res'], pyb.Pin.OUT_PP, pyb.Pin.PULL_DOWN)
    64.       self.offset = 0
    65.     else:
    66.       # Infer bus number from pin
    67.       if pinout['sda'] == 'X10':
    68.         self.i2c = pyb.I2C(1)
    69.       else:
    70.         self.i2c = pyb.I2C(2)
    71.       self.i2c.init(pyb.I2C.MASTER, baudrate=400000) # 400kHz
    72.       self.devid = i2c_devid
    73.       # used to reserve an extra byte in the image buffer AND as a way to
    74.       # infer the interface type
    75.       self.offset = 1
    76.       # I2C command buffer
    77.       self.cbuffer = bytearray(2)
    78.       self.cbuffer[0] = CTL_CMD

    79.   def clear(self):
    80.     self.buffer = bytearray(self.offset + self.pages * self.columns)
    81.     if self.offset == 1:
    82.       self.buffer[0] = CTL_DAT

    83.   def write_command(self, command_byte):
    84.     if self.offset == 1:
    85.       self.cbuffer[1] = command_byte
    86.       self.i2c.send(self.cbuffer, addr=self.devid, timeout=5000)
    87.     else:
    88.       self.dc.low()
    89.       self.spi.send(command_byte)

    90.   def invert_display(self, invert):
    91.     self.write_command(INVERTDISPLAY if invert else NORMALDISPLAY)

    92.   def display(self):
    93.     self.write_command(COLUMNADDR)
    94.     self.write_command(0)
    95.     self.write_command(self.columns - 1)
    96.     self.write_command(PAGEADDR)
    97.     self.write_command(0)
    98.     self.write_command(self.pages - 1)
    99.     if self.offset == 1:
    100.       self.i2c.send(self.buffer, addr=self.devid, timeout=5000)
    101.     else:
    102.       self.dc.high()
    103.       self.spi.send(self.buffer)

    104.   def set_pixel(self, x, y, state):
    105.     index = x + (int(y / 8) * self.columns)
    106.     if state:
    107.       self.buffer[self.offset + index] |= (1 << (y & 7))
    108.     else:
    109.       self.buffer[self.offset + index] &= ~(1 << (y & 7))

    110.   def init_display(self):
    111.     chargepump = 0x10 if self.external_vcc else 0x14
    112.     precharge  = 0x22 if self.external_vcc else 0xf1
    113.     multiplex  = 0x1f if self.height == 32 else 0x3f
    114.     compins    = 0x02 if self.height == 32 else 0x12
    115.     contrast   = 0xff # 0x8f if self.height == 32 else (0x9f if self.external_vcc else 0x9f)
    116.     data = [DISPLAYOFF,
    117.             SETDISPLAYCLOCKDIV, 0x80,
    118.             SETMULTIPLEX, multiplex,
    119.             SETDISPLAYOFFSET, 0x00,
    120.             SETSTARTLINE | 0x00,
    121.             CHARGEPUMP, chargepump,
    122.             MEMORYMODE, 0x00,
    123.             SEGREMAP | 0x10,
    124.             COMSCANDEC,
    125.             SETCOMPINS, compins,
    126.             SETCONTRAST, contrast,
    127.             SETPRECHARGE, precharge,
    128.             SETVCOMDETECT, 0x40,
    129.             DISPLAYALLON_RESUME,
    130.             NORMALDISPLAY,
    131.             DISPLAYON]
    132.     for item in data:
    133.       self.write_command(item)
    134.     self.clear()
    135.     self.display()

    136.   def poweron(self):
    137.     if self.offset == 1:
    138.       pyb.delay(10)
    139.     else:
    140.       self.res.high()
    141.       pyb.delay(1)
    142.       self.res.low()
    143.       pyb.delay(10)
    144.       self.res.high()
    145.       pyb.delay(10)

    146.   def poweroff(self):
    147.     self.write_command(DISPLAYOFF)

    148.   def contrast(self, contrast):
    149.     self.write_command(SETCONTRAST)
    150.     self.write_command(contrast)

    151.   def draw_text(self, x, y, string, size=1, space=1):
    152.     def pixel_x(char_number, char_column, point_row):
    153.       char_offset = x + char_number * size * font.cols + space * char_number
    154.       pixel_offset = char_offset + char_column * size + point_row
    155.       return self.columns - pixel_offset

    156.     def pixel_y(char_row, point_column):
    157.       char_offset = y + char_row * size
    158.       return char_offset + point_column

    159.     def pixel_mask(char, char_column, char_row):
    160.       char_index_offset = ord(char) * font.cols
    161.       return font.bytes[char_index_offset + char_column] >> char_row & 0x1

    162.     pixels = (
    163.       (pixel_x(char_number, char_column, point_row),
    164.        pixel_y(char_row, point_column),
    165.        pixel_mask(char, char_column, char_row))
    166.       for char_number, char in enumerate(string)
    167.       for char_column in range(font.cols)
    168.       for char_row in range(font.rows)
    169.       for point_column in range(size)
    170.       for point_row in range(1, size + 1))

    171.     for pixel in pixels:
    172.       self.set_pixel(*pixel)
    复制代码
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-25 02:20 , Processed in 0.111296 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.