cpp代码:/**
* 使用此文件来定义自定义函数和图形块。
* 想了解更详细的信息,请前往 /blocks/custom
*/
/**
* 自定义图形块
*/
enum REGISTER {
IODIRA = 0x00,
IODIRB = 0x01,
IPOLA = 0x02,
IPOLB = 0x03,
GPINTENA = 0x04,
GPINTENB = 0x05,
DEFVALA = 0x06,
DEFVALB = 0x07,
INTCONA = 0x08,
INTCONB = 0x09,
IOCONA = 0x0A,
IOCONB = 0x0B,
GPPUA = 0x0C,
GPPUB = 0x0D,
INTFA = 0x0E,
INTFB = 0x0F,
INTCAPA = 0x10,
INTCAPB = 0x11,
GPIOA = 0x12,
GPIOB = 0x13,
OLATA = 0x14,
OLATB = 0x15
}
enum PIN {
A = 0,
B = 1
}
//% weight=5 color=#9900CC icon="\uf53b"
namespace MCP23017 {
const MCP23017_ADDRESS = 0x20
const MCP23017_IODIRA = 0x00
const MCP23017_IPOLA = 0x02
const MCP23017_GPINTENA = 0x04
const MCP23017_DEFVALA = 0x06
const MCP23017_INTCONA = 0x08
const MCP23017_IOCONA = 0x0A
const MCP23017_GPPUA = 0x0C
const MCP23017_INTFA = 0x0E
const MCP23017_INTCAPA = 0x10
const MCP23017_GPIOA = 0x12
const MCP23017_OLATA = 0x14
const MCP23017_IODIRB = 0x01
const MCP23017_IPOLB = 0x03
const MCP23017_GPINTENB = 0x05
const MCP23017_DEFVALB = 0x07
const MCP23017_INTCONB = 0x09
const MCP23017_IOCONB = 0x0B
const MCP23017_GPPUB = 0x0D
const MCP23017_INTFB = 0x0F
const MCP23017_INTCAPB = 0x11
const MCP23017_GPIOB = 0x13
const MCP23017_OLATB = 0x15
let initialized = false
function i2cwrite(addr: number, reg: number, value: number): void {
let buf = pins.createBuffer(2);
buf[0] = reg;
buf[1] = value;
pins.i2cWriteBuffer(addr, buf);
}
function i2cread(addr: number, reg: number): number {
pins.i2cWriteNumber(addr, reg, NumberFormat.UInt8BE);
let val = pins.i2cReadNumber(addr, NumberFormat.UInt8BE);
return val;
}
function initMCP23017(): void {
for (let regAddr = 0; regAddr < 22; regAddr++) {
if (regAddr == 0 || regAddr == 1) {
i2cwrite(MCP23017_ADDRESS, regAddr, 0xFF);
}
else {
i2cwrite(MCP23017_ADDRESS, regAddr, 0x00);
}
}
//configue all PinA output
i2cwrite(MCP23017_ADDRESS, MCP23017_IODIRA, 0x00);
//configue all PinB input
i2cwrite(MCP23017_ADDRESS, MCP23017_IODIRB, 0xFF);
//configue all PinB pullUP
i2cwrite(MCP23017_ADDRESS, MCP23017_GPPUB, 0xFF);
initialized = true;
}
/**
*Read data from the register
* @param reg [0-21] register of mcp23017; eg: 0, 15, 23
*/
//% blockId=ReadReg block="Read register |%reg| data"
//% weight=65
export function ReadReg(reg: REGISTER): number {
let val = i2cread(MCP23017_ADDRESS, reg);
return val;
}
/**
* WriteData to PinA or PinB
* @param pin [0-1] choose PinA or PinB; eg: 0, 1
* @param value [0-255] pulse of servo; eg: 128, 0, 255
*/
//% blockId=WritePin block="Set P |%pin| value |%value|"
//% weight=75
//% value.min=0 value.max=255
export function WritePin(pin: PIN, value: number): void {
if (!initialized) {
initMCP23017();
}
if (pin == 0) {
i2cwrite(MCP23017_ADDRESS, MCP23017_GPIOA, value);
}
else {
i2cwrite(MCP23017_ADDRESS, MCP23017_GPIOB, value);
}
}
/**
*ReadData From PinA or PinB
* @param pin [0-1] choose PinA or PinB; eg: 0, 1
*/
//% blockId=ReadPin block="Read data from |%pin|"
//% weight=85
export function ReadPin(pin: PIN): number {
if (!initialized) {
initMCP23017();
}
if (pin == 0) {
let val = i2cread(MCP23017_ADDRESS, MCP23017_GPIOA);
return val;
}
else {
let val = i2cread(MCP23017_ADDRESS, MCP23017_GPIOB);
return val;
}
}
}
4.编写测试代码
在采用pxt
init生成的文件中,test.ts文件为测试文件,当作为软件包添加到其它项目中时,该文件不会被编译,而作为开发流程中的功能测试时,该文件将会被编译,且单独执行。
现编写测试代码,对输出功能进行测试:
在该测试代码中,其操作为对MCP23017的A引脚的输出寄存器写入十进制数值:85,其二进制为:01010101,对应PA0至PA7的电平状态分别为:高低高低高低高低。
此次测试代码为:
cpp代码:/* tests go here; this will not be compiled when this package is used as a library*/
basic.forever(() => {
MCP23017.WritePin(0,85);
})
5.编译检查,测试
先进行语法检查,如果有语法出错,VS code会进行提示,及时在VS Code中改正即可:
打开Windows命令行,进入到新建的以软件包名称命名的文件夹(本次进入到MCP23017文件夹),进行以下操作:
编译:(可选)在命令行输入:pxt build,该步骤主要方便检查语法错误,实际中,VS Code能够提示语法错误,可先在VS Code中修改语法错误。
编译并下载:(可选)在命令行输入:pxt deploy,该步骤为先编译,编译成功后直接下载,实际中,通过makecode进行下载更便捷。
打开makecode进行编辑并下载:(推荐)
在命令行进入到microbit路径(该路径下包含projects文件夹,运行pxt serve将寻找projects文件夹,若找不到,则将自动创建新项目,因此必须先进入到含有projects子文件夹的microbit文件夹),如下所示:
在此基础上,在命令行输入:pxt serve,运行makecode服务器,自动打开makecode网页:
此时,软件包已经加载到左侧,可预览软件包的颜色及图标,并可对图形块进行移动,如下图所示:
但是,在test.ts文件中,仅能以JavaScript代码的形式进行显示。
连接microbit,点击左下角的download,程序将下载到microbit中,运行的是test.ts文件中的代码。
下载后,将MCP23017的PA0-PA7连接至8个LED(低电平亮),观察得,PA0-PA7连接的LED分别为灭亮灭亮灭亮灭亮,软件包测试通过。
6.发布
软件包测试通过后,将其发布到Github,此次发布的本地仓库为MCP23017文件夹,具体发布流程请参考廖雪峰的Git教程:
最后,打开Windows命令行进入到MCP23017文件夹,输入pxt bump命令,修改版本号(修改pxt.json文件中version键对应的值)。
将软件包发布后,即可根据Github仓库链接找到软件包,可在makecode中自由扩展该软件包到项目中了。
参考链接
搭建环境,及Github的使用:
图形块定义
Github教程