2014-09-14 2 views
2

4 자리 7seg 디스플레이에서 숫자를 출력하기 위해 두 개의 595 시프트 레지스터를 사용하는 데 문제가 있습니다.4 자리 7 세그먼트 LED 제어 74HC595 시프트 레지스터를 사용하여 디스플레이

정확하게 숫자를 표시하는 시점에 이르렀지만 출력물이 표시되는 숫자 사이에 약간의 쓰레기가 깜박 거리는 문제가 있습니다. 어떻게 이런 일이 일어나지 않도록합니까?

저는 레지스터에 바이트를 사용하여 표시되는 바이트 사이를 래칭한다는 것이 문제라는 것이 확실합니다.

여기

SHIFTOUT 기능을 효과적으로 래치를 강제 함수의 끝에서 낮은 클럭 핀을 설정하고, 나는 종류의 올바른처럼

int latchPin = 5; 
int clockPin = 6; 
int dataPin = 4; 

int i = 0; 

int waitTime = 500; 

// digits from the right 
byte colDig[4] = 
{ 
    B00001000, // digit 1 
    B00000100, // digit 2 
    B00000010, // digit 3 
    B00000001, // digit 4 
}; 

const byte digit[10] =  //seven segment digits in bits 
{ 
    B11000000, // 0 
    B11111001, // 1 
    B10100100, // 2 
    B10110000, // 3 
    B10011001, // 4 
    B10010010, // 5 
    B10000010, // 6 
    B11111000, // 7 
    B10000000, // 8 
    B10011000, // 9 
}; 
void setup() 
{ 
    pinMode(latchPin, OUTPUT); 
    pinMode(dataPin, OUTPUT); 
    pinMode(clockPin, OUTPUT); 
} 

void loop() 
{ 
    // step through each digit then increment 
    // the counter by one, until nine 
    for(int j = 0;j<9;j++){ 
     updateShiftRegister(0, j); 
     delay(waitTime); 
     updateShiftRegister(1, j); 
     delay(waitTime); 
     updateShiftRegister(2, j); 
     delay(waitTime); 
     updateShiftRegister(3, j); 
     delay(waitTime); 
    } 
} 

void updateShiftRegister(int col, int num) 
{ 
    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, colDig[col]); 
    shiftOut(dataPin, clockPin, MSBFIRST, digit[num]); 
    digitalWrite(latchPin, HIGH); 
} 
+0

배선 다이어그램을 표시 할 수 있습니까? – xmen

답변

1

그래서 보이는 내 코드입니다.

이 페이지의 코드를 약간 수정함으로써 나는 이것을 막을 수 있었고 지금은 완벽하게 작동합니다. http://arduino.cc/en/Tutorial/ShftOut23

// the heart of the program 
void shiftItOut(int myDataPin, int myClockPin, byte myDataOut) { 
    // This shifts 8 bits out MSB first, 
    //on the rising edge of the clock, 
    //clock idles low 

    //internal function setup 
    int i=0; 
    int pinState; 
    pinMode(myClockPin, OUTPUT); 
    pinMode(myDataPin, OUTPUT); 

    //clear everything out just in case to 
    //prepare shift register for bit shifting 
    digitalWrite(myDataPin, 0); 
    digitalWrite(myClockPin, 0); 

    //for each bit in the byte myDataOut 
    //NOTICE THAT WE ARE COUNTING DOWN in our for loop 
    //This means that %00000001 or "1" will go through such 
    //that it will be pin Q0 that lights. 
    for (i=7; i>=0; i--) { 
    digitalWrite(myClockPin, 0); 

    //if the value passed to myDataOut and a bitmask result 
    // true then... so if we are at i=6 and our value is 
    // %11010100 it would the code compares it to %01000000 
    // and proceeds to set pinState to 1. 
    if (myDataOut & (1<<i)) { 
     pinState= 1; 
    } 
    else { 
     pinState= 0; 
    } 

    //Sets the pin to HIGH or LOW depending on pinState 
    digitalWrite(myDataPin, pinState); 
    //register shifts bits on upstroke of clock pin 
    digitalWrite(myClockPin, 1); 
    //zero the data pin after shift to prevent bleed through 
    digitalWrite(myDataPin, 0); 
    } 

    //stop shifting 
    //digitalWrite(myClockPin, 0); 
} 

단순히 마지막 digitalWrite이 모든 것을 해결한다는 주석.

관련 문제