Switch 4개를 각각 누를 때마다 FND 카운터 증가

 

 

Anode 4-digit FND (4401ASR2)를 PORTC 에 연결하고 COM 은 PORT0~ PORT3에 연결하여

스위치를 누를 때마다 각 자리수의 값이 증가하는 예제입니다.

 

 

 

< 시작 화면: 모든 값이 0으로 표시됩니다 >

 

 

 

 

 

< PA7 1번, PA6 2번, PA5는 8 번, PA4 는 5번 눌렀을 경우 >

 

 

 

 

전체 소스 AVR Studio 4.7 용

   

   

     

/**********************************************

 

//PA4~7에switch연결

// PA7 : FND 자리수증가

// PA6 : FND 자리수증가

// PA5 : FND 자리수증가

// PA4 : FND 자리수증가

// 스위치를누르면각각의FND 표시값증가( 0부터9까지반복표시)

 

 

Tools : AVR Studio 4.16

http://watsim.tistory.com

*********************************************/

 

 

#include <avr/io.h>

#include <avr/interrupt.h>

 

 

void DisplayFND();

void InitPort();

void GetSW( );

 

unsigned char g_Dig1=0,g_Dig2=0,g_Dig3=0,g_Dig4=0; // 각자리마다표시할수(범위: 0 ~9)

 

// FND DATA (FND 4401ASR2 용)

const unsigned char num[10]={

    0b00010100,        //0

    0b11010111,        //1

    0b01001100,        //2

    0b01000101,        //3

    0b10000111,        //4

    0b00100101,        //5

    0b00100100,        //6

    0b01010111,        //7

    0b00000100,        //8

    0b00000101        //9

};

 

// 스위치(키)의입력값이변경되었는지와마지막값확인용

unsigned char keyvalue = -1; // -1 은입력된값이없을때

unsigned char lastkeyvalue = -1; // -1 은입력된값이없을때

 

 

int main()

{

    InitPort();

 

    while(1)

    {

        GetSW();

        DisplayFND();

 

    }

}

 

void InitPort()

{

    DDRC = 0xFF;

    DDRA = 0x0F;

    DDRD = 0xFF;

 

    PORTC = 0x00;

    PORTA = 0xF0;

    PORTD = 0x55;

}

 

void DisplayFND()

{

    int i=0;

 

    PORTD = 1;

    PORTC = num[g_Dig1];

 

    for(i=0; i<=2540; i++)

    {

        asm volatile(" PUSH R0 ");        

        asm volatile(" POP R0 ");        

 

    }

 

    PORTD = 2;

    PORTC = num[g_Dig2];

    for(i=0; i<=2540; i++)

    {

        asm volatile(" PUSH R0 ");        

        asm volatile(" POP R0 ");        

 

    }

 

 

    PORTD = 4;

    PORTC = num[g_Dig3];

    for(i=0; i<=2540; i++)

    {

        asm volatile(" PUSH R0 ");        

        asm volatile(" POP R0 ");        

 

    }

 

    PORTD = 8;

    PORTC =num[g_Dig4];

 

    for(i=0; i<=2540; i++)

    {

        asm volatile(" PUSH R0 ");        

        asm volatile(" POP R0 ");        

 

    }

}

 

void GetSW()

{

 

    keyvalue = PINA >> 4;

 

 

    // switch 의값이변경되었을때만처리하자.

 

    if( keyvalue != lastkeyvalue)

    {

 

        if((lastkeyvalue& 0x08) && !(keyvalue & 0x08))

        {

            g_Dig1 ++;

            if(g_Dig1>9) g_Dig1 = 0;

        }    

 

        if((lastkeyvalue& 0x04) && !(keyvalue & 0x04))

        {

            g_Dig2 ++;

            if(g_Dig2>9) g_Dig2 = 0;

        }

        if((lastkeyvalue& 0x02) && !(keyvalue & 0x02))

        {

            g_Dig3 ++;

            if(g_Dig3>9) g_Dig3 = 0;

        }

        

        if((lastkeyvalue& 0x01) && !(keyvalue & 0x01))

        {

            g_Dig4 ++;

            if(g_Dig4>9) g_Dig4 = 0;

        }

 

 

        lastkeyvalue = keyvalue;

    }

 

 

}

 

 

 

 

 

주요 부품

ATMEGA128 - 1EA

FND 4401ASR2 ( Anode type ) – 1 EA

Switch – 4EA

POWER 5V/1A

 

 


실행파일 다운로드


이번 예제가 추가되면서 실행파일이 업데이트 되었습니다.

4401ASR2
부품을 사용하기 위해서는 패치 하시기 바랍니다.


Posted by WhiteAT

댓글을 달아 주세요