Вопрос по программированию драйвера 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 идущие данные. Но это чисто для понимания принципа работы, под конкретные цели можно оптимизировать чтоб не всё подряд выводил.