Совместное использование 74CH165 и 74CH595
- Войдите на сайт для отправки комментариев
Добрый день. Реализую небольшой проэкт для которого нужны кнопки и и четырехразрядный семисегментный индикатор. Случайно в руки попал готовый модуль от промышленного прибора с 6 кнопками и таким индикатором.
Внутри:
- 2 сдвиговых регистра 74CH595 подключенные каскадом;
- 1 cдвиговый регистр 74CH165;
- и какая-то микруха ( точно названия не помню , что-то типа 401060), судя по даташиту служит для аппаратного подавления дребезга.
У этого модуля имеется разьем на который и подключается питание +5, GND, MOSI, MISO, обший для всех микрух CLK и SS от 595 и от 165.
Подклюено так : CLK - pin 13 , MISO - pin 12, MOSI - pin 11, SS 165 - pin 9 , SS 595 - pin 8.
Библиотеку SPI.h не использую , т.к. с ней в обще не работает никак.
Отдельно изображение через 595 выводиться на отлично. И так же считывается с кнопок через 165 - тоже четко.
Но как только я в коде пытаюсь и выводить , то в момент считывания байта со 165 на дисплее подсвечиваюся все сегменты. Менял частоту считывания - все так же просто реже моргает. Пробовал играть с задержками в микросекундах между переключениями защёлок у регистров и командами shiftIn/shiftOut. Но все тщетно. Начинает уже немного все это злить. Вот и решил обратиться за помошью. Может образумите :)
int SS_595 = 8; int CLK = 13; int MOS1 = 11; int M1SO = 12; int SS_165 = 9; const int numeral[10]= { //ABCDEFG /dp B00111111, // 0 B00000110, // 1 B01011011, // 2 B01001111, // 3 B01100110, // 4 B01101101, // 5 B01111101, // 6 B00000111, // 7 B01111111, // 8 B01101111, // 9 }; const int razr[4] = { B10000000, B01000000, B00100000, B00010000 }; byte but = 72; int i = 0; int interval = 500; unsigned long prevmil = 0; unsigned long curmil = 0; void setup() { pinMode (SS_595, OUTPUT); pinMode (CLK, OUTPUT); pinMode (MOS1, OUTPUT); pinMode (M1SO, INPUT); pinMode (SS_165, OUTPUT); digitalWrite(SS_165,HIGH); } void loop() { i++; Number(i/10); curmil = millis(); if ( curmil - prevmil > 0.1*interval) { digitalWrite(SS_165, HIGH); digitalWrite(SS_165, LOW); but = shiftIn(M1SO, CLK, MSBFIRST); prevmil = curmil; } } void Number (int number) { for( int i = 0; i < 4; i++) { showDigit( number%10, i); number = number / 10; } } void showDigit (int number, int digit) { digitalWrite(SS_595, LOW); shiftOut(MOS1, CLK, LSBFIRST, razr[digit]); shiftOut(MOS1, CLK, MSBFIRST, numeral[number]); digitalWrite(SS_595, HIGH); delay(3); }
Совсем забыл. Пробовал на 2х разных UNO и одной NANO . Разницы никакой.
В общем. Проблемма решена. Если кому нужно будет. ЗАработал вот такой вариант кода: