发送十六进制代码

时间:2015-12-25 03:18:25

标签: c microcontroller

我是C编程的新手,我想将一个十六进制代码(38)发送到8个引脚(在视差螺旋桨微控制器上),这样第一个引脚就会变为0,下一个引脚会得到a 0和下一个引脚得1,等等。这样会更容易 向每个引脚发送二进制代码。

顺便说一下这是C代码。到目前为止,使用二进制文件的代码是:

//int port[] = {27,26,25,24,23,22,21,20};    
int i = 8;

while(i >0)
{       //while start
   --i;  
   low(27);
   low(26);
   high(25);
   high(24);
   high(23);
   low(22);
   low(21);
   low(20);
}

我想要做的是将一个十六进制代码(38)发送到引脚20到27。

2 个答案:

答案 0 :(得分:3)

循环应该有点不同

int port = 0x20; // starting port
int val  = 0x38; // value
int i;

for(i=0 ; i<8 ; i++) {
    if (val & 1) high(port);
    else         low (port);
    val >>= 1; // shift val one bit right
    port++;    // increment port
}

循环从端口0x20 开始, val 的第0位开始。如果该位为1,则执行,否则在该端口上执行 low

然后 val 向右移一位,使用位1,端口递增。

等......对于 val (0x38)的8位,这样做了8次。

请注意,如果必须从顶部端口启动,则此不同版本应适合

int val  = 0x38; // value
int port;

for(port=0x27 ; port >= 0x20 ; port--) { // goes from port 0x27~20
    if (val & 0x80) high(port);
    else            low (port);
    val <<= 1; // shift val one bit left
}

答案 1 :(得分:2)

首先,在使用微控制器时,通常有一种方法可以同时指定属于同一端口的8个引脚的值。

您应该尝试通过搜索关键字从微控制器(uC)手册/数据表中找出它!否则你会发现一个地狱般的时间(真的,我不是在开玩笑!至少我做了!)来搜索分散在但是手册/数据表的几百/千页中的一些。< / p>

首先尝试这个,它应该会变得更容易。

其次,在uC中,分配高电平和低电平引脚通常不需要采用不同的功能,因为它们只是将值(高电平或低电平)分配给同一个引脚。因此,只要有可能,你应该结合高和低。将功能降低到单一功能(因为我不知道什么是高和低,我不能真正帮助进一步,但你应该注意这种可能性来减轻你的任务)

最后,但是,如果由于某种原因无法完成,您可以像这样简化您的C代码,

void assignPort(char val, char portBase){
    int i = 0;
    for (i = 0; i < 8; ++i)
        if (val & (1 << i)) //masked your val with shifting 1 to get the current bit 
            high(portBase + i); //increase your port address by i
        else 
            low(portBase + i);
}

要调用该函数,只需执行

assignPort(0x38, 20); //notice the 38 using 0x for hex indicator while 20 is written as it is (assuming 20 is not hex)

请注意,如果可以合并highlow个功能

void highLowCombined(char pinAddress, char highOrLow) { //highOrLow is simply non-zero (high) or zero (low)
    //do something based on pinAddress and highOrLow
}

您在上面的assignPort中调用高/低函数和val变量更容易,因为您只需要这样做

void assignPort(char val, char portBase){
    int i = 0;
    for (i = 0; i < 8; ++i)
        highLowCombined(portBase + i, val & (1 << i)); //only one line is needed here!
}

现在,您只需要for-loop中的一行!试试吧!