Lập trình STM32 với Oled LCD SSD1306

stm32 lcd ssd1306

Màn hình Oled LCD SSD1306 được sử dụng rất nhiều trong các ứng dụng nhúng. Hiển thị đẹp mắt, tiết kiệm năng lượng và hỗ trợ chuẩn kết nối I2C rất phù hợp với những ứng dụng nhỏ.

Bài này nằm trong Serie Học STM32 từ A tới Z

Màn hình Oled là gì?

Màn hình OLED (Organic Light Emitting Diodes) được biết đến là một loại diode phát sáng (LED). Sử dụng một lớp phát xạ điện quang (màng thuốc hoặc film), với vật liệu bán dẫn, nó cho phép màn hình phát sáng khi có dòng điện chạy qua.

man hinh oled

Cấu tạo của màn hình OLED

Về cơ bản, một màn hình OLED sẽ bao gồm 4 thành phần chính sau:

Tấm nền

Được chế tạo bằng thủy tinh hay nhựa, có chức năng chống đỡ cho các bộ phận khác của OLED.

Anode

Tạo ra những khoảng trống để chứa điện tích dương khi dòng điện xuất hiện.

Cathode

Trái ngược với Anode, Cathode sẽ chịu trách nghiệm tạo ra các điện tích âm hay electron nếu có dòng điện đi qua.

Lớp dẫn hữu cơ

Bao gồm hai thành phần chính với chức năng riêng biệt:Lớp dẫn: Cấu tạo từ các phân tử hữu cơ dẻo để giúp vận chuyển các chỗ trống từ Anode.Lớp phát sáng : Electron từ Cathode sẽ được truyền tải thông qua lớp này.

Thông số cơ bản về LCD Oled SSD1306

Màn hình OLED SSD1306 với kích thước 0.96 inch, cho khả năng hiển thị hình ảnh tốt với khung hình 128×64 pixel. Ngoài ra, màn hình còn tương thích với hầu hết các vi điều khiển hiện nay thông qua giao tiếp I2C. Màn hình sử dụng driver SSD1306 cùng thiết kế nhỏ gọn sẽ giúp bạn phát triển các sản phẩm DIY hoặc các ứng dụng khác một cách nhanh chóng.

Lưu ý: Trên thị trường có loại LCD sh1106 tương đối giống ssd1306 về hình thức. Nhưng độ phân giải là 132×64 và có một số tập lệnh khác ssd1306 nên các bạn lưu ý khi mua nhé.

oled lcd ssd1306

Thông số kĩ thuật

  • Driver: SSD1306
  • Tương thích với Arduino, 51 Series, MSP430 Series, STM32 / 2, CSR IC,…
  • Tiêu thụ điện năng thấp: 0.08W (fullscreen)
  • Có thể điều chỉnh độ sáng và độ tương phản
  • Chuẩn giao tiếp: I2C (thông qua 2 chân SCL, SDA)
  • Điện áp hoạt động: 3V-5V DC
  • Nhiệt đô hoạt động: -30℃-70℃
  • Kích thước màn hình: 0.96 inch (128×64 pixel)
  • Kích thước module: 26.70* 19.26* 1.85mm (1.030.760.07 inch)

Trong bài viết này chúng ta có module Oled SSD1306 sử dụng giao thức I2C để giao tiếp với STM32

Cách điều khiển LCD Oled SSD1306

Sơ đồ khối

ssd1306

Các giao thức điều khiển

Để chuẩn bị cho việc sử dụng LCD Oled SSD1306, cần download datasheet của nó về tại: https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf

Giao thức điều khiển của SSD1306 bao gồm 8 chân dữ liệu D0-D7 và 4 chân điều khiển: RES, CS, DC, RD, WR.

Có 5 giao thức điều khiển ssd1306 được quy định bởi các biu BS[0:2]. Lần lượt là:

  • Giao thức parallel 8 bit: 8080
  • Giao thức parallel 8 bit: 6800
  • Giao thức SPI 3 dây:
  • Giao thức SPI 4 dây
  • Giao thức I2C

ssd1306 interface

Trong bài này mình chỉ đề cập tới giao thức I2C, các giao thức khác các bạn thao khảo trong datasheet nhé.

Giao thức I2C điều khiển ssd1306

Trong giao thức này chân D2 sẽ là SDA out, D1 là SDA in, D0 làSCL. Nếu các bạn chỉ ghi vào LCD thì chỉ cần sử dụng chân SDA in và SCL là đủ. Các chân I2C này bắt buộc sẽ phải có trở kéo lên vcc theo đúng chuẩn I2C.

Khi truyền địa chỉ để giao tiếp I2C chúng ta sẽ truyền 1 byte như sau:

b7 b6 b5 b4 b3 b2 b1    b0

0   1   1   1   1   0   SA0 R/W#

Chân SA0 sẽ định dịa chỉ cho SSD1306 vì vậy chúng ta có thể giao tiếp với 2 Oled LCD trên cùng 1 bus I2C.

Bit b0 sẽ quy định việc đọc hoặc ghi vào LCD.

ssd1306 i2c data

 

Các bước giao tiếp như sau:

  1. Điều kiện bắt đầu được thiết lập bằng cách kéo SDA từ CAO đến THẤP trong khi SCL vẫn CAO
  2. Ngay sau đó Master sẽ gửi 8bit bao gồm 7 bit địa chỉ + 1 bit R/W để quy định việc đọc hoặc ghi LCD. Chế độ ghi bit R/W = 0
  3. Nếu SSD1306 nhận được đúng địa chỉ sẽ kéo SDA xuông 0 để trả lời. (bit ACK)
  4. Sau khi nhận ACK, master truyền 1 byte sau đó gồm bit Co và D/C + 6 bit 0. Trong đó nếu Co = 0 thì các bit sau đó chỉ chưa dữ liệu. Nếu bit D/C = 0 truyền lệnh cho lcd. Nếu D/C = 1 truyền dữ liệu cho GDDRAM (hiển thị ra màn hình). Ô nhớ của GDDRAM tự động tăng khi có dữ liệu.
  5. Bit ACK sẽ được tạo ra mỗi khi truyền xong 1 byte dữ liệu
  6. Cuối cùng điều kiện dừng được thiết lập bằng cách kéo “SDA in” từ THẤP đến CAO trong khi “SCL” vẫn ở mức CAO

Bảng sau đây sẽ định nghĩa điều kiện bắt đầu/kết thúc

i2c start stop

Nhìn chung phương thức giao tiếp của SSD1306 theo chuẩn I2C mà thôi, quan trọng là các bạn biết phải truyền gì vào trong đó.

Display RAM và cách hiển thị của ssd1306

Màn hình LCD oled SSD1306 có độ phân giải 128×64 dot. Đươc chia thành 8 Page Page0 – Page7.

Mỗi page lại được chia thành các Segment SEG0 – SEG127.

ssd1306 display ram

Khi bắt đầu ghi vào LCD, con trỏ sẽ ở SEG0 và PAGE0 ( nếu không có lệnh xoay lcd).

Mỗi khi một Byte được ghi vào GDDRAM con trỏ (Cursor) sẽ được tăng lên 1 đơn vị khi hết một Page con trỏ sẽ tự động nhảy xuống page phía dưới. Vậy nên phương pháp quét mặc định của LCD là từ Trên xuống dưới và từ trái qua phải.

ssd1306 ram cách phân bố

Các lệnh và khởi tạo oled ssd1306

Chi tiết về tập lệnh cho ssd1306 các bạn tham khảo mục 10 COMMAND DESCRIPTIONS trong datasheet nhé.

Để khởi tạo cho ssd1306 hoạt động, chúng ta follow theo flow chart sau:

ssd1306 khởi tạo

Lập trình STM32 điều khiển LCD ssd1306

Cấu hình trên cubemx

Trong cube chọn stm32f103c8, tab sys chọn debug serial wire. RCC chọn thạch anh ngoài và trong Clock các bạn để 72MHz tần số fmaster nhé.

Trong tab I2C enable lên.

ssd1306 cube

Sau đó gen code như các bài trước.

Download thư viện và lập trình

Sau khi Gen code chúng ta sẽ mở bằng Keil C. Để download thư viện các bạn hãy đọc bài viết: Hướng dẫn download thư viện STM32

Sau khi down về, các bạn chỉnh đường dẫn tới thư viện Device.

ssd1306 them duong dan

Trong project click chuột phải -> add file. Thêm các file ssd1306 chứa thư viện, fonts chứa bộ fonts cho lcd, và test chứa các hàm test cho LCD.

ssd1306 add thu vien

Thêm các thư viện vào main.c gồm:

  • Thư viện SSD1306
  • Font chữ cho lcd
  • File logo nike đã convert
  • Ảnh động 1 – 9.

ssd1306 them thu vien

Tạo một biến Struct SSD1306

ssd1306 2

Khởi tạo LCD SSD1306 với phương thức giao tiếp là I2C1

ssd1306 3

Hiển thị văn bản và các hình cơ bản trong LCD

Để vẽ các hình cơ bản chúng ta sử dụng các hàm đồ họa như: Drawline, Drawcircle, Drawretangle….

Để viết chữ chúng ta sử dụng hàm Puts và truyền vào Text, Loại font và Màu sắc

Lưu ý: Mỗi khi sử dụng hàm thì dữ liệu sẽ chỉ được ghi vào bộ nhớ đệm. Để hiển thị lên LCD chúng ta sử dụng hàm UpdateScreen nhé!

ssd1306 text and shape

Hiển thị ảnh với ssd1306

Tương tự với hiển thị ảnh chúng ta sử dụng hàm Drawbitmap. Truyền vào tọa độ bắt đầu, tọa độ kết thúc. mảng chứa dữ liệu bitmap và màu sắc.

ssd1306 bitmap

Hiển thị ảnh động GIF với ssd1306

Ảnh động thực ra là chuỗi các ảnh được hiển thị liên tục, chúng ta sẽ cho nó vào 1 vòng while với số lần lặp lại được quy định trong loop.

ssd1306 animation

Cách chuyển ảnh sang mảng để hiển thị

Download ảnh cần convert. Chỉnh lại kích thước theo đúng mong muốn bằng photoshop. Chúng ta có thể dùng công cụ Image size (phóng to thu nhỏ theo kích thước) và Canvas Size( Thêm hoặc cắt ảnh theo kích thước)

Screenshot 2

Screenshot 3

Download công cụ Image2LCD tại đây: https://www.fshare.vn/file/Q8NDJBO9ZU2F

Mở phần mềm.

  1. Nhấn open mở ảnh vừa chỉnh trong photoshop
  2. Chọn các tùy chọn như hình gồm:  kiểu quét, chế độ màu, độ phân giải, các tùy chọn khác
  3. Nhấn Save sau đó save thành file .h nhớ trỏ vào trong thư mục Inc trong project của bạn nhé.

image2lcd

Trong main.c thêm #include “Tên_File.h” rồi có thể sử dụng được rồi.

Đây là kết quả của mình.

Kết

Màn hình Oled LCD SSD1306 rất phù hợp dùng trong các ứng dụng nhỏ gọn, Độ phân giải và hiền thị của nó cũng tương đối ổn. Ngoài I2C ssd1306 còn có thể giao tiếp theo các phương thức khác, giúp cho tốc độ được nâng cao hơn rất nhiều.

Nếu thấy bài viết này hay, hãy chia sẻ tới những người bạn học hay đồng nghiệp của mình. Và nếu thắc mắc điều gì, hãy để lại bình luận nhé

Và cùng gia nhập những người nghiện lập trình tại đây nhé: Hội anh em nghiện lập trình

 

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *