ATMEGA128 FND제어 실험

2023. 6. 1. 00:11Embedded/마이크로프로세서

728x90
  • FND 1
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 16000000UL

unsigned char SEG[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

void Initial_set(){
	DDRF = 0xFF;
	PORTF = 0xFF;
	DDRB = 0x0F;
	PORTB = 0x08;
}

int main(){  
	Initial_set();
	int i = 1;
	while(1){
		PORTB = 0x0E;
     		PORTF = SEG[i%100%10];
    		_delay_ms(5);

    		PORTB = 0x0D;
    		PORTF = SEG[i%100/10];
    		_delay_ms(5);

    		PORTB = 0x0B;
    		PORTF = SEG[i/100];
    		_delay_ms(5);

		i++;
		if (i>999) i=0;
		}
   return 0;
}
  • 코드설명

각 포트의 입출력 상태 및 초기값

Bit 7 6 5 4 3 2 1 0
DDRF DDF7 DDF6 DDF5 DDF4 DDF3 DDF2 DDF1 DDF0
1 1 1 1 1 1 1 1
PORTF PF7 PF6 PF5 PF4 PF3 PF2 PF1 PF0
0 0 0 0 1 1 1 1
Bit 7 6 5 4 3 2 1 0
DDRF DDB7 DDB6 DDB5 DDB4 DDB3 DDB2 DDB1 DDB0
0 0 0 0 1 1 1 1
PORTF PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
0 0 0 0 1 0 0 0
while(1){
      int i;
      for (i = 0 ; i <= 999 ; i=i+1){
         PORTB = 0xfe;
         PORTF = SEG[i%100%10];
         _delay_ms(5);

세그먼트 출력을 0xfe로 하여 S0만 출력하게 한다.

SEG[i%100%10]을 하여 숙자의 일의자리숫자를 출력 하게 한다.

 

        PORTB = 0xfd;
        PORTF = SEG[i%100/10];
        _delay_ms(5);

세그먼트 출력을 0xfc로 하여 S1만 출력하게 한다.

SEG[i%100/10]을 하여 십의자리숫자를 출력 하게 한다.

 

        PORTB = 0xfb;
        PORTF = SEG[i/100];
        _delay_ms(5);

세그먼트 출력을 0xfb로 하여 S2만 출력하게 한다.

SEG[i/100]을 사용하여 백의자리 숫자를 출력 하게 한다.

 

        PORTB = 0xf7; 
        PORTF = SEG[0];
        _delay_ms(50);

세그먼트 출력을 0xf7로 하여 S3만을 출력하게 한다.

SEG[0]을 사용하여 S3자리를 비워준다.

 


 

  • FND 2
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000UL

unsigned char SEG[16] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

void Fnd_num(){
   int i;
   PORTB = 0x0E;
   for (i = 0 ; i < 10 ; i++){
      PORTF = SEG[i];
      _delay_ms(2000);
   }
}

void Fnd_char(){
   int i;
   PORTB = 0x0D;
   for (i = 10 ; i < 16 ; i++){
      PORTF = SEG[i];
      _delay_ms(2000);
   }
}

void Fnd_hexa(){
   int i;
   PORTB = 0x0B;
   for (i = 0 ; i < 16 ; i++){
      PORTF = SEG[i];
      _delay_ms(2000);
   }
}

void Fnd_3digit(){
   int i;
   for (i = 0 ; i <= 999 ; i=i+1){
      PORTB = 0x0E;
      PORTF = SEG[i%100%10];
      _delay_ms(5);

      PORTB = 0x0C; 
      PORTF = SEG[i%100/10];
      _delay_ms(5);

      PORTB = 0x0B;
      PORTF = SEG[i/100];
      _delay_ms(5);
   }
}

void Fnd_2times(){
   int i;
   PORTB = 0x0E;
   for (i = 0 ; i < 17 ; i=i+2){
      PORTF = SEG[i];
      _delay_ms(2000);
   }
}

void Fnd_3times(){
   int i;
   PORTB = 0x0E;
   for (i = 0 ; i < 16 ; i=i+3){
      PORTF = SEG[i];
      _delay_ms(2000);
   }
}
void stop_Fnd(){
   PORTB = 0x00;
   PORTF = 0xFF;
}

int main(){
   unsigned char keyin;
   DDRF = 0xFF;
   DDRB = 0x0F;
   DDRC = DDRC & ~(1<<DDC0 | 1<<DDC1 | 1<<DDC2 | 1<<DDC3);
   PORTB = 0x0F;
   PORTC = PORTC | 1<<PC0 | 1<<PC1 | 1<<PC2 | 1<<PC3;
   while(1){
      keyin = PINC & 0x0F;
      while(1){
         switch(keyin){
            case 0x0E :
               Fnd_num();
            break;
            case 0x0D :
               Fnd_char();
            break;
            case 0x0B :
               Fnd_hexa();
            break;
            case 0x07 :
               Fnd_3digit();
            break;
            case 0x0C :
               Fnd_2times();
            break;
            case 0x09 :
               Fnd_3times();
            break;
            case 0x03 :
               stop_Fnd();
            break;
            default : 
               PORTB = 0X00;
               PORTF = 0xC0;
            break;
         }
      }
   }
}

 

  • 코드설명

각 포트의 입출력 상태 및 초기값

Bit 7 6 5 4 3 2 1 0
DDRF DDF7 DDF6 DDF5 DDF4 DDF3 DDF2 DDF1 DDF0
1 1 1 1 1 1 1 1
PORTF PF7 PF6 PF5 PF4 PF3 PF2 PF1 PF0
0 0 0 0 1 1 1 1
Bit 7 6 5 4 3 2 1 0
DDRC DDC7 DDC6 DDC5 DDC4 DDC3 DDC2 DDC1 DDC0
DDC7 DDC6 DDC5 DDC4 0 0 0 0
PORTC PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
PC7 PC6 PC5 PC4 1 1 1 1
Bit 7 6 5 4 3 2 1 0
DDRB DDB7 DDB6 DDB5 DDB4 DDB3 DDB2 DDB1 DDB0
0 0 0 0 1 1 1 1
PORTB PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
0 0 0 0 1 0 0 0

 

void Fnd_num(){
   int i;
   PORTB = 0x0E;
   for (i = 0 ; i < 10 ; i++){
      PORTF = SEG[i];
      _delay_ms(2000);
   }
}

스위치 C0번을 올릴시 세그먼트 S0번에 1~9까지의 10진수를 반복표시 하는 코드.

for문을 사용하여 1부터 9까지 나타나게 설정.

 

void Fnd_char(){
   int i;
   PORTB = 0x0D;
   for (i = 10 ; i < 16 ; i++){
      PORTF = SEG[i];
      _delay_ms(2000);
   }
}

스위치C1번을 올릴시 세그먼트 S1번에 A~F까지 문자만 반복표시 하는 코드.

16진수는 9까지는 숫자이고 10부턴 문자이므로 for문에 I의 값을 10으로 설정.

 

void Fnd_hexa(){
   int i;
   PORTB = 0x0B;
   for (i = 0 ; i < 16 ; i++){
      PORTF = SEG[i];
      _delay_ms(2000);
   }
}

스위치C2번을 올릴시 세그먼트 S2번에 0~F까지의 숫자와 문자를 반복표시 하는 코드.

16진수 전부를 세그먼트에 표시하므로 for문에 I값을 0으로 설정.

 

void Fnd_3digit(){
   int i;
   for (i = 0 ; i <= 999 ; i=i+1){
      PORTB = 0x0E;
      PORTF = SEG[i%100%10];
      _delay_ms(5);

      PORTB = 0x0C; 
      PORTF = SEG[i%100/10];
      _delay_ms(5);

      PORTB = 0x0B;
      PORTF = SEG[i/100];
      _delay_ms(5);
   }
}

스위치C3번을 올릴시 세그먼트에 0~999까지의 숫자가 반복적으로 표시되는 코드.

for문을 사용하여 0~999까지 반복 할 수 있게 설정.

자리수 100의 자리 10의 자리 1의 자리
세그먼트
자리코드
PORTB=0x0B PORTB=0x0C PORTB=0x0E
디스플레이 숫자 SEG[i/100] SEG[i%100/10] SEG[i%100%10]

 

void Fnd_2times(){
   int i;
   PORTB = 0x0E;
   for (i = 0 ; i < 17 ; i=i+2){
      PORTF = SEG[i];
      _delay_ms(2000);
   }
}

스위치 C0C1 ON시 세그먼트 S0자리에 2의 배수로 증가하는 코드.

for문의 i<17이유는 16진수는 16(F) 이후엔 없기 때문에 17미만으로 설정.

 

void Fnd_3times(){
   int i;
   PORTB = 0x0E;
   for (i = 0 ; i < 16 ; i=i+3){
      PORTF = SEG[i];
      _delay_ms(2000);
   }
}

스위치 C1C2 ON시 세그먼트 S0자리에 3의 배수로 증가하는 코드.

for문을 사용하여 반복 하고, 배열을 사용하여 숫자를 표시.

 

void stop_Fnd(){
   PORTB = 0xf0;
   PORTF = 0xff;

스위치 C1C2를 올리면 세그먼트의 동작을 정지하는 코드.(모든 FNDOFF시킨다.)

'Embedded > 마이크로프로세서' 카테고리의 다른 글

ATMEGA128 포토인터럽트 제어 실험  (0) 2023.06.01
ATMEGA128 Roullette 모형 제어  (0) 2023.06.01
ATMEGA128 Motor 제어 실험  (0) 2023.06.01
ATMEGA128 RELAY 제어 실험  (0) 2023.06.01
ATMEGA128 LED 제어  (0) 2023.05.31