找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5|回复: 0
打印 上一主题 下一主题
收起左侧

STM32单片机蓝牙控制oled绘制程序

[复制链接]
跳转到指定楼层
楼主
ID:772183 发表于 2026-6-26 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "stm32f10x.h"
  2. #include "Delay.h"
  3. #include "OLED.h"     
  4. #include "Serial.h"  
  5. #include "LD110.h"   
  6. #include "stdlib.h"
  7. #include "string.h"

  8. int main(void)
  9. {
  10.     Delay_ms(100);
  11.     OLED_Init();     
  12.     Serial_Init();   
  13.     LD110_Init();     
  14.     LD110_Stop();
  15.    
  16.     // OLED初始化:清屏并显示欢迎信息
  17.     OLED_Clear();
  18.     OLED_ShowString(0, 0, "Bluetooth Draw", 16, 1);
  19.     OLED_ShowString(0, 20, "Ready:", 16, 1);
  20.     OLED_Refresh();
  21.    
  22.     while (1)
  23.     {
  24.         if (Serial_RxFlag == 1)
  25.         {
  26.             // 解析命令
  27.             if (strncmp(Serial_RxPacket, "dot=", 4) == 0)
  28.             {
  29.                 // dot=x,y
  30.                 int x, y;
  31.                 sscanf(Serial_RxPacket + 4, "%d,%d", &x, &y);
  32.                 if (x >= 0 && x < 128 && y >= 0 && y < 64)
  33.                 {
  34.                     OLED_DrawPoint(x, y, 1);
  35.                     OLED_Refresh();
  36.                     Serial_SendString("OK:dot\r\n");
  37.                 }
  38.                 else
  39.                 {
  40.                     Serial_SendString("ERR:out of range\r\n");
  41.                 }
  42.             }
  43.             else if (strncmp(Serial_RxPacket, "line=", 5) == 0)
  44.             {
  45.                 // line=x1,y1,x2,y2
  46.                 int x1, y1, x2, y2;
  47.                 sscanf(Serial_RxPacket + 5, "%d,%d,%d,%d", &x1, &y1, &x2, &y2);
  48.                 if ((x1 >= 0 && x1 < 128 && y1 >= 0 && y1 < 64) &&
  49.                     (x2 >= 0 && x2 < 128 && y2 >= 0 && y2 < 64))
  50.                 {
  51.                     OLED_DrawLine(x1, y1, x2, y2, 1);
  52.                     OLED_Refresh();
  53.                     Serial_SendString("OK:line\r\n");
  54.                 }
  55.                 else
  56.                 {
  57.                     Serial_SendString("ERR:out of range\r\n");
  58.                 }
  59.             }
  60.             else if (strncmp(Serial_RxPacket, "rect=", 5) == 0)
  61.             {
  62.                 // rect=x,y,w,h
  63.                 int x, y, w, h;
  64.                 sscanf(Serial_RxPacket + 5, "%d,%d,%d,%d", &x, &y, &w, &h);
  65.                 if (x >= 0 && x < 128 && y >= 0 && y < 64 &&
  66.                     (x + w) <= 128 && (y + h) <= 64)
  67.                 {
  68.                     // 画矩形:四条边
  69.                     OLED_DrawLine(x, y, x + w - 1, y, 1);
  70.                     OLED_DrawLine(x, y, x, y + h - 1, 1);
  71.                     OLED_DrawLine(x + w - 1, y, x + w - 1, y + h - 1, 1);
  72.                     OLED_DrawLine(x, y + h - 1, x + w - 1, y + h - 1, 1);
  73.                     OLED_Refresh();
  74.                     Serial_SendString("OK:rect\r\n");
  75.                 }
  76.                 else
  77.                 {
  78.                     Serial_SendString("ERR:out of range\r\n");
  79.                 }
  80.             }
  81.             else if (strncmp(Serial_RxPacket, "circle=", 7) == 0)
  82.             {
  83.                 // circle=x,y,r
  84.                 int x, y, r;
  85.                 sscanf(Serial_RxPacket + 7, "%d,%d,%d", &x, &y, &r);
  86.                 if (x >= r && x + r < 128 && y >= r && y + r < 64)
  87.                 {
  88.                     OLED_DrawCircle(x, y, r);
  89.                     OLED_Refresh();
  90.                     Serial_SendString("OK:circle\r\n");
  91.                 }
  92.                 else
  93.                 {
  94.                     Serial_SendString("ERR:out of range\r\n");
  95.                 }
  96.             }
  97.             else if (strncmp(Serial_RxPacket, "cirde=", 6) == 0)
  98.             {
  99.                 // 兼容拼写错误: cirde=x,y,r
  100.                 int x, y, r;
  101.                 sscanf(Serial_RxPacket + 6, "%d,%d,%d", &x, &y, &r);
  102.                 if (x >= r && x + r < 128 && y >= r && y + r < 64)
  103.                 {
  104.                     OLED_DrawCircle(x, y, r);
  105.                     OLED_Refresh();
  106.                     Serial_SendString("OK:circle\r\n");
  107.                 }
  108.                 else
  109.                 {
  110.                     Serial_SendString("ERR:out of range\r\n");
  111.                 }
  112.             }
  113.             else if (strcmp(Serial_RxPacket, "clear") == 0)
  114.             {
  115.                 // clear: 清空画布
  116.                 OLED_Clear();
  117.                 OLED_ShowString(0, 0, "Bluetooth Draw", 16, 1);
  118.                 OLED_Refresh();
  119.                 Serial_SendString("OK:clear\r\n");
  120.             }
  121.             else
  122.             {
  123.                 Serial_SendString("ERR:unknown command\r\n");
  124.             }
  125.             
  126.             // 清除接收标志
  127.             Serial_RxFlag = 0;
  128.         }
  129.     }
  130. }
复制代码


Keil代码下载: 蓝牙控制oled绘制.7z (202.7 KB, 下载次数: 0)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表