Решение и скетч Код (Text): $regfile = "m8def.dat" $crystal = 8000000 Config Portd = Output 'значение этой переменной должны будем вывести на индикатор Dim A As Word 'переменные для преобразования исходного числа Dim N1 As Byte Dim N2 As Byte Dim N3 As Byte Dim N4 As Byte Dim M1 As Integer Dim M2 As Integer Dim M3 As Integer Dim M4 As Integer 'для значений отправляемых в регистр Dim R As Byte Do A = 1234 'значение переменной для вывода на индикатор 'раскладываем число на составляющие M1 = A M2 = M1 M3 = M1 M4 = M1 M1 = M1 / 1000 'M1 = 1234/1000 = 1,234 N1 = Abs(m1) 'N1 = Abs (1,234) = 1 M2 = M2 Mod 1000 'M2 =1234 Mod 1000 = 234 M2 = M2 / 100 'M2 = 234 / 100 = 2,34 N2 = Abs(m2) 'N2 = Abs (2,34) = 2 M3 = M3 Mod 100 M3 = M3 / 10 N3 = Abs(m3) M4 = M4 Mod 10 N4 = Abs(m4) 'начинаем задвигать данные в регистр Portd = &B00000010 R = Lookup(n4 , Numbers) 'первыми идут единицы Gosub Registr 'подпрограмма отправки данных в регистр Portd = &B00000100 R = Lookup(n3 , Numbers) 'отправляем десятки Gosub Registr Portd = &B00001000 R = Lookup(n2 , Numbers) 'отправляем сотки Gosub Registr Portd = &B00010000 R = Lookup(n1 , Numbers) 'отправляем тысячи Gosub Registr Loop End 'конец программы 'массив с кодами для семисегментника Numbers: Data &B11000000 '0 Data &B11111001 '1 Data &B10100100 '2 Data &B10110000 '3 Data &B10011001 '4 Data &B10010010 '5 Data &B10000010 '6 Data &B11111000 '7 Data &B10000000 '8 Data &B10010000 '9 'подпрограмма отправки данных в регистр Registr: Shiftout Portd.5 , Portd.6 , R , 1 'задвигаем данные Pulseout Portd , 7 , 10 'защелкиваем регистр Waitms 5 Return Вот ссылка как реализовать на одном 595 http://avrproject.ru/index/podkljuc...hc595_dinamicheskaja_indikacija_primer_1/0-16 Переписать код на Ардуино кто-нибудь сможет помочь????
Основа вот: Код (Text): // для записи в 74HC595 нужно притянуть пин строба к земле digitalWrite(LATCH_PIN, LOW); // задвигаем (англ. shift out) байт-маску бит за битом, // начиная с младшего (англ. Least Significant Bit first) shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]); // чтобы переданный байт отразился на выходах Qx, нужно // подать на пин строба высокий сигнал digitalWrite(LATCH_PIN, HIGH); Отсюда http://wiki.amperka.ru/конспект-arduino:счетчик-нажатий Повторить 4 раза для разных стробов выбора разряда так же понадобится Код (Text): //Значения для отображения на каждом из 4 разрядов int8_t Disp[4]; //Выводим значение отсрочки срабатывания таймера на дисплей Disp[0] = Value/1000; //тысячи Disp[1] = (Value/100)%10; //сотни Disp[2] = (Value/10)% 10; //десятки Disp[3] = Value% 10; //еденицы //Disp[i] должно быть вместо clicks в "segments[clicks]"
Спасибо, буду разбираться и возможно напишу скетч Чтобы кому-то было полезно в разработке. У меня на три числа семисегмент с общим анодом Ba56-12gwa
Собственно, вот скетч. Постарался максимально рассказать в комментариях Код (Text): // DS отвечает за поток битов(данные). На Схеме 595 пин 14 #define DATA_PIN 4 //STCP отвечает за так называемое защелкивание. Когда мы все свои биты передали, посылаем сигнал, что окончили передачу. На Схеме 595 пин 12 #define LATCH_PIN 3 // SHCP отвечает за ШИМ. Когда 1 из данных забирается бит, 0 пропускается.Синхронизация потока. На Схеме 595 пин 11 #define CLOCK_PIN 2 const int digitPins[3] = {52,51,50}; //Массив пинов. Выбрал произвольные кониакты у меня Мега int8_t Disp[3]={0};// задается тип int8_t чтобы к нам ничего, кроме набора бит не попало. int Value = 567; //значение для отображения на индикаторе byte i=0; byte segments[10] = { //Массив из 10 значений B11000000, //0 B11111001, //1 B10100100, //2 B10110000, //3 B10011001, //4 B10010010, //5 B10000010, //6 B11111000, //7 B10000000, //8 B10010000 //9 Бинарное значение цифры в моем подключении индикатора и сдвигового регистра, когда q1->a,..q7->g,q0->DP }; void setup() { for(byte j=0;j<3;j++)pinMode(digitPins[j],OUTPUT); //цикл - назначаем всем режим выход из нашего массива пинов pinMode(DATA_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LATCH_PIN, OUTPUT); } // Моя функция для работы с индикатором и сдвиговым регистром 74НС595 void printInd() { //цифровые выходы из массива в 0 (LOW) - отключаем используем цикл for(byte d=0; d<3; d++) digitalWrite(digitPins[d], LOW); //Для начала записи в 74HC595 нужно подать 0 на STCP (открыть) digitalWrite(LATCH_PIN, LOW); // с данными выпускаем поток битов на DS синхроннированные с SHCP shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, segments[Disp[i]]); // А теперь когда последний бит числа передали закрываем digitalWrite(LATCH_PIN, HIGH); //на индикатор подаем 5V смотреть в DATASHEET вашего индикатора!!! digitalWrite(digitPins[i], HIGH); delayMicroseconds(300); //Частота мирцания и собственно она же яркость индикатора:) //delay(1000);// проследить появление i++; if(i > 2) i=0; } void loop() { //Выводим значение отсрочки срабатывания таймера на дисплей Disp[0] = (Value/100)%10; //сотни Disp[1] = (Value/10)%10; //десятки Disp[2] = Value%10; //единицы printInd(); //Функция для отображения на индикаторе } Как работает запись Взял отсюда При свете настольной лампы При минимальном освещении Судя из Datasheet у моего индикатора Минимальный порог 3600 мкД И рабочий 8600 мкД Мне нравится, достаточно ярко и можно использовать другие значения для яркости delayMicroseconds