본문 바로가기

카테고리 없음

마이크로프로세서_7-seg 곱셈

반응형
/*

* 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;



}

 

반응형