步驟1:硬件
MAX7219 模塊通常如下所示。它們的一側(cè)有輸入總線,另一側(cè)有輸出總線。這樣,您就可以菊花鏈?zhǔn)竭B接2個(gè)或更多模塊,即以菊花鏈方式連接,以創(chuàng)建更復(fù)雜的設(shè)置。
我們使用的模塊能夠使用5個(gè)小跳線成鏈狀連接。參見下圖。
步驟2:引腳和信號
MAX7219 模塊有5個(gè)引腳:
VCC –電源(+)
GND –接地(-)
DIN –數(shù)據(jù)輸入
CS –芯片選擇
CLK –時(shí)鐘
這意味著我們需要ATtiny85微控制器一側(cè)的3個(gè)引腳來控制模塊。這些將是:
PB0 –連接到CLK
PB1 –連接到CS
PB2 –連接到DIN
這足以連接到MAX7219模塊并對其進(jìn)行編程。
步驟3:協(xié)議
與 MAX7219 進(jìn)行通信相對容易–它使用同步協(xié)議,這意味著我們發(fā)送的每個(gè)數(shù)據(jù)位都有一個(gè)時(shí)鐘周期,表示該數(shù)據(jù)位的存在。
換句話說,我們向位發(fā)送2個(gè)并行序列-一個(gè)用于時(shí)鐘,另一個(gè)用于數(shù)據(jù)。
第4步:軟件
MAX7219 的方式模塊的工作原理是:
我們將字節(jié)寫入其內(nèi)部寄存器。
MAX7219解釋數(shù)據(jù)。
MAX7219控制矩陣中的LED。
這也意味著我們不必一直在LED陣列中盤旋來點(diǎn)亮它們。 -MAX7219控制器負(fù)責(zé)這一工作。
因此,為了以方便的方式使用MAX7219模塊,我們需要一個(gè)函數(shù)庫來實(shí)現(xiàn)這一目的。
首先,我們需要一些基本功能,以便寫入MAX7219寄存器。
向MAX7219寫入一個(gè)字節(jié)。
向MAX7219寫一個(gè)字(2個(gè)字節(jié))。
向控制器寫入一個(gè)字節(jié)的函數(shù)如下所示:
void max7219_byte(uint8_t data) {
for(uint8_t i = 8; i 》= 1; i--) {
PORTB &= ~(1 《《 MAX7219_CLK); // Set CLK to LOW
if (data & 0x80) // Mask the MSB of the data
PORTB |= (1 《《 MAX7219_DIN); // Set DIN to HIGH
else
PORTB &= ~(1 《《 MAX7219_DIN); // Set DIN to LOW
PORTB |= (1 《《 MAX7219_CLK); // Set CLK to HIGH
data 《《= 1; // Shift to the left
}
}
現(xiàn)在我們可以向MAX7219發(fā)送字節(jié)了,我們可以開始發(fā)送命令了。這是通過發(fā)送2個(gè)字節(jié)來完成的,第一個(gè)字節(jié)是內(nèi)部寄存器的地址,第二個(gè)字節(jié)是我們要發(fā)送的數(shù)據(jù)。
MAX7219控制器中有十幾個(gè)寄存器。/p》
發(fā)送命令或單詞基本上是發(fā)送2個(gè)連續(xù)字節(jié)。該函數(shù)的實(shí)現(xiàn)非常簡單。
void max7219_word(uint8_t address, uint8_t data) {
PORTB &= ~(1 《《 MAX7219_CS); // Set CS to LOW
max7219_byte(address); // Sending the address
max7219_byte(data); // Sending the data
PORTB |= (1 《《 MAX7219_CS); // Set CS to HIGH
PORTB &= ~(1 《《 MAX7219_CLK); // Set CLK to LOW
}
請務(wù)必在此處注意將CS信號恢復(fù)為HIGH的行-這標(biāo)志著序列的結(jié)束-在這種情況下,命令的結(jié)尾。控制鏈中連接的一個(gè)以上矩陣時(shí),使用類似的技術(shù)。
在開始打開和關(guān)閉LED之前,下一步是初始化MAX7219控制器。這是通過將某些值寫入某些寄存器來完成的。為了方便起見,在進(jìn)行編碼時(shí),我們可以將初始化序列放入數(shù)組中。
uint8_t initseq[] = {
0x09, 0x00, // Decode-Mode Register, 00 = No decode
0x0a, 0x01, // Intensity Register, 0x00 。. 0x0f
0x0b, 0x07, // Scan-Limit Register, 0x07 to show all lines
0x0c, 0x01, // Shutdown Register, 0x01 = Normal Operation
0x0f, 0x00, // Display-Test Register, 0x00 = Normal Operation
};
我們只需要按順序?qū)⑸厦娴?條命令作為地址/數(shù)據(jù)對發(fā)送即可。
下一步步驟–點(diǎn)亮一排LED。
這很簡單–我們只需要編寫一個(gè)命令,其中第一個(gè)字節(jié)為地址(從0到7),第二個(gè)字節(jié)為代表8個(gè)LED的8位。在行中。
void max7219_row(uint8_t address, uint8_t data) {
if (address 》= 1 && address 《= 8) max7219_word(address, data);
}
請注意,這僅適用于1個(gè)矩陣。如果我們將更多矩陣連接在一起,它們將全部顯示相同的數(shù)據(jù)。原因是在發(fā)送命令后,我們將CS信號返回到HIGH,這會導(dǎo)致鏈中的所有MAX7219控制器鎖存并顯示最后一條命令的內(nèi)容。
步驟5 :測試
該測試代碼并沒有做什么,但它演示了如何與MAX7219控制器進(jìn)行通信。
這是一個(gè)簡單的測試程序,它可以點(diǎn)亮第一排(r = 1)上的LED在最右邊的位置,然后將其向左移動直到到達(dá)最左邊的位置,然后向上一行(r = 2)進(jìn)行相同的操作,直到到達(dá)頂部(r = 8)。
max7219_init();
for (;;) {
for (uint8_t r = 1; r 《= 8; r++) {
uint8_t d = 1;
for (uint8_t i = 9; i 》 0; i--) {
max7219_row(r, d);
d = d 《《 1;
_delay_ms(50);
}
}
}
MAX7219LED8x8庫
上述所有功能都是MAX7219LED8x8的一部分圖書館。其源代碼可在https://bitbucket.org/tinusaur/max7219led8x8上獲得。
步驟6:應(yīng)用程序
Tinusaur Shield GAMEx3
如果您已經(jīng)有了Tinusaur板,我們可以提供Shield GAMEx3,以便將MAX7219模塊更容易地連接到ATtiny85微控制器。
Gametinu項(xiàng)目
Gametinu是一個(gè)小型游戲平臺,您可以使用Shield GAMEx3以及其他一些部件和工具來構(gòu)建自己的游戲。
責(zé)任編輯:wv
-
ATtiny
+關(guān)注
關(guān)注
3文章
128瀏覽量
19602 -
MAX7219
+關(guān)注
關(guān)注
4文章
94瀏覽量
24631 -
LED矩陣
+關(guān)注
關(guān)注
0文章
71瀏覽量
17605
發(fā)布評論請先 登錄
相關(guān)推薦
評論