Вопрос по программированию драйвера MAX7219
- Войдите на сайт для отправки комментариев
Вс, 19/10/2014 - 18:38
Привет форумчане. Купил я семисегментный индикатор на микросхеме MAX7219 с 8 разрядами
Логика работы вроде понятна-формируем и отправляем 16 бит данных.
Информацию брал отсюда-http://radiohlam.ru/raznoe/max7219_7221.htm
Написал программу для программирования всех регистров микросхемы с целью потестировать.
Но сколько не бился не выводятся цифры на индикатор. В программировании новичёк, так что
сильно не грузите по качеству кода и листинга.
Если кому не сложно гляньте где ошибка.
byte load=8;// пины для подключения
byte clk=9;
byte din=10;
static int8_t print_digits[] = {//разложенный массив данных регистров идущих на печать
0b00000000, // 0, адрес // 00000000
0b00000001, // 1, // 1---------------------------------------------
0b00000001,// 2, // 2--------
0b00000001,//3, // 3--------
0b00000001,// 4, // 4------
0b00000001, // 5, // 5--------
0b00000000,// 6, // 6--------
0b00000000,// 7, // 7------
0b00000000,// 8, // 8-----------------------------------------------
0b00000000,// 9, 00000000 Decode Mode 0 ("No decode") или 1 ("BCD code B")
0b00000000, // 10 00001111 яркость
0b11111111,// 11 00000111 ОБСЛУЖИВАЕМ ВСЕ 8 РАЗРЯДОВ
0b00000000, // 12 Включение MAX7219 производится записью 1 в регистр Shutdown, имеющий адрес 0Сh т.е надо 1 бит посылать а не 8
0b00000000, // 13 nop
0b00000000, // 14 nop
0b00000000,// 15 display test 00000000
};
//0b10000000=128
//0b01000000=64
//0b00100000=32
//0b00010000=16
//0b00001000=8
//0b00000100=4
//0b00000010=2
//0b00000001=1
boolean changesettings=true;// если true то меняем настройки посылая байты 9 10 11 12 13 и меняем на false чтоб в следующий раз не посылать
void setup() {
pinMode(load, OUTPUT); //load(cs) PORTB0 digitalWrite(8,LOW);
pinMode(clk, OUTPUT);//clk PORTB1
pinMode(din, OUTPUT);//din PORTB2
digitalWrite(load,LOW);
digitalWrite(clk,LOW);
digitalWrite(din,LOW);
delay(50);
Serial.begin(9600);
}
void loop() {
for (byte registeradr=0; registeradr<=15; registeradr++){ //p //за весь цикл грузим все регистры от 0 до 13 микросхемы 7219
// delay(10);//
digitalWrite(load,LOW);// Установить низкий уровень на линии LOAD
if (registeradr==13){registeradr=15;}
Serial.println( );
Serial.print(registeradr);
Serial.print(" adress " );
if(registeradr==9 && changesettings==false){
break;}//выход из цикла если ненадо грузить байты настройки
for (byte i=128; i >= 1; i=i/2){// отправка 7(от 0 до 7) бит адреса регистра содержащегося в registeradr
// цикл работает 8 раз и отпревляет 8 бит
byte tmpregisteradr=registeradr;
byte tmp_i=i;
// delay(10);
digitalWrite(clk,LOW);// Установить НИЗКИЙ уровень на линии CLK
// delay(10);
if ((tmpregisteradr & tmp_i) > 0 ){ // если результат >0 то отправляем 1
digitalWrite(din,HIGH); //установили высокий уровень din
Serial.print(1);}
else{
digitalWrite(din,LOW);//установили низкий уровень din
Serial.print(0);}
// delay(10);//---------------------------------------------------------------------------------
digitalWrite(clk,HIGH);// Установить ВЫСОКИЙ уровень на линии CLK -ОТПРАВКА БИТА
}// i отправили 8 бит адреса registeradr--------------------------------------------
Serial.print(" data " );
for (byte sendbitdata=128; sendbitdata >= 1; sendbitdata=sendbitdata/2) // отправка 8 бит данных------------------------------------------
{
byte tmpsenddata=print_digits[registeradr];// tmpsenddata- 8 бит данных print_digits[] которые надо отправлять
byte tmp_sendbitdata=sendbitdata;
// delay(10);//......................................................................................
digitalWrite(clk,LOW);// Установить НИЗКИЙ уровень на линии CLK
if ((tmpsenddata & tmp_sendbitdata) > 0 ){ // если результат >0 то отправляем 1
digitalWrite(din,HIGH); //установили высокий уровень din
Serial.print(1); }
else{
digitalWrite(din,LOW); //установили низкий уровень din
Serial.print(0); }
// delay(10);//qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
digitalWrite(clk,HIGH);// ВЫСОКИЙ уровень на линии CLK -ОТПРАВКА БИТА
}// sendbitdata отправили 8 бит содержащихся массиве [registerr] (настройки В МАССИВЕ и отображаемые символы уже закодированны ПОБИТНО)
//-----------------------------------------------------------------------------------------------------------------------------------------
Serial.print(" send 16 bit " );
Serial.println( );
// delay(1000);//qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
digitalWrite(load,HIGH);// отправка load=1
}//registeradr
// цикл записи всех регистров закончился и теперь необходимо установить boolean changesettings=false; чтоб не записывать регистры настройки
// в следующий раз
changesettings=false;
Serial.println("changesettings = false");
}//конец основного цикла----------------------
Не пойму как тут отредактировать первое сообщение
Разобрался на свежую голову, все работает. Если кому интересно то вот рабочий вариант. Можно смотреть в seriаl port идущие данные. Но это чисто для понимания принципа работы, под конкретные цели можно оптимизировать чтоб не всё подряд выводил.
byte load=8;// пины для подключения byte clk=9; byte din=10; static int8_t print_digits[] = {//разложенный массив данных регистров идущих на загрузку в микросхему 0b00000000, // 0, адрес // 00000000 0b00000001, // 1, // 1--------------------------------------------- 0b00000001, // 2, // 2------ 0b00000001, //3, // 3-------- 0b00000001, // 4, // 4------ТУТ КОДИРУЕМ СЕГМЕНТЫ 0b00000001, // 5, // 5------ 0b00000001, // 6, // 6----- 0b00000001, // 7, // 7----- 0b00000001, // 8, // 8----------------------------------------------- 0b00000000, // 9, 00000000 Decode Mode 0 ("No decode") или 1 ("BCD code B") 0b00000000, // 10 00001111 яркость 0b11111111, // 11 00000111 ОБСЛУЖИВАЕМ ВСЕ 8 РАЗРЯДОВ 0b00000001, // 12 Включение индикаторов MAX7219 производится записью 1 выключение 0 0b00000000, // 13 nop 0b00000000, // 14 nop 0b00000000, // 15 display test 00000000 }; boolean changesettings=true;// если true то меняем настройки посылая байты 9 10 11 12 13 и меняем на false чтоб в следующий раз не посылать void setup() { pinMode(load, OUTPUT); //load(cs) pinMode(clk, OUTPUT);//clk pinMode(din, OUTPUT);//din Serial.begin(9600); } void loop() { for (byte registeradr=1; registeradr<=15; registeradr++){//за весь цикл грузим все регистры от 0 до 13 микросхемы 7219 digitalWrite(load,LOW);// Установить низкий уровень на линии LOAD if (registeradr==13){registeradr=15;} Serial.println( ); Serial.print(registeradr); Serial.print(" adress " ); if(registeradr==9 && changesettings==false){ break;}//выход из цикла если ненадо грузить байты настройки for (byte i=128; i >= 1; i=i/2){// отправка 7(от 0 до 7) бит адреса регистра содержащегося в registeradr // цикл работает 8 раз и отпревляет 8 бит digitalWrite(clk,LOW);// Установить НИЗКИЙ уровень на линии CLK if ((registeradr & i) > 0 ){ // если результат >0 то отправляем 1 digitalWrite(din,HIGH); //установили высокий уровень din Serial.print(1);} else{ digitalWrite(din,LOW);//установили низкий уровень din Serial.print(0);} digitalWrite(clk,HIGH);// Установить ВЫСОКИЙ уровень на линии CLK -ОТПРАВКА БИТА }// i отправили 8 бит адреса registeradr-------------------------------------------- Serial.print(" data " ); for (byte sendbitdata=128; sendbitdata >= 1; sendbitdata=sendbitdata/2)// отправка 8 бит данных из массива print_digits[registeradr] { digitalWrite(clk,LOW);// Установить НИЗКИЙ уровень на линии CLK if ((print_digits[registeradr] & sendbitdata) > 0 ){ // если результат >0 то отправляем 1 digitalWrite(din,HIGH); //установили высокий уровень din Serial.print(1); } else{ digitalWrite(din,LOW); //установили низкий уровень din Serial.print(0); } digitalWrite(clk,HIGH);// ВЫСОКИЙ уровень на линии CLK -ОТПРАВКА БИТА }// sendbitdata отправили 8 бит содержащихся массиве print_digits[] //--------------------------------------------------------------------------------------- Serial.print(" send 16 bit " ); digitalWrite(load,HIGH);// отправка загруженных 16 бит load=1 }//registeradr // цикл записи всех регистров закончился и теперь необходимо установить changesettings=false; //чтоб не записывать регистры настройки в следующий раз changesettings=false; Serial.println("changesettings = false"); }//конец основного цикла----------------------