__________

Designing the Future with Circuits

반도체 회로설계 취준기

하만(Harman) 세미콘 반도체 설계 과정/임베디드 시스템을 위한 SW 구조설계

하만(Harman) 세미콘 아카데미 12일차 - SW 구조설계( 7세그먼트 - 16진수 출력, 스톱워치 구현)

semicon_circuitdesigner 2024. 3. 22. 16:14

[2024.03.22.금] 인천인력개발원 하만 세미콘 아카데미


임베디드 시스템을 위한 SW 구조설계


실습 1: 7세그먼트로 0~F까지 16진수로 표시


  • 코드 수정
    • #define F_CPU 16000000L					//Board CLK 정보(16MHz)
      #include <avr/io.h>
      #include <avr/delay.h>
      
      
      int main(void)
      {
      	uint8_t digit[] = {
      		0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x27, 0x7F, 0x67, 0x77, 0x7c, 0x58, 0x5e, 0x79, 0x71
      	};
      	int i, j;
      	DDRD = 0xFF;						//세그먼트 제어 핀 8개를 출력으로 설정
      	DDRC = 0x0F;						//자릿수 선택 핀 4개를 출력으로 설정
      			
          
          while (1)							//한 번의 while loop 내에서 네자리 중 한 자리에 숫자를 번갈아가며 출력하는 코드
          {
      		for (i = 0; i < 4; i++){		//해당 자리에만 0(GND)를 출력하고 나머지에는 1을 출력하여 자리 선택
      			PORTC |= 0X0f;
      			PORTC &= ~(1 << i);			//자리 선택
      			
      			for (j = 0; j < 16; j++){
      				PORTD = digit[j];
      				
      				_delay_ms(500);
      			}
      		}
          }
       
  • 실행 확인

실습 2: 7세그먼트로 스톱워치 구현


  • 사용자 정의 함수 생성
    uint8_t digit[] = {	0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x27, 0x7F, 0x67, 0x77, 0x7c, 0x58, 0x5e, 0x79, 0x71 };
    uint8_t character[] = { // -,
    	0x40 };
    	char arr[5];		//세그먼트 이미지 정보를 담을 안전공간
    
    void LED(char*p, int n){//portp의 n번째 비트를 점멸
    	char b = 1 << n;
    	*p |= b;
    	_delay_ms(500);
    	*p &= ~b;
    	_delay_ms(500);
    }
    
    
    void seg(int sel, uint8_t c){
    	PORTC |= 0X0F;
    	PORTC &= ~(1 << (3-sel));
    	PORTD = c;	//숫자 데이터 출력
    	_delay_ms(2);
    }
    
    
    void FND_4(char *inf){	//segment Image 배열
    	for (int i = 0; i < 4; i++){
    		seg(i, *(inf+i));
    	}
    }
    
    //16진수 segment image 배열
    char* Trans(unsigned long num){	//10진 정수를 입력받아 16진수 문자열로 변환 ex)65535 ==> 0xffff, 56506=>0xBCDA
    	int n1 = num % 10;			//A(10): 문자가 아닌 숫자
    	int n2 = (num / 10) % 10;	//B(11)
    	int n3 = (num / 100) % 10;	//C(12)
    	int n4 = num / 1000;		//D(13)
    	
    	arr[0] = digit[n1]; arr[1] = digit[n2]; arr[2] = digit[n3] + 0x80; arr[3] = digit[n4];
    	
        //빈 공간에 0이 표시되지 않도록 하기 위한 코드
    	if ( num<10 ){
    		arr[3] = 0; arr[1] = 0; arr[2] = 0x80;
    	}
    	else if ( num<100 ){
    		arr[2] = 0x80; arr[3] = 0;
    	}
    	else if ( num<1000 ){
    		arr[3] = 0;
    	}
    	
    	return arr;
    }
  • 메인 함수 내 while문 작성
    int main(void)
    {
    	
    	unsigned long i, j = 0;
    	DDRD = 0xFF;						//세그먼트 제어 핀 8개를 출력으로 설정
    	DDRC = 0x0F;						//자릿수 선택 핀 4개를 출력으로 설정
    	DDRB &= ~0x01;						//B port의 0번째 비트는 입력용(0)으로, 나머지는 출력용(1)로 설정 (1111 1110 = NOT 0000 0001)
    	
        void display_digit(int position, int number){
    		PORTC |= 0x0F;
    		PORTC &= ~(1 << (position - 1));
    	
    		PORTD = digit[number];
    	}
    	void display_character(int position, int number){
    		PORTC |= 0x0F;
    		PORTC &= ~(1 << (position - 1));
    	
    		PORTD = character[number];
    	}
    
    	int mode = 0;
    
    	//스탑워치
    	while(1){
    		if(mode >= 4) mode = 0;
    	
    		switch(mode){
    			case 0:	//화면이 켜지면 mode0(---- 표시 코드)
    				display_character(1, 0);
    				_delay_ms(2);
    				display_character(2, 0);
    				_delay_ms(2);                                                                                                                                                                                                                                          
    				display_character(3, 0);
    				_delay_ms(2);
    				display_character(4, 0);
    				_delay_ms(2);
    				if(!(PINB & 0x01 == 1)) mode = 1;
    				break;
    			case 1:	//버튼을 1회 누르면 스탑워치 작동 시작
    				j = 0;
    				while(1){
    					FND_4(Trans(j++));
    					_delay_ms(2);
    					if(!(PINB & 0x01 == 1)) break; mode = 2;
    				}
    				break;
    			case 2:	//버튼을 누르면 스탑워치 작동 정지
    				_delay_ms(100);
    				while(1){
    					FND_4(Trans(j));
    					_delay_ms(2);
    					if(!(PINB & 0x01 == 1)) break; 
    				}
    				_delay_ms(300);
    				mode = 0;
    				break;
    		}
    	}
    }
  • 작동 확인

 


실습 사용 c파일


main.c
0.00MB