Февраль 2017 г.
Дисплей подключен при помощи программного i2c (SCL → B10, SDA → B11).
Частота SCL задана 330 кГц.
Если уменьшить задержку I2CSWM_DELAY с 6 до 4, SCL возрастёт до 500 кГц.
Дисплей, в соответствии с дадашитом, держит до 400 кГц.
#include "stdio.h" #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "Display_SSD1306_I2C.c" /* Определения из файла Display_SSD1306_I2C.c (для справки) #define I2C_PORT GPIOB #define I2C_SCL_PIN 10 #define I2C_SDA_PIN 11 volatile uint8_t sMessage[16] = {0}; volatile uint8_t SSD1306_Buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8] = {0}; */ int main(void) { int16_t i = 0; // Включаем тактирование шины B RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); Delay(10); // Ждём пока включится дисплей I2C_Init(); // И инициализируем его for(i=0; i<1024; i++) *(SSD1306_Buffer + i) = 0; // Очистка буфера экрана // Координаты отсчитываются от левого верхнего угла sprintf((char *)sMessage, "123456789012"); PutString(0, 0, sMessage, 1); // Параметры: X, Y, строка, цвет (1 - белый, 0 - чёрный) DrawLine(6, 22, 20, 36, 1); // Параметры: X1, Y1, X2, Y2, цвет (0/1) DrawLine(20, 36, 34, 22, 1); DrawLine(20, 36, 20, 60, 1); DrawCircle(64, 42, 20, 1); // X, Y, R, цвет (0/1) SetPixel(64, 42, 1); // Параметры: X, Y, цвет (0/1) UpdateScreen(); // Переносим рисунок из буфера в дисплей Delay(900); for(i=0; i<1024; i++) *(SSD1306_Buffer + i) = 0; // Очистка буфера экрана UpdateScreen(); while(1) { ScreenSaver(); // Скринсейвер в стиле DOS } }
Среда разработки: КуКокс. (www.coocox.org/software/coide.php)
Если у вас есть комментарий по существу — присылайте.