Atmega328 และ 4Digit 7 Segment ghost กระพริบ!

Sep 13 2020

ฉันต่อไฟ LED 7Seg (CC) 4 ตัวพร้อมทรานซิสเตอร์ NPN ที่แคโทดของแต่ละหลัก ฉันใช้ทะเบียนกะ 74HC595 ที่เชื่อมต่อในวงจรแบบธรรมดา รหัสที่ฉันใช้เป็นรหัสการสแกนพื้นฐานสำหรับ 7seg ปัญหาคือฉันเห็นตัวเลขที่สแกนบนตัวเลข LED อื่น ๆ ด้วย ภาพที่แนบมาคือ ฉันเรียกมันว่า "ผี" วงจรที่ฉันใช้มี Atmega328 พร้อม 8MHz Osc ภายใน ตัวต้านทานบนเซ็กเมนต์คือ 220Ohm และ 4 BC547 บนแคโทดของตัวเลขที่มีตัวต้านทาน 1kOhm บนฐาน

ด้านล่างนี้คือรหัส:

ห่วงเป็นโมฆะ () {
 
      cathode_high (); // ทำให้หน้าจอว่างเปล่า
  
      break_number (หมายเลข);
      
      display_number ();
     ล่าช้า (1);

    
}

โมฆะ break_number (int num) {// แยกหมายเลขอินพุตเป็น 4 หลักเดียว

  first_digit = num / 1000;
  หลัก [0] = first_digit;  

  int first_left = num - (first_digit * 1000);
  second_digit = first_left / 100; 
  หลัก [1] = second_digit;
  int second_left = first_left - (second_digit * 100); 
  third_digit = second_left / 10; 
  หลัก [2] = third_digit; 
  four_digit = second_left - (third_digit * 10);
  หลัก [3] = หลักที่สี่;
  
  
}

โมฆะ display_number () {// scan
   
  cathode_high (); 
  digitalWrite (สลัก LOW); 
  shiftOut (ข้อมูล, clk, LSBFIRST, ตัวเลข [หลัก [จำนวน]]); 
  digitalWrite (CAS [จำนวน], สูง); 
  digitalWrite (สลักสูง); 
  นับ ++; 
  ถ้า (นับ == 4) {
    นับ = 0;
  }
}

เป็นโมฆะ cathode_high () {// ปิดทั้ง 4 หลัก
  digitalWrite (CA_1, LOW);
  digitalWrite (CA_2, LOW);
  digitalWrite (CA_3, LOW);
  digitalWrite (CA_4, LOW);
}

ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก ขอบคุณล่วงหน้า!

คำตอบ

4 Gerben Sep 13 2020 at 20:37

คุณเปลี่ยนแคโทด (หลัก) ก่อนที่จะล็อคข้อมูลใหม่ ดังนั้นในช่วงเวลาที่สองข้อมูลสำหรับตัวเลขก่อนหน้านี้จะแสดงบนตัวเลขปัจจุบัน

การสลับdigitalWrite(CAS[count], HIGH);และdigitalWrite(latch, HIGH);ควรแก้ไข