led модуль 8 на 8 помощь в коде
- Войдите на сайт для отправки комментариев
Вс, 30/09/2012 - 21:59
Решил побаловаться с модулем диодов 8 на 8. сделал букву П бегущую. Вопрос-можно както уменьшить код или так и придется писать столько строк под каждую букву????
n1 это минус led это плюс
int n1=49; int n2 =11; int n3 = 8; int n4=13; int n5=51; int n6=7; int n7 = 2; int n8=5; ////////////////////// int led1=12; int led2=3; int led3=4; int led4=53; int led5=6; int led6=52; int led7=10; int led8=9; int var =0; void setup() { pinMode(n1, OUTPUT); pinMode(n2, OUTPUT); pinMode(n3, OUTPUT); pinMode(n4, OUTPUT); pinMode(n5, OUTPUT); pinMode(n6, OUTPUT); pinMode(n7, OUTPUT); pinMode(n8, OUTPUT); ///////////// pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); pinMode(led7, OUTPUT); pinMode(led8, OUTPUT); } void loop() { // 1 var = 0; while(var<200) {var++; digitalWrite(n3,1); digitalWrite(led1, 1); digitalWrite(led2, 1); digitalWrite(led3, 1); digitalWrite(led4, 1); delay(1); digitalWrite(n3,0); digitalWrite(led1, 0); digitalWrite(led2, 0); digitalWrite(led3, 0); digitalWrite(led4, 0); // лево digitalWrite(led1, 1); digitalWrite(n4, 1); digitalWrite(n5, 1); digitalWrite(n6,1); delay(1); digitalWrite(led1, 0); digitalWrite(n4, 0); digitalWrite(n5, 0); digitalWrite(n6,0); // право digitalWrite(led4, 1); digitalWrite(n4, 1); digitalWrite(n5, 1); digitalWrite(n6,1); delay(1); digitalWrite(led4, 0); digitalWrite(n4, 0); digitalWrite(n5, 0); digitalWrite(n6,0); } }
Извините в первом не тот код вставил
Ну вы же уже это делали с 7-сегментным индикатором... объявляли массив битов (битовую маску) и через функцию выводили на дисплей, здесь такой же принцип...
Пробовал не получилось. я счас напрямую без регистра поэтому немного сложнее
Наоборот еще проще, что пробовали показыжите
Я пробовал данные в массиве( с кода часов) которые были для регистра поменять на led1 led2 и т.д. но ничего не получилось . 1 буква почти 5 тысяч байт ужас
если каждую букву так писать то охренеть можноу меня заняла кучу строк а их 36 еще и 10 цифр
Определитесь с размером символа если будет кирилица, то рекомендую 8х6, а если только латинские то можно 8х5
Вот пример:
символ 4 на 4. у вас пример для сдвигового регистра на сколько я понял
У меня пример для символа 8х6, какая разница для чего он? Сдвиговый регистр - это всего лишь преобразователь последовательных даных в параллельный вывод. И как вы хотите в поле 4х4 изобразить например букву М?
Вы буквы видите, которые вырисовываются из битов?
да буквы вижу. растяну 5 на 4 для м
у меня получается я рисую полосами . наприме для т сначала код для верхней полосы зажигаю ее делаю паузу гашу диоды и тоже самое для ножки
Ну так вот один байт (В10000001) - это вертикальная полоса, состоящая из 8 точек.
dW(n3,1);
dw(led3-led7,1);
delay(1);
dW(n3,0);
dw(led3-led7,0);
получилась шляпка на 5 символов
dW(led5,1);
dw(n4-n6,1);
delay(1);
dW(led5,0);
dw(n4-n6,0);
я понимаю про что вы. тока как это сделать в моем случаи???
Использовать высоту символа 4 точки - это не рационально. Ладно, а букву Е как изобразите? Минимум 5 точек, а лучше сразу 7 или 8.
пока у меня проблема в том как оптимизировать процес
если можно на примере моего кода
я понимаю про что вы. тока как это сделать в моем случаи???
Точно также
куда тут его нужно вставить???
Для дальнейшего понимания каким способом можно выводить информацию на дисплей, вот вам пример как оптимизировать инициализацию выводов:
куда тут его нужно вставить???
В начало кода где объявляются глобальные переменные
а void loop если можно для примера
или если не трудно полный код для 1 буквы
или если не трудно полный код для 1 буквы
что то так и ниче не догоняю
частично понял остлось догнать как несколько вводить символов в строку
Обьявить массив под строку и написать функцию, которая будет заполнять массив кодами символов.
получается каждая буква свой массив?
Не совсем. Как вы видите byte mask[][6] - это двумерный массив, то есть массив массивов и каждый массив из этого массива - это одна буква.
всеравно не догоняю напишите пожалуста полный код для 1 буквы а там по аналогии разберусь .
я пишу букву код заганяю в подмассив(массив в массиве) так??? в коде часов у меня 1 строкой писалась цифра мне нужно было открыть тока плюсы и 1 минус .тут я в 1 строку только 3 часть буквы или цифры смогу написать. получается я открываю минус и 3 плюса например
dW(catods[1],1);
dW(anods[1],1); dw(anods[2],1); и т.д. грубо говоря это тоже самое сто и B11000000 я правильно понял?
как это сделать через регистр я понимаю а вот как это сделать без него никак не догоню
1 byte anods[8] = {49, 11, 8, 13, 51, 7, 2, 5};
2 byte catods[8] = {12, 3, 4, 53, 6, 52, 10, 9};
получается B11000000 запустит контакт 49 и 11?
1 byte anods[8] = {49, 11, 8, 13, 51, 7, 2, 5};
2 byte catods[8] = {12, 3, 4, 53, 6, 52, 10, 9};
получается B11000000 запустит контакт 49 и 11?
Да, все верно, именно такой подход. Теперь вам нужно написать функцию, которая будет принимать этот байт и выводить его на 8 анодов (на 8 точек), что бы пока вам не заморачиваться по поводу сдвигов битов можно использовать функцию bitRead. Пока сделайте все просто на одном катоде, потом уже будете разбираться с катодами...
bitRead ()
Описание
Читает немного числа.
Синтаксис
bitRead (х, п)
Параметры
х: номер, с которого читать
п: какой бит для чтения, начиная с 0 для наименее значимым (крайний справа) немного
Возвраты
Значение бита (0 или 1). новсеравно не понял как должно выглядить
У вас 8 анодов подключенных к выводам дуины. Одним выводом вы управляете функцией digitalWrite(anod, 1) или digitalWrite(anod, 0). Ваша функция (котору вы пытаетесь написать) принимает байт, состоящий из 8 бит и вам нужно каждый бит вытащить из этого байта и поместить в 8 функций digitalWrite(anod1, бит№0), digitalWrite(anod2, бит№1), digitalWrite(anod3, бит№2) и т.д.. Что бы не плодить 8 практически одинаковых строк можно все это сделать в цикле.
получается например B10000001
B11!!1!!!00000
bitRead(2,3); это единица во второй строчке???
где Х - возврачаемое значение 0 или 1 (бит)
извините наверное я туплю но что это нам дает.
как будеть выгледить весь код если нужно зажечи в 1 строке матрицы 1 5 7 диоды?
пример сверху касается только X ????
Вот так
просто к сведению - нумерация битов идет с права на лево.
я имел ввиду в таком виде как она должна выглсядеть.
В общем ладно, я уже утомился, сложно вот так обьяснить в форуме что, куда и откуда. Вот так работает?
это тоже самое что и так:
можете поэтапно описать что происходит в строчке digitalWrite(anod[0], bitRead(line, 0)); ???
digitalWrite(anod[0], bitRead(line, 0)); ??? даем сигнал на 0 анод(контакт обьявленый в начале )
bitRead(line, 0)); ??? определяем относительно B00000000 чему будет равнятся 0 или 1 этод анод(вернее включится он или нет)
если я все правильно понял digital write(49,0 или 1);
я просто не понимаю как полностью должен выглядить void setup и loop
какя понимаю матрицу типа как вы мне писали выше
byte mask я должен назначить чтоб мог брать значения для bitRead(line, 0));
Вроде все правильно понимаете, не торопитесь всему свое время. Так заработало? 1, 5 и 7 загорелись? а точнее если все катоды подключены должны были загореться 3 линии...
горит 2 линии(3 и 5) . bitRead(line, i) - не проходит поскольку как я понимаю ей неоткуда брать значения
Так у вас катоды через транзисторы (транзисторную сборку) подключены?
да минусы на транзисторах
bitRead(line, i) - не проходит поскольку как я понимаю ей неоткуда брать значения
Как это неоткуда??? из byte line = B01010001; как видите 1, 5 и 7 биты в единице
Так понятно тогда так 3 точки горят???
все горит теперб надо сделать 8 строк byte line
В смысле все горит??? Все точки горят или только нужные 3 ????
только нужные