这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » PIC单片机学习(3)

共1条 1/1 1 跳转至

PIC单片机学习(3)

工程师
2014-09-14 20:59:21     打赏
准备好写程序了


先是用C语言写,我主要是做一个串口来接收command,然后解析它的参数,然后根据不同的命令控制I2C设备pcf8574。

比如有直接写,读+或+写, 读+异或+写,读+与+写。共四条指令。因为有多个i2c设备所有每个命令后面跟上参数指定不同的设备id即slave地址。另外还需要一个参数来指令port的值。



首先我写了一个命令解析函数。它仅接受四条指令并分析命令后的两个参数,可以接受二进制,十进制(默认),十六进制。

分别的格式是:

cmd1      port       data

setp        b0101    b10101010; 二进制表示。

setp        3             182    ;十进制表示。

setp       x1            xFF;   十六进制表示。


uint16 getcmd()
{
uint8 ch = 0, bp = 0, flag;
uint16 cmd = 0;

while ((ch = getc()) && !isbreak(ch)) {
if (isspace(ch) && bp && 
isspace(buffer[bp - 1]))
continue;
buffer[bp++ % BSX] = ch;
///< 
if (!bp)
bp = BSX;
}

///< 
while (bp) {
ch = buffer[(bp - 1) % BSX];
if (!isspace(ch))
break;
--bp;
}

///< Dosn't handles empty command.
if (!bp)
return ERR_EMPTY_INPUT;

///< add a space.
buffer[bp % BSX] = 0x20;

/// 1)
break;
}

///< Checks WDT.
wdt_set();

///< The length of name must at least 4 chars.
if (bp < 4 || flag < 2)
return ERR_INVALID_FORMAT;

while (bp--) {
ch = buffer[bp % BSX];
///< Converts lowercase to uppercase.
if (ch > 0x60)
ch -= 0x20;

if (ch > 0x5a)
return ERR_ILLEGAL_FUNCTION;

if (!cmd) {
if (ch != 0x50)
return ERR_ILLEGAL_FUNCTION;
cmd |= 0x01;
continue;
}

if (cmd >> 9)
break;

cmd <<= 8;
cmd |= ch;
}

switch (cmd) {
case 0x5445:
if (ch != 0x53)
return ERR_ILLEGAL_FUNCTION;
flag = 0;
break;
case 0x4c52:
if (ch != 0x58)
return ERR_ILLEGAL_FUNCTION;
flag = 0x10;
case 0x524f:
if (ch != 0x58)
return ERR_ILLEGAL_FUNCTION;
flag = 0x20;
break;
case 0x444e:
if (ch != 0x41)
return ERR_ILLEGAL_FUNCTION;
flag = 0x30;
break;
default:
return ERR_ILLEGAL_FUNCTION;
}

cmd = flag << 8;

for (; ; bp++) {
ch = buffer[bp % BSX];
if (isspace(ch)) {
ch = buffer[++bp % BSX];
flag = 10;

if (isnum(ch))
///< Processes dec numbers.
--bp;
else if (ch == 0x42 || ch == 0x62)
///< Processes binary numbers.
flag = 0x02;
else if (ch == 0x58 || ch == 0x78)
/// 0x60)
ch -= 0x20;
ch -= 0x07;
}
}
ch -= 0x30;
if (cmd & 0xff) {
ch = (cmd & 0xff) * flag + ch;
cmd ^= (cmd & 0xff);
}
cmd |= ch;
ch = buffer[++bp % BSX];
}

if (cmd & 0x8000)
break;

///< pcf8574 only three address pins are valid.
if (cmd & 0xf8)
return ERR_DEVICE_ADDRESS_OUT_RANGE;

cmd |= ((cmd & 0x07) << 8);
cmd ^= (cmd & 0xff);
cmd |= 0x8000;
--bp;
}
}

return cmd;
}

 



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]