반응형
/*
* 7seg_first.c
*
* Created: 2021-09-14 오전 10:52:54
* Author : esl
*/
#if 0
#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;
int j = 1;
int reverse = 1;
ISR (INT4_vect) {
reverse = -reverse;
}
int main(void)
{
DDRB = 0xff; //B 의 모든 포트를 출력포트로 사용
DDRC = 0xff; //C 의 모든 포트를 출력포트로 사용
PORTB = 0xff; //B 포트의 모든 출력은 1로 설정, 세븐세그먼트 셀렉터
EICRB = 0b10;
EIMSK = 0b00010000;
sei();
while(1){
for(; ; i+= reverse){
if(i == 1 && reverse == -1){
break;
}
for(j = 1; j < 10 ; j+= reverse){
if(j == 1 && reverse == -1){
break;
}
for(int t = 0; t < 400; t ++){ //400ms 마다 다음 곱하기가 실행된다
int ten = i * j / 10; //곱셈의 십의자리
int one = (i * j) % 10; // 곱셈의 일의 자리
PORTB ^= 1; //첫번째 비트를 부호 반전, 맨 왼쪽의 세븐 세그먼트 사용
PORTC = ~font[i]; //맨 왼쪽의 세븐 세그먼트애 i 값 출력
_delay_ms(1);
PORTC = 0; //잔상이 남지 않기 위해 세븐 세그먼트를 끔
PORTB ^= 1; //반전된 첫번쨰 비트를 다시 부호반전해서 모든비트 1로 설정
PORTB ^= 1<<1; //2번째 자리 비트를 반전, 2번쨰 세븐 세그먼트 선택
PORTC = ~font[j]; //두번째 세븐 세그먼트에 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
*/
#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;
int j = 1;
int reverse = 1;
ISR (INT4_vect) {
reverse = -reverse;
}
int main(void)
{
DDRB = 0xff; //B 의 모든 포트를 출력포트로 사용
DDRC = 0xff; //C 의 모든 포트를 출력포트로 사용
PORTB = 0xff; //B 포트의 모든 출력은 1로 설정, 세븐세그먼트 셀렉터
EICRB = 0b10;
EIMSK = 0b00010000;
sei();
while(1){
if(reverse == 1){
i = 1;
j = 1;
}
else{
i = 10;
j = 10;
}
while(1){
i += reverse;
if(i == 1 && reverse == -1 || i == 9 && reverse == 1){
break;
}
while(1){
if(j == 1 && reverse == -1 ){
j = 10;
break;
}
if(j == 9 && reverse == 1){
j = 1;
break;
}
j += reverse;
for(int t = 0; t < 200; t ++){ //400ms 마다 다음 곱하기가 실행된다
int ten = i * j / 10; //곱셈의 십의자리
int one = (i * j) % 10; // 곱셈의 일의 자리
PORTB ^= 1; //첫번째 비트를 부호 반전, 맨 왼쪽의 세븐 세그먼트 사용
PORTC = ~font[i]; //맨 왼쪽의 세븐 세그먼트애 i 값 출력
_delay_ms(1);
PORTC = 0; //잔상이 남지 않기 위해 세븐 세그먼트를 끔
PORTB ^= 1; //반전된 첫번쨰 비트를 다시 부호반전해서 모든비트 1로 설정
PORTB ^= 1<<1; //2번째 자리 비트를 반전, 2번쨰 세븐 세그먼트 선택
PORTC = ~font[j]; //두번째 세븐 세그먼트에 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;
}
반응형