我一直在这一整天,我试图创建一个使用两个七段显示倒数计时器。我希望它从20开始倒数到零。虽然10 <我只想在左边显示(即在十位没有0)。我使用的是Atmega 324A。我已将端口C的所有端口连接到显示段,并使用PIND0在两者之间切换。这是我到目前为止。在AVR上多路复用七段显示Atmega324A
#include <avr/io.h>
#include<util/delay.h>
int main(void) {
int prescale = (8000000/8)/1000-1;
int digit = 1;
uint8_t display;
int seven_seg = {0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0C07,0X7F,0X6F};
// Set OC1 to output
DDRD = (1<<0);
DDRC = 0xFF;
OCR1A = prescale;
//clear counter on compare match
TCCR1A = (0<<COM1A1) | (1<<COM1A0);
//Set Prescale and CTC Mode
TCCR1B = (0<<CS12) | (1<<CS11) | (0<<CS10) | (0<<WGM13) | (1<<WGM12);
while(1) {
display++;
if(display>50) display = 0;
for (i = 250; i>0; i--){
PORTD ^= 0<<PIND0;
PORTC = seven_seg[display%10];
PORTD ^= 1<<PIND0;
_delay_ms(100);
for (i = 250; i>0; i--){
PORTD ^= 1<<PIND0;
PORTC = seven_seg[display/10];
PORTD ^= 0<<PIND0;
_delay_ms(100);
}
}
while((TIFR1 & (1<<OCF1A)) == 0) {}
TIFR1 &= (1 << OCF1A);
}
}
这一切并设置两个显示器为0。我是否需要另一个用于遍历seven_seg []数组迭代它这样做的同时?真的不知道如何解决这个问题。任何帮助都会很棒。
您的代码不正确。 'seven_seg'如何存储一个数组,而它只是'uint8_t'?为什么不使用十六进制(或者如果你的编译器支持该扩展则使用二进制)?使用十进制来实现这些段会更困难。请修正缩进 –
对于这个问题,为什么不检查MSD是否为0并且什么也不显示? –
如果你的编译器允许'int seven_seg = {0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0C07,0X7F,0X6F};',得到一个新的编译器。怀疑你想'int seven_seg []/* add [] */= {0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07/*不是0C07 * /,0X7F,0X6F};' – chux