반응형
#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
반응형