Mixly 二次开发 自定义库 OLED

前言

本章内容是对Mixly 图像化编程软件进行的二次开发,需要一定的编程基础,需要用到的概念和知识点有: 绑定与事件概念, JavaScript的基本语法, .xml脚本的标签定义

限于篇幅,本章内容中笔者不做原理和JS脚本的剖析和讲解! 如参考阅读时困难, 恕笔者精力有限, 暂不不能提供详细内容,  当然,若笔者有空余时间, 自会补充相关原理讲解和脚本内容剖析. 还请各位读者知悉!

Mixly基本原理

Mixly可以看作是介于普通用户与Arduino IDE之间桥梁,通过这个桥梁,即使用户不懂C语言的语法,也可以利用图形化程序编写Arduino程序。Mixly的基本原理是将图形化程序转化成C语言,再利用Arduino IDE上传到硬件中。在我们动手编写第三方库之前,先来了解Mixly是如何将图形化程序转化成C语言的。
根目录下的xxx.xml文件定义了图形块的基本信息,比如类别、名称,ID等。block/xxx.js文件定义了每个图形块的样式,比如颜色、文字、图标等。generator/xxx.js文件是将图形块程序转化成C语言的关键部分。language/xxx/en.js(zh-hans.js)等文件是语言文件,en.js是英文语言文件,zh-hans.js是简体中文语言文件,zh-hant.js是繁体中文语言文件。该类文件定义了图形块程序中每一个字段显示的文字内容。
各文件作用的流程如图 1所示。

各文件作用流程

Mixly第三方库基本结构如图 2所示。

第三方库基本结构

简介&软件准备:

Mixly 1.1.7

官方指南: Instructions -使用Mixly写自定义库

第三方库范例: dfrobot、Otto

文本编辑工具: 记事本

此教程中所有文件可新建文本文档,修改其后缀实现编译。

这里用的编译器是Sublime,脚本语言是JavaScript

Mixly二次开发 文件结构

block/xxx.js文

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于HAL开发STM32 OLED可以参考以下步骤: 1. 初始化I2C总线,配置OLED的I2C地址,数据传输速率等。 2. 在HAL中,使用HAL_I2C_Master_Transmit和HAL_I2C_Master_Receive函数可以实现I2C总线的数据传输。 3. 配置OLED显示屏的初始化参数,比如分辨率、亮度、对比度等。 4. 初始化OLED显示屏,可以使用OLED_Init函数,该函数会按照前面设置的参数进行初始化。 5. 在代码中编写需要显示的内容,并通过函数将其显示在OLED屏幕上。 6. 在程序中增加控制代码,可以实现动态刷新屏幕内容等功能。 以下是一份参考代码,仅供参考: ``` #include "oled.h" #include "delay.h" #include "i2c.h" #define OLED_CMD 0x00 #define OLED_DATA 0x40 void OLED_WR_Byte(uint8_t dat, uint8_t cmd) { uint8_t data_t; if(cmd==OLED_CMD)data_t=0x00; else data_t=0x40; data_t=dat; HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDR, data_t, 2, 1000); } void OLED_Display_On(void) { OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON } void OLED_Display_Off(void) { OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF } void OLED_Clear(void) { uint8_t i,n; for(i=0;i<8;i++) { OLED_WR_Byte(0xb0+i,OLED_CMD); //设置页地址(0~7) OLED_WR_Byte(0x00,OLED_CMD); //设置显示位置—列低地址 OLED_WR_Byte(0x10,OLED_CMD); //设置显示位置—列高地址 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示 } void OLED_Init(void) { HAL_Delay(200); OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel OLED_WR_Byte(0x00,OLED_CMD);//---set low column address OLED_WR_Byte(0x10,OLED_CMD);//---set high column address OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64) OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F) OLED_WR_Byte(0x00,OLED_CMD);//-not offset OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration OLED_WR_Byte(0x12,OLED_CMD); OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02) OLED_WR_Byte(0x02,OLED_CMD);// OLED_Clear(); } void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size) { uint8_t c=0,i=0,j=0; switch(Char_Size) { case 16: { while(chr[c]!='\0') { if(chr[c]>127) { i=chr[c]-128; j=chr[c+1]-128; c+=2; OLED_ShowChinese(x,y,i,j,16); x+=16; } else { OLED_ShowChar(x,y,chr[c],16); c++; x+=8; } } }break; case 12: { while(chr[c]!='\0') { if(chr[c]>127) { i=chr[c]-128; j=chr[c+1]-128; c+=2; OLED_ShowChinese(x,y,i,j,12); x+=12; } else { OLED_ShowChar(x,y,chr[c],12); c++; x+=6; } } }break; default: { while (chr[c]!='\0') { if (chr[c]>127) { i=chr[c]-128; j=chr[c+1]-128; c+=2; OLED_ShowChinese(x,y,i,j,12); x+=12; } else { OLED_ShowChar(x,y,chr[c],16); c++; x+=8; } } }break; } } void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size) { uint8_t c=0,i=0,j=0; switch(Char_Size) { case 12: { c=chr-' '; if(x>116) {x=0;y+=12;} OLED_Set_Pos(x,y); for(i=0;i<6;i++) { OLED_WR_Byte(F6x8[c][i],OLED_DATA); } }break; case 16: { c=chr-' '; if(x>112) {x=0;y+=16;} OLED_Set_Pos(x,y); for(i=0;i<8;i++) { OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); } OLED_Set_Pos(x,y+8); for(i=0;i<8;i++) { OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); } }break; default: { c=chr-' '; if(x>120) {x=0;y+=16;} OLED_Set_Pos(x,y); for(i=0;i<8;i++) { OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); } OLED_Set_Pos(x,y+8); for(i=0;i<8;i++) { OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); } }break; } } void OLED_ShowChinese(uint8_t x,uint8_t y,uint8_t no,uint8_t size) { uint8_t t,t1,c=0,i=0; uint8_t adder=32*(no-1); while(c<size) { t=Hzk[size-12][adder]; t1=Hzk[size-12][adder+1]; for(i=0;i<8;i++) { if(t&0x80)OLED_Set_Pos(x+i,y); t<<=1; if(t1&0x80)OLED_WR_Byte(0xff,OLED_DATA); else OLED_WR_Byte(0,OLED_DATA); t1<<=1; } c++; adder+=2; y++; if(y>63)return; if((y-y%8)==((y-1)-(y-1)%8)) {y=y-y%8+8;} } } void OLED_Set_Pos(uint8_t x, uint8_t y) { OLED_WR_Byte(0xb0+y,OLED_CMD); OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); } void Draw_BMP(uint8_t x,uint8_t y,const uint8_t *pBmp,uint8_t chWidth,uint8_t chHeight) { uint16_t i,j,n,m,k; uint8_t temp; n=(chWidth%8==0)?chWidth/8:chWidth/8+1; for(i=0;i<chHeight;i++) { OLED_Set_Pos(x,y+i); for(j=0;j<n;j++) { temp = pBmp[i*n+j]; for(k=0;k<8;k++) { if(temp&0x80)OLED_WR_Byte(1,OLED_DATA); else OLED_WR_Byte(0,OLED_DATA); temp<<=1; } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值