久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9989|回復: 0
收起左側

MicroPython-ESP8266開發板控制OLED液晶顯示屏教程實例附代碼

[復制鏈接]
ID:130183 發表于 2017-6-5 15:11 | 顯示全部樓層 |閱讀模式
  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)
復制代碼


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线 | 国产精品久久久久国产a级 欧美日韩国产免费 | 在线视频 亚洲 | 国产精品久久久久久久久久久新郎 | 天天干天天操天天射 | 久久久精品影院 | 国产精品福利视频 | 亚洲欧美中文日韩在线v日本 | 草草精品 | 精品一区二区三区91 | 日韩精品在线看 | 国产一区二区激情视频 | 一区二区三区视频在线观看 | 国产精品一区二区在线免费观看 | 99久久婷婷国产综合精品电影 | 三级免费 | 在线观看国产三级 | 天天干天天想 | 久久久人成影片免费观看 | 精品国产乱码久久久久久老虎 | 金莲网 | 国产成人99久久亚洲综合精品 | 国产不卡一区在线观看 | 日韩欧美第一页 | 精品国产31久久久久久 | 成人精品一区 | 麻豆久久久久 | 天天曰夜夜操 | 精品伊人 | 福利视频网站 | 成人h片在线观看 | 欧美亚洲网站 | 欧美亚洲一级 | 黄网站在线播放 | 欧美日韩国产一区二区三区 | 欧美视频在线播放 | 久久久久香蕉视频 | 97精品超碰一区二区三区 | 中文字幕亚洲精品 | 国产精品视频导航 | 欧美日本在线观看 |