因此,我正在尝试将一些用于从Arduino操作LCD的代码转换为MSP430F5529的C代码。液晶显示器使用SPI进行通信,我很困惑这些代码是如何导致Arduino与它正确通信的,并且希望有一些体面的Arduino经验的人能够解释一些事情(我从未使用过)。我已经联系到整个程序上引擎收录底,但是这是我关注的是,现在部分:帮助理解Arduino Mega上的串行通信(SPI)
void comm_out(char c)
{
int i;
digitalWrite(CS, LOW);
digitalWrite(AO, LOW);
for(i=0;i<8;i++)
{
if((c&0x80) == 0x80)
{
PORTA |= 0x80;
PORTA &= ~0x40;
PORTA |= 0x40;
}
else
{
PORTA &= ~0x80;
PORTA &= ~0x40;
PORTA |= 0x40;
}
c = c<<1;
}
digitalWrite(CS, HIGH);
digitalWrite(AO, HIGH);
}
所以我明白任何与设定一些数字引脚做的代码在Arduino上(看起来他们只是输出,因为程序从未为它们设置方向)高到低,因为这是非常直接的,但我并不完全知道for循环在SPI方面做了什么。
我得到该函数直接做什么。它得到一个8位输入,它被认为是一个字符(尽管这实际上并不重要),并检查第一位是1还是0.如果它是1,它将PORTA设置为3个步骤:
1:1XXX XXXX 2:10XX XXXX 3:11XX XXXX
并且如果它是一个0,则它设置PORTA以下3个步骤:
1:0XXX XXXX 2:00XX XXXX 3:01xx xxxx
然后它将输入移位,以便下一位最高并再次执行检查,直到检查全部8位。但我不知道这是怎么做到的Arduino,使它正确地沟通液晶通过串行。从我检查过的所有文档中,我甚至无法确定PORTA是什么。我曾假设它可能映射到某种模块进行串行通信,但它看起来并不像它。
其他的事情,我感到困惑是在顶部
声明int SCLK = 28; // SCL signal connected to digital pin 28 of Arduino Mega
int SI = 29; // SI signal connected to digital pin 29 of Arduino Mega
int CS = 30; // CS signal connected to digital pin 30 of Arduino Mega
int RES = 31; // RES signal connected to digital pin 31 of Arduino Mega
int AO = 32; // A0 signal connected to digital pin 32 of Arduino Mega
A0,RES和CS都很好,因为这些是被设置为仅下降了静态的引脚,但SI应该作为串行输入,SCLK应该是SPI的时钟信号,但据我所知,端口28和29中没有任何特殊的和通用的I/O端口。
这里是端口映射我指的是:http://pighixxx.com/atmega2560v3_0.pdf
这里是链接到代码的全部:http://pastebin.com/DxMGJZDu
任何意见或者说,什么什么?我正在努力弄清楚这一点。
轻微:'igitalWrite(CS,LOW); digitalWrite(AO,LOW);' - >对我来说,这样做是有道理的。在启用芯片选择之前建立端口A0。在芯片选择之前和最终的CS取消选择之后,还有'PORTA = 0'。 – chux
我想你错过了这个问题到底是什么。我粘贴的代码是由LCD制造商提供给我的,我正在将其转换为常规C,以用于MSP430。我需要帮助了解代码的部分内容,除了我看过的文档以外,我对Arduino的工作方式没有任何意义, – oblivioncth
我想你错过了评论的内容。这本来就是对你遇到的问题的一个小小的思考,并帮助找出其他人可能会导致解决方案的潜在问题。如果这是一个解决方案,它将作为答案发布。所以我认为这是“任何事情?”的要求意味着不要对事情发表评论,但要给我答案。 – chux