在介绍0.91寸 SSD1306之前先附上模块链接:点击购买SSD1306 OLED显示模块
前面的文章已经详细说明了OLED的原理,指令,代码
0.91寸 SSD1306 OLED介绍(一) — 整体介绍/IIC时序介绍
0.91寸 SSD1306 OLED介绍(二) — 命令介绍
0.91寸 SSD1306 OLED介绍(三) — 代码介绍

本文章我们通过上位机来验证下OLED驱动。

1. OLED驱动更上位机通信格式

目前上位机跟开发板是通过串口来通信,通信格式是json,如果你没听过json,那么自行百度,跟OLED相关的json格式分别如下:

包含:OLED显示,OLED清除,OLED对比度,OLED整体显示,OLED不整体显示,OLED反向显示,OLED正常显示,OLED水平滚动设置,OLED垂直滚动设置,OLED开始滚动,OLED结束滚动。
发送格式示例如下(以OLED清除为例):

{"FUNC":"HW","OPERATE":"OLED_CLEAR","PARAM1":null,"PARAM2":null,"PARAM3":null,"PARAM4":null,"PARAM5":null,"PARAM6":null}

1)上位机json发送代码:

上位机用的c# winform,用的json库using Newtonsoft.Json,此库需要Newtonsoft.Json.dll库
发送代码如下:

private void json_construction_send(string func,string operate,string param1,string param2,string param3,string param4,string param5,string param6)
{json_commmand cmd = new json_commmand();cmd.FUNC = func;cmd.OPERATE = operate;cmd.PARAM1 = param1;cmd.PARAM2 = param2;cmd.PARAM3 = param3;cmd.PARAM4 = param4;cmd.PARAM5 = param5;cmd.PARAM6 = param6;string json_cmd = JsonConvert.SerializeObject(cmd);
#if  CONSOLE_DEBUGConsole.WriteLine(json_cmd);
#endifif (serialPort1.IsOpen){serialPort1.WriteLine(json_cmd);}
}

其中OLED的operate字符串包括:

string operate_oled_show = "OLED_SHOW";
string operate_oled_clear = "OLED_CLEAR";
string operate_oled_normal_display = "OLED_NORMAL_DISPLAY";
string operate_oled_unnormal_display = "OLED_INVERSE_DISPLAY";
string operate_oled_entry_ram = "OLED_ENTRY_RAM";
string operate_oled_entry_noram = "OLED_ENTRY_NORAM";
string operate_oled_contrast = "OLED_CONTRAST";
string operate_oled_hscroll_set = "OLED_H_SCROLL_SET";
string operate_oled_vscroll_set = "OLED_V_SCROLL_SET";
string operate_oled_scroll_start = "OLED_SCROLL_START";
string operate_oled_scroll_stop = "OLED_SCROLL_STOP";

2)单片机json接收解析代码

单片机用的json库是cJson,在github上可以找到,单片机接收解析代码框架如下:

uint8_t uart_receive_parse(uint8_t *shell_string)
{/* 解析Json字符串 */uint8_t result = HW_ERR_OK;cJSON* parse_json = cJSON_Parse((const char *)shell_string);uint8_t* func_value = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"FUNC"))->valuestring;uint8_t* operate_value = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"OPERATE"))->valuestring;uint8_t* para1 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM1"))->valuestring;uint8_t* para2 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM2"))->valuestring;uint8_t* para3 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM3"))->valuestring;uint8_t* para4 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM4"))->valuestring;uint8_t* para5 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM5"))->valuestring;uint8_t* para6 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM6"))->valuestring;if(hw_strcmp((const char *)func_value,"HW") == 0){if(hw_strcmp((const char *)operate_value,"OLED_SHOW") == 0){/* OLED显示 */goto exit;}if(hw_strcmp((const char *)operate_value,"OLED_CLEAR") == 0){/* OLED清除 */goto exit;}if(hw_strcmp((const char *)operate_value,"OLED_CONTRAST") == 0){/* 设置OLED对比度 */goto exit;}if(hw_strcmp((const char *)operate_value,"OLED_ENTRY_RAM") == 0){/* OLED整体显示 */goto exit;}if(hw_strcmp((const char *)operate_value,"OLED_ENTRY_NORAM") == 0){/* OLED不整体显示 */goto exit;}if(hw_strcmp((const char *)operate_value,"OLED_NORMAL_DISPLAY") == 0){/* OLED正常显示 */goto exit;}if(hw_strcmp((const char *)operate_value,"OLED_INVERSE_DISPLAY") == 0){/* OLED反向显示 */goto exit;}if(hw_strcmp((const char *)operate_value,"OLED_H_SCROLL_SET") == 0){/* OLED水平滚动设置 */goto exit;}if(hw_strcmp((const char *)operate_value,"OLED_V_SCROLL_SET") == 0){/* OLED垂直滚动设置 */goto exit;}if(hw_strcmp((const char *)operate_value,"OLED_SCROLL_START") == 0){/* OLED开始滚动 */goto exit;}if(hw_strcmp((const char *)operate_value,"OLED_SCROLL_STOP") == 0){/* OLED停止滚动 */goto exit;}result = HW_ERR_SHELL_NO_CMD;}/* 解析非json字符串 */if(hw_strcmp((const char *)shell_string,"shop220811498.taobao.com") == 0)HW_DEBUG("welcome to use our stm32f1 camera wifi board\n");elseHW_DEBUG("UART PARSE ERR:HW_ERR_SHELL_NO_CMD\n");result = HW_ERR_SHELL_NO_CMD;
exit:cJSON_Delete(parse_json);return result;
}

2.上位机图片


整个上位机是硬件测试例程的上位机,包括LED,OLED,SPI FLASH,摄像头,但是本文章只是拿OLED做说明,整个上位机包括:
①串口配置区->包括串口打开,关闭,包括热插拔的检测
②功能测试区->包括LED,SPI,OLED,摄像头,贴图仅仅是OLED的测试
③串口调试区->包括可以接收开发板打印的log以及发送自定义的字符串给开发板

3.上位机跟驱动交互代码

1)OLED显示


上位机代码如下:

private void b_oled_show_Click(object sender, EventArgs e)
{int oled_col = c_oled_col.SelectedIndex;int oled_page = c_oled_page.SelectedIndex;int oled_format = c_oled_format.SelectedIndex;if (t_oled_string.Text == ""){MessageBox.Show("输入要显示的字符串", "错误提示");return;}string oled_show = t_oled_string.Text;json_construction_send(hw_func, operate_oled_show, oled_col.ToString(), oled_page.ToString(), oled_format.ToString(), oled_show.Length.ToString(), oled_show, null);
}

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_SHOW") == 0)
{uint8_t col,page,format,string_len;uint8_t show_string[32] = {0};HW_DEBUG("UART PARSE DEBUG:operate OLED_SHOW\n");col = atoi((const char*)para1);page = atoi((const char*)para2);format = atoi((const char*)para3);string_len = atoi((const char*)para4);hw_memcpy(show_string,(const char*)para5,string_len);hw_oled_show_string(col,page,show_string,format == 0?8:16);goto exit;
}

2)OLED清除


上位机代码如下:

private void b_oled_clear_Click(object sender, EventArgs e)
{json_construction_send(hw_func, operate_oled_clear, null, null, null, null, null, null);
}

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_CLEAR") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate OLED_CLEAR\n");hw_oled_clear();goto exit;
}

3)OLED对比度


上位机代码如下:

private void b_oled_contrast_Click(object sender, EventArgs e)
{json_construction_send(hw_func, operate_oled_contrast, c_oled_contrast.SelectedItem.ToString(), null, null, null, null, null);
}

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_CONTRAST") == 0)
{uint8_t contrast_value;HW_DEBUG("UART PARSE DEBUG:operate OLED_CONTRAST\n");contrast_value = atoi((const char*)para1);hw_oled_set_contrast(contrast_value);goto exit;
}

4)OLED整体显示


上位机代码如下:

private void b_oled_entry_ram_Click(object sender, EventArgs e)
{json_construction_send(hw_func, operate_oled_entry_ram, null, null, null, null, null, null);
}

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_ENTRY_RAM") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate OLED_ENTRY_RAM\n");hw_oled_entry_display_with_ram();goto exit;
}

5)OLED不整体显示


上位机代码如下:

private void b_oled_entry_noram_Click(object sender, EventArgs e)
{json_construction_send(hw_func, operate_oled_entry_noram, null, null, null, null, null, null);
}

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_ENTRY_NORAM") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate OLED_ENTRY_NORAM\n");hw_oled_entry_display_without_ram();goto exit;
}

6)OLED反向显示


上位机代码如下:

private void b_oled_unnormal_display_Click(object sender, EventArgs e)
{json_construction_send(hw_func, operate_oled_unnormal_display, null, null, null, null, null, null);
}

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_INVERSE_DISPLAY") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate OLED_INVERSE_DISPLAY\n");hw_oled_set_inverse_display();goto exit;
}

7)OLED正常显示


上位机代码如下:

private void b_oled_normal_display_Click(object sender, EventArgs e)
{json_construction_send(hw_func, operate_oled_normal_display, null, null, null, null, null, null);
}

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_NORMAL_DISPLAY") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate OLED_NORMAL_DISPLAY\n");hw_oled_set_normal_display();goto exit;
}

8)OLED水平滚动设置


上位机代码如下:

private void bh_scroll_set_Click(object sender, EventArgs e)
{string h_scroll_start_page = ch_start_page.SelectedIndex.ToString();string h_scroll_stop_page = ch_stop_page.SelectedIndex.ToString();string h_scroll_dir = ch_direct.SelectedIndex.ToString();int h_scroll_inteval = ch_inteval.SelectedIndex;int inteval = 0;if (h_scroll_inteval == 0)inteval = 7;if (h_scroll_inteval == 1)inteval = 4;if (h_scroll_inteval == 1)inteval = 4;if (h_scroll_inteval == 2)inteval = 5;if (h_scroll_inteval == 3)inteval = 0;if (h_scroll_inteval == 4)inteval = 6;if (h_scroll_inteval == 5)inteval = 1;if (h_scroll_inteval == 6)inteval = 2;if (h_scroll_inteval == 7)inteval = 3;json_construction_send(hw_func, operate_oled_hscroll_set, h_scroll_start_page, h_scroll_stop_page, h_scroll_dir, inteval.ToString(), null, null);       }

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_H_SCROLL_SET") == 0)
{uint8_t start_page,stop_page,dir,interval;HW_DEBUG("UART PARSE DEBUG:operate OLED_H_SCROLL_SET\n");start_page = atoi((const char*)para1);stop_page = atoi((const char*)para2);dir = atoi((const char*)para3);interval = atoi((const char*)para4);hw_oled_set_horizontal_scroll(dir,start_page,stop_page,interval);goto exit;
}

9)OLED垂直滚动设置


上位机代码如下:

private void bv_scroll_set_Click(object sender, EventArgs e)
{string v_scroll_start_page = cv_start_page.SelectedIndex.ToString();string v_scroll_stop_page = cv_stop_page.SelectedIndex.ToString();int v_scroll_dir = cv_direct.SelectedIndex;int scroll_dir = 1;if (v_scroll_dir == 0)scroll_dir = 2;if (v_scroll_dir == 1)scroll_dir = 1;int v_scroll_inteval = cv_inteval.SelectedIndex;string v_scroll_offset = cv_offset.SelectedIndex.ToString();int inteval = 0;if (v_scroll_inteval == 0)inteval = 7;if (v_scroll_inteval == 1)inteval = 4;if (v_scroll_inteval == 1)inteval = 4;if (v_scroll_inteval == 2)inteval = 5;if (v_scroll_inteval == 3)inteval = 0;if (v_scroll_inteval == 4)inteval = 6;if (v_scroll_inteval == 5)inteval = 1;if (v_scroll_inteval == 6)inteval = 2;if (v_scroll_inteval == 7)inteval = 3;json_construction_send(hw_func, operate_oled_vscroll_set, v_scroll_start_page, v_scroll_stop_page, scroll_dir.ToString(), inteval.ToString(), v_scroll_offset, null);       }

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_V_SCROLL_SET") == 0)
{uint8_t start_page,stop_page,dir,interval,offset;HW_DEBUG("UART PARSE DEBUG:operate OLED_V_SCROLL_SET\n");start_page = atoi((const char*)para1);stop_page = atoi((const char*)para2);dir = atoi((const char*)para3);interval = atoi((const char*)para4);offset = atoi((const char*)para5);hw_oled_set_vertical_scroll(dir,start_page,stop_page,interval,offset);goto exit;
}

10)OLED开始滚动


上位机代码如下:

private void bh_scroll_start_Click(object sender, EventArgs e)
{json_construction_send(hw_func, operate_oled_scroll_start, null, null, null, null, null, null);
}

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_SCROLL_START") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate OLED_SCROLL_START\n");hw_oled_scroll_active();goto exit;
}

11)OLED结束滚动


上位机代码如下:

private void bh_sroll_stop_Click(object sender, EventArgs e)
{json_construction_send(hw_func, operate_oled_scroll_stop, null, null, null, null, null, null);
}

单片机代码如下:

if(hw_strcmp((const char *)operate_value,"OLED_SCROLL_STOP") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate OLED_SCROLL_START\n");hw_oled_scroll_deactive();goto exit;
}

OK,就介绍到这里,后续会整理OLED SSD1306资料,发一篇博客
主要包括:
1)OLED驱动源码
2)OLED上位机
3)OLED资料

0.91寸 SSD1306 OLED介绍(四) --- 用上位机验证OLED显示屏相关推荐

  1. 0.91寸 SSD1306 OLED介绍(二) --- 命令介绍

    在介绍0.91寸 SSD1306之前先附上模块链接:点击购买SSD1306 OLED显示模块 寄存器设置介绍 其实要驱动一颗IC,说白了即使根据寄存器来通过特定的硬件协议来发送特定的数据就OK了,SS ...

  2. 0.91寸 SSD1306 OLED介绍(一) --- 整体介绍/IIC时序介绍

    在介绍0.91寸 SSD1306之前先附上模块链接:点击购买SSD1306 OLED显示模块 1. SSD1306 OLED介绍 OLED,即有机发光二极管(Organic Light-Emittin ...

  3. STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片)

    STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片) 基于SSD1306驱动芯片的OLED模块有多种型号,有0.91英寸,0.96英寸等等.OLED采用单色显示方 ...

  4. 物联网开发笔记(85)- 使用Micropython开发ESP32开发板之通过I2C控制0.91寸OLED液晶屏

    一.目的 这一节我们学习如何使用我们的ESP32开发板来学习通过I2C控制0.91寸OLED液晶屏. 二.环境 ESP32 + Thonny + 0.91寸 OLED显示液晶屏模块 + 几根杜邦线 + ...

  5. 【雕爷学编程】Arduino动手做(136)---0.91寸OLED液晶屏模块

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  6. esp8266加0.91寸oled显示屏制作天气时钟

    前言 上两周做了个客制化键盘,将esp8266改在键盘里面了显示始终天气等信息,演示视频看我B站视频:200块改的键盘,没错,你是来听歌的,五分钟剪的视频. 键盘制作教程在最后的参考资料里,自行查看. ...

  7. OV7670 FIFO 30W摄像头介绍(四) --- OV7670上位机验证驱动

    在介绍OV7670之前先附上模块链接:点击购买OV7670摄像头模块 介绍代码前,首先来看之前写的文章: OV7670 FIFO 30W摄像头介绍(一) - 整体介绍/SCCB时序 OV7670 FI ...

  8. 0.91寸oled(128x32)的滚动显示问题

    我想用0.91oled做个流水屏,源码中没有32x32的汉字显示,我修改了一下,就能显示32x32的汉字了,代码如下: void OLED_ShowCHinese32(u8 x,u8 y,u8 no) ...

  9. FPGA驱动0.96寸OLED(SSD1306)

    目录 一.七针0.96寸OLED驱动原理 二.SSD1306驱动时序 1.GDDRAM内部结构: (1)页寻址 (2)水平寻址 (3)垂直寻址 2.初始化 3.清屏 4.发送数据 三.子模块源码 1. ...

最新文章

  1. gridcontrol值为0时设置为空_XASSET 4.0入门指南
  2. android 36 线程通信
  3. Hive Lateral View、视图、索引
  4. TabLayout实现顶部导航栏(1)
  5. android小细节
  6. 远程连接windows系统提示:其他用户要远程登录,需要通过远程桌面服务进行登录的权限......
  7. 【渝粤教育】国家开放大学2018年春季 0234-22T公务员制度讲座 参考试题
  8. 合格PLC电气工程师需要会什么?
  9. win10电脑突然黑屏 亮屏后出现d-sub是什么意思?
  10. js双击事件屏蔽单击事件
  11. Web2.0浪潮下的广播电视业
  12. Unity3d FPS射击游戏案例 - 消灭病毒
  13. VMware Workstation 15 Player 社区版安装教程
  14. 乐符识别matlab,GitHub - Nuullll/music-synthesizer: Homework No.1 for summer course: MATLAB
  15. 场曲 zemax示例(概念、校正)
  16. 2021-06-21 12点 程序外生活 - 中国A50指数 机器预测学习跟踪记录 - 周六反弹失败,等待跌完,继续等待4小时第一个底分型出现。周月线持续跌势。
  17. 宝塔环境PHP网站要配置HTTPS,SSL证书如何申请
  18. linux安装mysql图解,linux中怎么安装mysql5.6.12版本图解
  19. Python实现电话号码的数字组合
  20. XTM计算机辅助翻译,计算机辅助翻译原理与实践

热门文章

  1. 苹果5越狱教程_苹果新越狱工具发布,支持iOS 13最新版,详细安装教程看这里...
  2. matlab绕线式三级串阻,三相绕线式异步电动机转子串电阻起动的MATLAB仿真
  3. 上位机串口数据检验方式(二)——奇偶校验
  4. python3 最基础
  5. Vagrant + VMBox 踩坑记录
  6. python批量图片文字识别_利用Python批量进行图片文字识别
  7. 说说远程团队协作的故事
  8. 科技的成就(二十七)
  9. 关于使用Kmeans函数RuntimeWarning: Explicit initial center position passed: performing only one init in KMe
  10. H5编辑器H5-Dooring2.30更新指南