Совместное использование 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 . Разницы никакой.
В общем. Проблемма решена. Если кому нужно будет. ЗАработал вот такой вариант кода:
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); //Serial.begin(9600); } void loop() { i++; if (i>9999) {i=0;} 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; } if (curmil - prevmil < 0 ) { prevmil = curmil; } // Защита от последствий переполнения функции millis() //Serial.println(but, BIN); //Serial.println("----------------------"); } 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); delayMicroseconds(20); }