驴友花雕
发表于 2022-6-8 09:52:18
糖醋花生 发表于 2022-6-8 08:46
我用的还是旧版的,哈哈哈
是IIC就行,还是喜欢IIC接口,简单些......
驴友花雕
发表于 2022-6-8 11:54:07
程序十一:显示“军舰”图片(1)打开Linkboy——左栏模块——功能扩展模块系列——图文显示功能扩展——图形显示器——编辑——单色图片编辑器
驴友花雕
发表于 2022-6-8 11:56:15
(2)打开单色图片编辑器,编辑图片像素
驴友花雕
发表于 2022-6-8 11:57:55
(3)实验开源仿真编程(Linkboy V4.63)
驴友花雕
发表于 2022-6-8 11:59:28
(4)实验场景图
驴友花雕
发表于 2022-6-8 12:02:16
程序十二:动态的数字(1)实验开源仿真编程(Linkboy V4.63)
驴友花雕
发表于 2022-6-8 12:03:38
(2)实验场景图
驴友花雕
发表于 2022-6-8 12:04:55
本帖最后由 驴友花雕 于 2022-6-9 06:09 编辑
程序十三:笑脸与哭脸的动画(1)打开Linkboy——左栏模块——功能扩展模块系列——图文显示功能扩展——图形显示器——编辑——单色图片编辑器编辑“笑脸”和“哭脸”(我这里使用图片导入,一次性完成)
驴友花雕
发表于 2022-6-8 12:06:55
驴友花雕
发表于 2022-6-8 12:08:25
(2)实验开源仿真编程(Linkboy V4.63)
驴友花雕
发表于 2022-6-8 12:09:27
(3)实验场景图
驴友花雕
发表于 2022-6-9 06:14:46
程序十四:显示各种文字(1)实验开源仿真编程(Linkboy V4.63)
驴友花雕
发表于 2022-6-9 06:17:11
(2)实验场景图
驴友花雕
发表于 2022-6-9 06:18:48
程序十五:动画示例中的雪花飘(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十五:动画示例中的雪花飘
Arduino------OLED屏
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>//导入驱动库
#define SCREEN_WIDTH 128 //设置OLED参数
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NUMFLAKES 10
#define LOGO_HEIGHT 16
#define LOGO_WIDTH 16
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000
};
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display();
delay(2000);
display.clearDisplay();
display.drawPixel(10, 10, WHITE);
display.display();
delay(2000);
testdrawline();
testdrawrect();
testfillrect();
testdrawcircle();
testfillcircle();
testdrawroundrect();
testfillroundrect();
testdrawtriangle();
testfilltriangle();
testdrawchar();
testdrawstyles();
testscrolltext();
testdrawbitmap();
display.invertDisplay(true);
delay(1000);
display.invertDisplay(false);
delay(1000);
testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT);
}
void loop() {
}
void testdrawline() {
int16_t i;
display.clearDisplay();
for (i = 0; i < display.width(); i += 4) {
display.drawLine(0, 0, i, display.height() - 1, WHITE);
display.display();
delay(1);
}
for (i = 0; i < display.height(); i += 4) {
display.drawLine(0, 0, display.width() - 1, i, WHITE);
display.display();
delay(1);
}
delay(250);
display.clearDisplay();
for (i = 0; i < display.width(); i += 4) {
display.drawLine(0, display.height() - 1, i, 0, WHITE);
display.display();
delay(1);
}
for (i = display.height() - 1; i >= 0; i -= 4) {
display.drawLine(0, display.height() - 1, display.width() - 1, i, WHITE);
display.display();
delay(1);
}
delay(250);
display.clearDisplay();
for (i = display.width() - 1; i >= 0; i -= 4) {
display.drawLine(display.width() - 1, display.height() - 1, i, 0, WHITE);
display.display();
delay(1);
}
for (i = display.height() - 1; i >= 0; i -= 4) {
display.drawLine(display.width() - 1, display.height() - 1, 0, i, WHITE);
display.display();
delay(1);
}
delay(250);
display.clearDisplay();
for (i = 0; i < display.height(); i += 4) {
display.drawLine(display.width() - 1, 0, 0, i, WHITE);
display.display();
delay(1);
}
for (i = 0; i < display.width(); i += 4) {
display.drawLine(display.width() - 1, 0, i, display.height() - 1, WHITE);
display.display();
delay(1);
}
delay(2000);
}
void testdrawrect(void) {
display.clearDisplay();
for (int16_t i = 0; i < display.height() / 2; i += 2) {
display.drawRect(i, i, display.width() - 2 * i, display.height() - 2 * i, WHITE);
display.display();
delay(1);
}
delay(2000);
}
void testfillrect(void) {
display.clearDisplay();
for (int16_t i = 0; i < display.height() / 2; i += 3) {
//使用了 INVERSE 颜色,因此矩形交替出现白色/黑色
display.fillRect(i, i, display.width() - i * 2, display.height() - i * 2, INVERSE);
display.display();
delay(1);
}
delay(2000);
}
void testdrawcircle(void) {
display.clearDisplay();
for (int16_t i = 0; i < max(display.width(), display.height()) / 2; i += 2) {
display.drawCircle(display.width() / 2, display.height() / 2, i, WHITE);
display.display();
delay(1);
}
delay(2000);
}
void testfillcircle(void) {
display.clearDisplay();
for (int16_t i = max(display.width(), display.height()) / 2; i > 0; i -= 3) {
display.fillCircle(display.width() / 2, display.height() / 2, i, INVERSE);
display.display();
delay(1);
}
delay(2000);
}
void testdrawroundrect(void) {
display.clearDisplay();
for (int16_t i = 0; i < display.height() / 2 - 2; i += 2) {
display.drawRoundRect(i, i, display.width() - 2 * i, display.height() - 2 * i,
display.height() / 4, WHITE);
display.display();
delay(1);
}
delay(2000);
}
void testfillroundrect(void) {
display.clearDisplay();
for (int16_t i = 0; i < display.height() / 2 - 2; i += 2) {
display.fillRoundRect(i, i, display.width() - 2 * i, display.height() - 2 * i,
display.height() / 4, INVERSE);
display.display();
delay(1);
}
delay(2000);
}
void testdrawtriangle(void) {
display.clearDisplay();
for (int16_t i = 0; i < max(display.width(), display.height()) / 2; i += 5) {
display.drawTriangle(
display.width() / 2, display.height() / 2 - i,
display.width() / 2 - i, display.height() / 2 + i,
display.width() / 2 + i, display.height() / 2 + i, WHITE);
display.display();
delay(1);
}
delay(2000);
}
void testfilltriangle(void) {
display.clearDisplay();
for (int16_t i = max(display.width(), display.height()) / 2; i > 0; i -= 5) {
display.fillTriangle(
display.width() / 2, display.height() / 2 - i,
display.width() / 2 - i, display.height() / 2 + i,
display.width() / 2 + i, display.height() / 2 + i, INVERSE);
display.display();
delay(1);
}
delay(2000);
}
void testdrawchar(void) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.cp437(true);
for (int16_t i = 0; i < 256; i++) {
if (i == '\n') display.write(' ');
else display.write(i);
}
display.display();
delay(2000);
}
void testdrawstyles(void) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(F("Hello, world!"));
display.setTextColor(BLACK, WHITE);
display.println(3.141592);
display.setTextSize(2);
display.setTextColor(WHITE);
display.print(F("0x")); display.println(0xDEADBEEF, HEX);
display.display();
delay(2000);
}
void testscrolltext(void) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(10, 0);
display.println(F("scroll"));
display.display();
delay(100);
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrolldiagright(0x00, 0x07);
delay(2000);
display.startscrolldiagleft(0x00, 0x07);
delay(2000);
display.stopscroll();
delay(1000);
}
void testdrawbitmap(void) {
display.clearDisplay();
display.drawBitmap(
(display.width()- LOGO_WIDTH ) / 2,
(display.height() - LOGO_HEIGHT) / 2,
logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
display.display();
delay(1000);
}
#define XPOS 0
#define YPOS 1
#define DELTAY 2
void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
int8_t f, icons;
for (f = 0; f < NUMFLAKES; f++) {
icons = random(1 - LOGO_WIDTH, display.width());
icons = -LOGO_HEIGHT;
icons = random(1, 6);
Serial.print(F("x: "));
Serial.print(icons, DEC);
Serial.print(F(" y: "));
Serial.print(icons, DEC);
Serial.print(F(" dy: "));
Serial.println(icons, DEC);
}
for (;;) {
display.clearDisplay();
for (f = 0; f < NUMFLAKES; f++) {
display.drawBitmap(icons, icons, bitmap, w, h, WHITE);
}
display.display();
delay(200);
for (f = 0; f < NUMFLAKES; f++) {
icons += icons;
if (icons >= display.height()) {
icons = random(1 - LOGO_WIDTH, display.width());
icons = -LOGO_HEIGHT;
icons = random(1, 6);
}
}
}
}
驴友花雕
发表于 2022-6-9 06:20:57
(2)实验场景图
驴友花雕
发表于 2022-6-9 06:22:15
驴友花雕
发表于 2022-6-9 06:23:48
程序十六:向右的二行字流动显示(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十六:向右的二行字流动显示
Arduino------OLED屏
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/
#include<FLOW.h>//导入驱动库
FLOW first;
String s = "Hello eagler8!";
String t = "I Love Arduino!";
void setup() {
first.Begin();//初始化
}
void loop() {
/*void FLOW::Now(int y,int k,String str,int judge);
这里为什么只要用y就行了呢?x没了?因为是滚动的,所以可以不要x,
只需要y。k指的是一个字符的大小,默认是8。str就是你的字符串啦,
而judge就是如果是最后一个显示的话,就填1,否则填0 */
first.Now(0, 8, s, 0); //设置字体字号
first.Now(10, 8, t, 1);
first.Clear(40);//调帧,可以将Clear的数值变一下,一般在20-200
}
驴友花雕
发表于 2022-6-9 06:25:29
(2)实验场景图
驴友花雕
发表于 2022-6-9 06:27:32
程序十七:杰森创工的文字与图片(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十七:杰森创工的文字与图片
Arduino------OLED屏
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 寬度像素
#define SCREEN_HEIGHT 64 // OLED 高度像素
// 設定OLED
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//自訂圖形,從Image2LCD轉過來的,尺寸是128x48,少掉的16個像素是上方黃色區塊(假設是用藍黃雙色的OLED)
//本範例為了在上方區塊顯示文字,所以圖形就沒有涵蓋整個高度
static const unsigned char PROGMEM logo_bmp[] =
{
0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFF, 0XFF, 0XF8, 0X7F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFE, 0XFF, 0XF8, 0X3F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFE, 0X1F, 0XFC, 0X7F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFC, 0X03, 0XFD, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XE4, 0X00, 0XFB, 0XFF, 0XFF, 0X83, 0X00, 0X18, 0X00, 0X60, 0X00, 0X38, 0X02, 0X00, 0X00, 0X00,
0XE4, 0X00, 0X1B, 0XFF, 0XFF, 0X83, 0X7E, 0X18, 0X3F, 0XFF, 0XC0, 0XFE, 0X03, 0X0F, 0XFF, 0XFC,
0XCC, 0X00, 0X03, 0XFF, 0XFF, 0X83, 0X7F, 0XFE, 0X7F, 0XFF, 0XC3, 0XC7, 0XB3, 0X0F, 0XFF, 0XFC,
0XC8, 0X7C, 0X00, 0XFF, 0XFF, 0X83, 0X46, 0XFC, 0X01, 0XF8, 0X07, 0XFE, 0XB3, 0X00, 0X0C, 0X00,
0XC8, 0XFE, 0X00, 0X1F, 0XFF, 0X86, 0XE6, 0XD8, 0X03, 0XFE, 0X00, 0XFE, 0X33, 0X00, 0X0C, 0X00,
0X99, 0XFF, 0X00, 0X07, 0XFF, 0X87, 0XF4, 0XD8, 0X1F, 0X67, 0X80, 0X00, 0X33, 0X00, 0X0C, 0X00,
0X91, 0XFF, 0X00, 0X00, 0XFF, 0X8E, 0X1C, 0XD8, 0X7C, 0X61, 0XE3, 0XFF, 0X33, 0X00, 0X0C, 0X00,
0X91, 0XFF, 0X00, 0X00, 0X1F, 0X8E, 0X1B, 0XFE, 0X64, 0X62, 0X23, 0XFF, 0XB3, 0X00, 0X0C, 0X00,
0XE1, 0XFF, 0X00, 0X00, 0X1F, 0X9E, 0X31, 0XFE, 0X0C, 0X26, 0X03, 0XFF, 0XB3, 0X00, 0X0C, 0X00,
0XE0, 0XFE, 0X01, 0X80, 0X1F, 0X9E, 0XE1, 0X18, 0X7F, 0X9F, 0XE3, 0XFF, 0XB3, 0X00, 0X0C, 0X00,
0XE0, 0X7C, 0X03, 0XE0, 0X3F, 0X86, 0X43, 0X08, 0XFF, 0X9F, 0XE3, 0X01, 0XB3, 0X00, 0X0C, 0X00,
0XC0, 0X38, 0X07, 0XE0, 0X3F, 0X86, 0XFF, 0XFC, 0X0C, 0X07, 0X03, 0XFF, 0XB3, 0X00, 0X0C, 0X00,
0XF0, 0X00, 0X07, 0XF0, 0X4F, 0X86, 0XFF, 0XFC, 0X1E, 0X0F, 0X03, 0XFF, 0X33, 0X00, 0X0C, 0X00,
0XFE, 0X00, 0X07, 0XE0, 0X4F, 0X86, 0X07, 0X80, 0X3F, 0X9F, 0X83, 0X00, 0X33, 0X00, 0X0C, 0X00,
0XC7, 0XC0, 0X07, 0XE0, 0X9F, 0X86, 0X0F, 0XC0, 0X3D, 0X9E, 0XC2, 0X7F, 0X33, 0X00, 0X0C, 0X00,
0X81, 0XF0, 0X03, 0XC0, 0X9F, 0X86, 0X3F, 0X70, 0X6C, 0X36, 0XE6, 0X7F, 0X83, 0X00, 0X0C, 0X00,
0X80, 0X3E, 0X00, 0X01, 0X9F, 0X86, 0XF3, 0X3C, 0XCC, 0X66, 0X66, 0X61, 0X83, 0X00, 0X0C, 0X00,
0XC0, 0X07, 0X80, 0X01, 0X3F, 0X86, 0XE3, 0X0C, 0X0C, 0X06, 0X06, 0X7F, 0X83, 0X1F, 0XFF, 0XFE,
0XF8, 0X01, 0XF0, 0X01, 0X31, 0X86, 0X03, 0X00, 0X0C, 0X06, 0X06, 0X7F, 0XBE, 0X1F, 0XFF, 0XFE,
0XBF, 0X00, 0X3E, 0X03, 0XF1, 0X86, 0X03, 0X00, 0X04, 0X02, 0X00, 0X41, 0X1C, 0X00, 0X00, 0X00,
0X8F, 0XC0, 0X0F, 0X83, 0XF1, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XCC, 0XE0, 0X01, 0XF7, 0XF3, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XCC, 0X1C, 0X00, 0X3F, 0XF1, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X8D, 0XC7, 0XC0, 0X0F, 0XF0, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X8E, 0X38, 0XF8, 0X0F, 0XF8, 0X83, 0X00, 0X00, 0X30, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X83, 0X8E, 0X1E, 0X0F, 0XFF, 0X82, 0X00, 0X00, 0X30, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X80, 0X71, 0XC7, 0XDF, 0XF3, 0X80, 0X00, 0X00, 0X30, 0X00, 0X00, 0X00, 0X00, 0X00, 0X30, 0X00,
0X80, 0X1C, 0X67, 0XFF, 0XF9, 0X83, 0X7D, 0XCF, 0X33, 0X39, 0XE0, 0XE3, 0X9F, 0X70, 0X7A, 0X26,
0X81, 0XE3, 0X8C, 0X7F, 0XC7, 0X83, 0X6E, 0XC9, 0XB6, 0X6D, 0XE1, 0X86, 0XDD, 0XD8, 0X33, 0X66,
0X81, 0XFC, 0XF8, 0X1F, 0X83, 0X83, 0X66, 0X61, 0XBC, 0X4D, 0X81, 0X0C, 0X59, 0X98, 0X33, 0X74,
0X80, 0XFE, 0X13, 0X1C, 0X47, 0X83, 0X66, 0X6F, 0XBC, 0XFD, 0X83, 0X0C, 0X79, 0X98, 0X33, 0X54,
0X80, 0X3E, 0X00, 0X24, 0X6F, 0X83, 0X66, 0X69, 0XB6, 0XC1, 0X81, 0X0C, 0X59, 0X98, 0X31, 0XDC,
0X83, 0X3E, 0X00, 0X64, 0X7F, 0X83, 0X66, 0X79, 0XB6, 0X61, 0X8D, 0X86, 0XD9, 0X9B, 0X31, 0X98,
0X83, 0X70, 0X00, 0X47, 0XFF, 0X83, 0X66, 0X6F, 0XB3, 0X39, 0X8C, 0XE3, 0X99, 0X9B, 0X19, 0X98,
0X87, 0XF0, 0X00, 0XC7, 0XFF, 0X83, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X87, 0XF0, 0X00, 0X8F, 0XFF, 0X86, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X81, 0XE0, 0X01, 0XFF, 0XFF, 0X84, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X80, 0X60, 0X03, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X80, 0X00, 0X03, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X80, 0X00, 0X67, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
};
void setup() {
Serial.begin(9600);
// 偵測是否安裝好OLED了
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 一般1306 OLED的位址都是0x3C
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
// 顯示Adafruit的LOGO,算是開機畫面
display.display();
delay(1000); // 停1秒
// 清除畫面
display.clearDisplay();
testdrawstyles(); // 測試文字
testdrawbitmap(); // 顯示圖形
}
void loop() {
}
void testdrawstyles(void) {
display.clearDisplay();
display.setTextSize(2); // 設定文字大小
display.setTextColor(1); // 1:OLED預設的顏色(這個會依該OLED的顏色來決定)
display.setCursor(0, 0); // 設定起始座標
display.print("Hello OLED"); // 要顯示的字串
display.display(); // 要有這行才會把文字顯示出來
delay(1000);
}
void testdrawbitmap(void) {
//display.clearDisplay();
//顯示圖形,x,y,圖形文字,寬,高,1:OLED預設的顏色(這個會依該OLED的顏色來決定)
display.drawBitmap(0, 16, logo_bmp, 128, 48, 1);
display.display();// 要有這行才會把文字顯示出來
delay(1000);
}
驴友花雕
发表于 2022-6-9 06:29:28
(2)实验场景图
驴友花雕
发表于 2022-6-9 06:30:47
程序十八:OLED屏显示时钟(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十八:OLED屏显示时钟
Arduino------OLED屏
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/
#include "ssd1306.h"
uint32_t lastMillis;
uint8_thours = 19;
uint8_tminutes = 22;
uint8_tseconds = 0;
void printSeconds() {
if (seconds & 1) {
ssd1306_printFixed(54,8, ":", STYLE_NORMAL);
}
else {
ssd1306_printFixed(54,8, " ", STYLE_NORMAL);
}
}
void printMinutes() {
char minutesStr = "00";
minutesStr = '0' + minutes / 10;
minutesStr = '0' + minutes % 10;
ssd1306_printFixed(78,8, minutesStr, STYLE_NORMAL);
}
void printHours() {
char hoursStr = "00";
hoursStr = '0' + hours / 10;
hoursStr = '0' + hours % 10;
ssd1306_printFixed(6,8, hoursStr, STYLE_NORMAL);
}
void setup() {
//如果您需要使用 128x32 显示,请将下面的行替
//ssd1306_128x32_i2c_init()
ssd1306_128x64_i2c_init();
ssd1306_fillScreen(0x00);
ssd1306_setFixedFont(comic_sans_font24x32_123);
lastMillis = millis();
printHours();
printMinutes();
}
void loop() {
if ((uint32_t)(millis() - lastMillis) >= 1000) {
lastMillis += 1000;
if (++seconds > 59)
{
seconds = 0;
if (++minutes > 59)
{
minutes = 0;
if (++hours > 23)
{
hours = 0;
}
printHours();
}
printMinutes();
}
printSeconds();
}
}