因此,我正在嘗試將一些用於從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