2014-10-04 65 views
0

努力學習一些低級AVR-C,我試圖學習如何驅動2個7段顯示器和2個引腳,並從7個引腳供電(在理論)。兩個顯示器的所有七段都由相同的端口(PortC)驅動。驅動器2 7段顯示器有一個寄存器

我使用this tutorial作爲指導。我的版本在學習過程中要簡單得多。我附上了粗略的示意圖(請給我!)和我的代碼。

根據我的顯示器接線方式,即第1段和第2段上的共陰極連接到PIN碼A0和A1(PC0/PC1)。當這些PINS變低時,電路完成並且LED點亮。

在本教程中,他們將每段LED的陽極(A-G)串聯連接,並使用6個引腳驅動7個顯示器。在我的,我只有2個顯示器。

我該如何做到這一點?

2-7 Segment Display

#include "avr/delay.h" 

void setLedPorts (uint8_t dig); 

void setup() 
{ 
    Serial.begin(115200); 
    DDRD |= 0b11111100; 
    DDRB |= 0b00000011; 
    DDRC |= 0b00000011; // Control port A0/PC0 && A2/PC1 


} 

void loop() 
{ 
    uint8_t cmask = 0b11111100; 
    while(1) 
    { 
     for(int i = 0; i < 100; i++){ 

      setLedPorts(i/10); 
      PORTC = ~(0x01); 

      //setLedPorts(i%10);// when I uncomment these to lines, Segment2 only works   
      //PORTC = ~(0x02); 

      _delay_ms(100); 
     } 
    } 
} 


void setLedPorts (uint8_t dig){ 
    uint8_t dmask = 0b00000011; 
    uint8_t bmask = 0b11111100; 
    switch (dig) 
    { 

     case 0: 

     PORTD = 0b10111100 & ~dmask; 
     PORTB = 0b00000011 & ~bmask; 
     break; 
     case 1: 
     PORTD = 0b00001000 & ~dmask; 
     PORTB = 0b00000010 & ~bmask; 
     break; 
     case 2: 
     PORTD = 0b11110000 & ~dmask; 
     PORTB = 0b00000011 & ~bmask; 
     break; 
     case 3: 
     PORTD = 0b1011000 & ~dmask; 
     PORTB = 0b00000011 & ~bmask; 
     break; 
     case 4: 
     PORTD = 0b01001100 & ~dmask; 
     PORTB = 0b00000010 & ~bmask; 
     break; 
     case 5: 
     PORTD = 0b11011100 & ~dmask; 
     PORTB = 0b00000001 & ~bmask; 
     break; 
     case 6: 
     PORTD = 0b11111100 & ~dmask; 
     PORTB = 0b00000001 & ~bmask; 
     break; 
     case 7: 
     PORTD = 0b10001000 & ~dmask; 
     PORTB = 0b00000011 & ~bmask; 
     break; 
     case 8: 
     PORTD = 0b11111100 & ~dmask; 
     PORTB = 0b00000011 & ~bmask; 
     break; 
     case 9: 
     PORTD = 0b11001100 & ~dmask; 
     PORTB = 0b00000011 & ~bmask; 
     break; 
     default: 
     PORTD = 0b11111100 & ~dmask; 
     PORTB = 0b00000011 & ~bmask; 
     break; 
    } 

} 

編輯

我幾乎得到了它。通過將我的while循環更改爲:

for(int i = 0; i < 100; i++){ 
    setLedPorts(i/10);  
    PORTC = ~(0x01);      
    _delay_ms(10);  
    setLedPorts(i%10); 
    PORTC = ~(0x02); 
    _delay_ms(1000); 
} 

Segment1顯示第一個數字,但閃爍。我該如何解決這個問題?

回答

1

嘗試閱讀圖表和文本後,我有點困惑。不要試圖查看電路和/或程序的細節。你很快就會迷路。

如果你想看到所有可能的數字,你需要所有的細分。這意味着7段(8如果你想要小數點),所以你需要7(或8)位端口。然後兩個端口位數字陰極。

複用兩個公共陰極顯示設備的硬件必須是這樣的:

  • 連接對應的段(即AG)一起
  • 它們連接到7行寄存器/端口的要使用
  • 使用兩條線,每條陰極各一條。

爲了正確,您應該使用電阻器限制每個段中的電流,但對於實驗而言,您可以避開處理器的內部限制。

然後,軟件應該這樣做:

初始化:

  • 集合中的所有使用位(段和陰極),以1
  • 設定的所有端口爲輸出

環路:

  • 設置要在顯示器1點亮以1
  • 設置位顯示1至低(顯示屏應顯示數)
  • 等待了一下位,說10ms的
  • 切換顯示的位1到高(關)

  • 設置要在顯示器2的光,以1

  • 爲顯示器2的位設置爲低的位(顯示應顯示數)
  • 等待位,比如10ms
  • 將顯示器2的位切換爲高(關)

  • 轉至循環。

+0

謝謝 - 請參閱我的編輯。我嘗試了你的建議。我快到了。第一位數字顯示一個數字,但閃爍。如何防止閃爍的號碼? – PhillyNJ 2014-10-04 22:26:13

+0

明顯閃爍意味着你的程序中有一些東西慢到足以引起它。你在調用正確的延遲例程嗎?第二個數字是否出現(可能是數字閃爍,因爲第二個數字沒有出現)?請注意,在2次10ms(即每秒50次)時,應該顯示很少的閃爍。 – jcoppens 2014-10-05 17:31:21