본문 바로가기
임베디드/Atmega128

착시현상 7SEGMENT

by sj0020 2021. 1. 7.
/*
 * Ko_Timer_Counter_SL.c
 *
 * Created: 2021-01-07 오후 9:25:09
 * Author : Ko
 */ 

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL

volatile unsigned long timer0;   // 오버플로마다 1씩 증가될 변수

volatile unsigned int number;   // 증가되어 7-세그먼트 LED에 디스플레이 될 숫자
unsigned char led[]={0x48, 0x7D, 0xC4, 0x64, 0x71, 0x62, 0x43, 0x7C, 0x40, 0x70};

// 타이머 / 카운터0 인터럽트 서비스 루틴
ISR(TIMER0_OVF_vect) {
   
   timer0++;
   
   // 오버플로 횟수가 4의 배수일 때 10자리 또는 2의 배수일때 1자리 디스플레이
   if(timer0 % 2 ==0){
      PORTC = (timer0%4==0) ? led[(number%100) / 10] : led[number%10];
      PORTD = (PORTD | 0xC0) & ~(1<<((timer0 % 4 == 0) ? PD7 : PD6));
   }
}

int main(void){
   
   DDRC = 0xFF;
   DDRD |= 1 << PD7 | 1<<PD6;      // 번갈아가며 7-세그먼트 LED를 켜기 위한 출력
   
   TCCR0 = 1<<CS02 | 1<<CS01;      // 256 프리스케일 설정
   TIMSK |= 1<<TOIE0;            // 타이머/카운터0 인터럽트 활성화
   
   timer0 = 0;
   sei();
   
   number = 12;
   while(1);
   
   return 0 ;
}

timercounter.pdsprj
0.02MB

12가 떠야하는데 2와 1이 겹쳐져서

   ㅡ

     ㅣ

   ㅡ

 ㅣ ㅣ

   ㅡ    이렇게 뜸.. 7segment를 두자리껄 쓰지말고 한자리수 두개를 써볼것?