我是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。
答案 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)
请注意,如果可以合并high
和low
个功能
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
中的一行!试试吧!