본문 바로가기

카테고리 없음

분조기 256 count 57 / 카운트

반응형
#if 0
/*

* 7seg_first.c

*

* Created: 2021-09-14 오전 10:52:54

* Author : esl

*/


#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h> //_delay_ms 함수 사용을 위한 헤더


unsigned char font[10] = { //0~ 9 까지 값을 정의

	0xc0,0xf9,0xa4,

	0xb0,0x99,0x92,

	0x82,0xf8,0x80,0x90

};

int i = 1;

ISR (INT4_vect) {
	i += 1;
}

int main(void)

{


	DDRB = 0xff; //B 의 모든 포트를 출력포트로 사용
	DDRC = 0xff; //C 의 모든 포트를 출력포트로 사용


	PORTB = 0xff; //B 포트의 모든 출력은 1로 설정, 세븐세그먼트 셀렉터

	EICRB = 0b10;
	EIMSK = 0b00010000;
	sei();


	while(1){
		int sec = i % 60;
		int one = sec % 10;
		int ten = sec / 10;
		int min = (i/60)%60;
		int back = min %10;
		int hour = min / 10;
		

		//int one = i%10; // 곱셈의 일의 자리

		PORTB ^= 1; //첫번째 비트를 부호 반전, 맨 왼쪽의 세븐 세그먼트 사용

		PORTC = ~font[hour]; //맨 왼쪽의 세븐 세그먼트애 i 값 출력


		_delay_ms(1);

		PORTC = 0; //잔상이 남지 않기 위해 세븐 세그먼트를 끔

		PORTB ^= 1; //반전된 첫번쨰 비트를 다시 부호반전해서 모든비트 1로 설정

		PORTB ^= 1<<1; //2번째 자리 비트를 반전, 2번쨰 세븐 세그먼트 선택



		PORTC = ~font[back]; //두번째 세븐 세그먼트에 j 값 출력



		_delay_ms(1);

		PORTC = 0; //잔상이 남지 않기 위해 세븐 세그먼트를 끔

		PORTB ^= 1<<1; //반전된 비트를 다시 부호반전해서 모든 비트 1로 설정



		PORTB ^= 1<<2; //2번째 자리 비트 부호 반전, 3번째 세븐 세그먼트 선택, 십의자리

		PORTB = 0b00001011;



		PORTC = ~font[ten]; //세번째 세그먼트는 십의자리 임으로 곱셈의 10의자리 출력



		_delay_ms(1);

		PORTC = 0; //잔상이 남지 않기 위해 세븐 세그먼트를 끔

		PORTB ^= 1<<2; //2번째 자리 부호비트 반전해서 모든 비트 1로 설정



		PORTB ^= 1<<3; //3번째자리 부호비트 반전, 4번째 세븐 세그먼트 선택, 일의 자리



		_delay_ms(1);

		PORTC = ~font[one]; //네번째 세그먼트는 일의자리임으로 마지막자리



		_delay_ms(1);

		PORTC = 0; //잔상이 남지 않기 위해 세븐 세그먼트를 끔

		PORTB ^= 1<<3; //3번쨰 비트를 반전시켜 모든 비트를 1로 설정

		_delay_ms(1); //for t 루프를 돌며 400ms 동안 켜지게 설정


	}







	return 0;



}
#endif

/*

* 7seg_first.c

*

* Created: 2021-09-14 오전 10:52:54

* Author : esl

*/
#if 1

#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h> //_delay_ms 함수 사용을 위한 헤더


unsigned char font[10] = { //0~ 9 까지 값을 정의

	0xc0,0xf9,0xa4,

	0xb0,0x99,0x92,

	0x82,0xf8,0x80,0x90

};

int i = 0;
int cnt = 0;
ISR (INT4_vect) {
	i = 0;
	cnt = 0;
}

ISR(TIMER0_OVF_vect){
	cnt += 1;
	//i+=1;
	if(cnt == 113){
		i+= 1;
		cnt = 0;
	}

TCNT0 = 256-255;
}

int main(void)

{

	DDRB = 0xff; //B 의 모든 포트를 출력포트로 사용
	DDRC = 0xff; //C 의 모든 포트를 출력포트로 사용


	PORTB = 0xff; //B 포트의 모든 출력은 1로 설정, 세븐세그먼트 셀렉터

	EICRB = 0b10;
	EIMSK = 0b00010000;
	
	TIMSK = 1;
	TCCR0 = 5;
	TCNT0 = 256-255;
	
	sei();



	while(1){
		int sec = i % 60;
		int one = sec % 10;
		int ten = sec / 10;
		int min = (i/60)%60;
		int back = min %10;
		int hour = min / 10;
		

		//int one = i%10; // 곱셈의 일의 자리

		PORTB ^= 1; //첫번째 비트를 부호 반전, 맨 왼쪽의 세븐 세그먼트 사용

		PORTC = ~font[hour]; //맨 왼쪽의 세븐 세그먼트애 i 값 출력


		_delay_ms(1);

		PORTC = 0; //잔상이 남지 않기 위해 세븐 세그먼트를 끔

		PORTB ^= 1; //반전된 첫번쨰 비트를 다시 부호반전해서 모든비트 1로 설정

		PORTB ^= 1<<1; //2번째 자리 비트를 반전, 2번쨰 세븐 세그먼트 선택



		PORTC = ~font[back]; //두번째 세븐 세그먼트에 j 값 출력



		_delay_ms(1);

		PORTC = 0; //잔상이 남지 않기 위해 세븐 세그먼트를 끔

		PORTB ^= 1<<1; //반전된 비트를 다시 부호반전해서 모든 비트 1로 설정



		PORTB ^= 1<<2; //2번째 자리 비트 부호 반전, 3번째 세븐 세그먼트 선택, 십의자리

		PORTB = 0b00001011;



		PORTC = ~font[ten]; //세번째 세그먼트는 십의자리 임으로 곱셈의 10의자리 출력



		_delay_ms(1);

		PORTC = 0; //잔상이 남지 않기 위해 세븐 세그먼트를 끔

		PORTB ^= 1<<2; //2번째 자리 부호비트 반전해서 모든 비트 1로 설정



		PORTB ^= 1<<3; //3번째자리 부호비트 반전, 4번째 세븐 세그먼트 선택, 일의 자리



		_delay_ms(1);

		PORTC = ~font[one]; //네번째 세그먼트는 일의자리임으로 마지막자리



		_delay_ms(1);

		PORTC = 0; //잔상이 남지 않기 위해 세븐 세그먼트를 끔

		PORTB ^= 1<<3; //3번쨰 비트를 반전시켜 모든 비트를 1로 설정

		_delay_ms(1); //for t 루프를 돌며 400ms 동안 켜지게 설정


	}







	return 0;



}
#endif
반응형