'카운트'에 해당되는 글 1건

  1. 2011.05.11 4개의 키를 각각 누를 때마다 누른 횟수 증가 하는 예제

 

4개의 키를 각각 누를 때마다 누른 횟수 증가 하는 예제

 

 

PORTA0 ~ PORTA3까지 스위치를 연결하고 각 스위치를 누를 때마다 카운터를 증가시켜 LCD에 출력 하는 CodeVisionAVR 예제입니다.

 

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

 

 

 

 

< SW1는 5번, SW2는 3번, SW3는 2번, SW4는 4번 눌렀을 때 결과입니다.

 

 

 

 

전체 소스 CodeVision 1.24.0 용

 

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

Character LCD Control

PORTB ==> LCD DataLine

PORTA.7 ==> LCD E

PORTA.6 ==> LCD RW

PORTA.5 ==> LCD RS

 

PORTA.3 ==> SW1

PORTA.2 ==> SW2

PORTA.1 ==> SW3

PORTA.0 ==> SW4

 

Main Clock : 8Mhz

 

각키를누를때마다누른횟수증가하는예제

 

Tools : Codevision

http://watsim.tistory.com

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

 

#include <stdio.h>

//#include <string.h>

 

typedef signed int INT16S;

typedef signed int UINT16;

typedef unsigned int INT16US;

typedef unsigned char INT8US;

typedef unsigned int WORD;

typedef unsigned char UINT8;

typedef unsigned char BOOL;

typedef unsigned char BYTE;

 

 

#define SetBit(PORT,ibit)        (PORT=PORT| ((1<<ibit)))

#define ClearBit(PORT, ibit)    (PORT=PORT&(~(1<<ibit)))

 

#include <mega128.h>

#define LCD_RS 5

#define LCD_EA 7

#define LCD_DATA_PORT PORTB

#define LCD_CONTROL_PORT PORTA

 

void CLcdXY(BYTE x1, BYTE y1);

void CLcdCommand(BYTE data);

void CLcdOn();

BYTE CLcdBusyCheck();

void CLcdPutStrings(BYTE x, BYTE y, char *str);

void CLcdPutChar(BYTE chr);

void CLcdClear();

 

// time delay for us

void WaitUS(unsigned char time_us)        

{

    register unsigned char i;

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

    {

#asm

        PUSH R0 ;

        POP R0 ;

        PUSH R0 ;

        POP R0 ;

#endasm

    }

}

 

// time delay for ms

void WaitMS(unsigned int time_ms)    

{

    register unsigned int i;

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

    {

        WaitUS(250);

        WaitUS(250);

        WaitUS(250);

        WaitUS(250);

    }

}

 

 

char chTemp[17];

unsigned int g_iSwCount[4];

 

 

 

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

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

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

 

 

 

void GetSW()

{

    keyvalue = PINA & 0x0F;

 

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

    if( keyvalue != lastkeyvalue)

    {

 

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

        {

            g_iSwCount[0] ++;

            if(g_iSwCount[0] >999) g_iSwCount[0] = 0;

        }    

 

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

        {

            g_iSwCount[1] ++;

            if(g_iSwCount[1] >999) g_iSwCount[1] = 0;

        }

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

        {

            g_iSwCount[2] ++;

            if(g_iSwCount[2] >999) g_iSwCount[2] = 0;

        }

        

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

        {

            g_iSwCount[3] ++;

            if(g_iSwCount[3] >999) g_iSwCount[3] = 0;

        }

 

 

        lastkeyvalue = keyvalue;

    }

}

 

void main(void)

{

    DDRA = 0xF0;    

    DDRB = 0xFF;    

 

 

g_iSwCount[0]=0;

g_iSwCount[1]=0;

g_iSwCount[2]=0;

g_iSwCount[3]=0;

    

    SetBit(PORTD,LCD_EA);    // ENABLE

    ClearBit(PORTD,6);

 

 

    CLcdOn();

    CLcdClear();

 

    while (1)

    {

 

         sprintf(chTemp,"S1:%4d,S2:%4d." ,g_iSwCount[0],g_iSwCount[1]);

        CLcdPutStrings(0,0,chTemp);

         sprintf(chTemp,"S3:%4d,S4:%4d." ,g_iSwCount[2],g_iSwCount[3]);

        CLcdPutStrings(0,1,chTemp);

 

         GetSW();

    }

}

 

BYTE CLcdBusyCheck()

{

    WaitMS(1);

    

    return (0);

}

 

 

void CLcdPutStrings(BYTE x, BYTE y, char *str)

{

    int len = 0;

    CLcdXY(x,y);

    while(*str ){

        if(len>16) break;

        CLcdPutChar(*str++);

        len++;

    }

}

 

void CLcdPutChar(BYTE data)

{

    while(CLcdBusyCheck());

    ClearBit(LCD_CONTROL_PORT,LCD_EA);

    SetBit(LCD_CONTROL_PORT,LCD_RS);

    WaitUS(2);

    LCD_DATA_PORT= data;

    WaitUS(50);

    SetBit(LCD_CONTROL_PORT,LCD_EA);

    WaitUS(50);

    ClearBit(LCD_CONTROL_PORT,LCD_EA);

}

 

void CLcdClear()

{

    CLcdCommand(1);

    WaitMS(1);

    CLcdCommand(2);

    WaitMS(1);

}

 

void CLcdXY(BYTE x, BYTE y)

{

    BYTE position;

    if(x>16) x = 0;

    switch(y)

    {

    case 0 :

        position = 0x80;

        break;

    case 1 :

        position = 0xC0;

        break;

    }

    CLcdCommand(position + x);

}

 

void CLcdCommand(BYTE data)

{

    while(CLcdBusyCheck()){}

    ClearBit(LCD_CONTROL_PORT,LCD_RS);

    ClearBit(LCD_CONTROL_PORT,LCD_EA);

    WaitUS(1);

    LCD_DATA_PORT= data;

    WaitUS(50);

    SetBit(LCD_CONTROL_PORT,LCD_EA);

    WaitUS(20);

    ClearBit(LCD_CONTROL_PORT,LCD_EA);

    WaitUS(50);

}

 

void CLcdOn()

{

    CLcdCommand(0x01);// dummy

    CLcdCommand(0x38);

    CLcdCommand(0x0C );

    CLcdCommand(0x01);

    CLcdCommand(0x06);

    CLcdCommand(0x01);

    WaitMS(2);

}

 

 

 

 

 

 

주요 부품

ATMEGA128 - 1EA

ABC016002E57 – 1EA
Character LCD 16x2

Switch – 4EA

POWER 5V/1A

 

 

 



실행파일 다운로드

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

이 예제를 사용하기 위해서는 최신 버전(0.2.1.0 이상)으로 패치 하시기 바랍니다.

 

 실행파일 ( 0.2.1.0)




 WATSIM 프로젝트 파일과 Codevision 소스 파일



 

 

 

Posted by WhiteAT
,