Не стал я использовать SPI. Решил напрямую управлять битами для тренировки. Написал программку, типа "Helo world". Программа выводит 2 байта в 3 последовательных регистра с параллельным выходом. Выходы регистров подключены к LED дисплею, который показывает цифирки.
- Код: Выделить всё
#define OE_Reg 10 //Output Enable
#define LE_Reg 11 //Latch Enable
#define CLK_Reg 12 //Clock
#define SDI_Reg 13 //Serial Data Input
void setup()
{
pinMode(OE_Reg, OUTPUT);
pinMode(LE_Reg, OUTPUT);
pinMode(CLK_Reg, OUTPUT);
pinMode(SDI_Reg, OUTPUT);
}
void loop()
{
digitalWrite(OE_Reg, HIGH);
digitalWrite(LE_Reg, LOW);
NumberToSymbol(555);
digitalWrite(LE_Reg, HIGH);
digitalWrite(OE_Reg, LOW);
digitalWrite(LE_Reg, LOW);
while(true){
continue;
}
}
void ByteSerialTransfer(byte Data)
{ // Последовательный вывод байта
byte SendData = 0;
for (int i=0; i < 8; i++)
{
digitalWrite(CLK_Reg, LOW);
SendData = Data & B10000000;
if (SendData == B10000000)
{
digitalWrite(SDI_Reg, HIGH);
}
else
{
digitalWrite(SDI_Reg, LOW);
}
Data = Data << 1;
digitalWrite(CLK_Reg, HIGH);
}
digitalWrite(CLK_Reg, LOW);
}
void NumberToSymbol(int Number)
{ //Перевод числа в 3 байта символов дисплея
byte symbol[10] = {
B00101000, // 0
B01101111, // 1
B10100010, // 2
B00100110, // 3
B01100101, // 4
B00110100, // 5
B00110000, // 6
B00101111, // 7
B00100000, // 8
B00100100 // 9
};
int SendNumber;
SendNumber = Number;
for (int i=0; i < 3;i++)
{
ByteSerialTransfer(symbol[SendNumber%10]);
SendNumber /= 10;
}
}
Собственно это моя первая программа. Хотел бы чтобы её кто-то покритиковал. Может что-то сделал не так или можно что-то улучшить.
На досуге спаяю схемку, проверю как работает.