努力學習一些低級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個顯示器。
我該如何做到這一點?
#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顯示第一個數字,但閃爍。我該如何解決這個問題?
謝謝 - 請參閱我的編輯。我嘗試了你的建議。我快到了。第一位數字顯示一個數字,但閃爍。如何防止閃爍的號碼? – PhillyNJ 2014-10-04 22:26:13
明顯閃爍意味着你的程序中有一些東西慢到足以引起它。你在調用正確的延遲例程嗎?第二個數字是否出現(可能是數字閃爍,因爲第二個數字沒有出現)?請注意,在2次10ms(即每秒50次)時,應該顯示很少的閃爍。 – jcoppens 2014-10-05 17:31:21