나는 하루 종일 붙어 있었고 두 개의 7 세그먼트 디스플레이를 사용하여 카운트 다운 타이머를 만들려고합니다. 나는 그것이 20에서 시작하여 0까지 카운트하기를 원한다. 1< 동안 나는 왼쪽 디스플레이 만 켜 놓고 싶습니다 (즉, 수십 자리에 0이 없음). Atmega 324A를 사용하고 있습니다. 모든 포트 C가 디스플레이 세그먼트에 연결되어 있고 PIND0을 사용하여 두 포트를 전환합니다. 여기까지 내가 지금까지 가지고있는 것이있다. 이가이 일을하는 동안에 나는 seven_seg [] 배열을 반복하는 루프에 대한 또 다른 필요 0하려면 모두 표시를 설정 않는 모든AVR에서 멀티플렉싱 7 세그먼트 디스플레이
#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);
}
}
? 이 문제를 다루는 방법을 정말로 모릅니다. 어떤 도움이라도 좋을 것입니다.
코드가 올바르지 않습니다. 'seven_seg'는 단지'uint8_t' 일 때 어떻게 배열을 저장할 수 있습니까? 그리고 왜 16 진수 (또는 컴파일러가 해당 확장을 지원할 경우 바이너리)를 사용하지 않는가? 10 진수를 사용하여 세그먼트를 실현하는 것이 훨씬 더 어려울 것입니다. 들여 쓰기를 수정하십시오 –
질문에 대해서는 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