WAT-AVR128보드로 키 패드를 읽어 PC로 전송하는 방법입니다.

 

키 패드 제어에 대한 자세한 설명은 아래 주소를 참조하세요

http://avr128.com/26

 

 

 

 

 



 

 

 

 

SW16을 누를 경우

 

 

 

 

 

 

SW13, SW14, SW15, SW16을 동시에 누를 경우

 

 

 

 

 

SW1, SW6, SW11, SW16을 동시에 누를 경우

 

 









 

 

 

메인 소스 AVR Studio 4.18 용

 

 

 

/*

    

필요한보드

    1. WAT-AVR128 (모듈)

    2. WAT-AVR128 EXT (확장보드)

    3. WAT-KEY 4x4 (키패드)

=> WAT-KEY 4x4 보드를PORTA 에연결한 예

 

 

기능

    4x4 배열의키상태를시리얼통신으로PC에서실시간으로감시한다.

    - MFC (VC6.0)

    - C# (VS2008)

 

 

컴파일러: AVRStudio 4.18

 

    http://avr128.com

 

*/

 

 

#include <avr/io.h>

#include "WAT128.h"

 

 

void OperatingFromPC();

 

int main(){

 

    // 시리얼통신으로PC에전송하기위한보레이트설정

    InitSCI0(57600);

 

 

    // 키패드초기화

    InitKey4x4();

 

 

    while(1)

    {

        // 키패드의값을읽어서PC로전송

        OperatingFromPC();

 

    }

}

 

 

BOOL    bPCHeadCheckOK = FALSE;

INT16US g_uiPCRecevingDataCount = 0;

BYTE    g_bytePCData[RX_BUFFER_SIZE];

 

//! rx 버퍼초기화

void RXClearFromPC(){

    g_uiPCRecevingDataCount = 0;

    bPCHeadCheckOK = FALSE;

}

 

//! rx 처리루틴

void OperatingFromPC(){

    BYTE byteCommand;

 

    INT16S iRxData;

    iRxData=GetByte0();

    if( 0<= iRxData && iRxData<=255 ){

 

        

        if (TRUE == bPCHeadCheckOK)

        {

            // STX 를통과했다면(이미나왔다면)

            g_bytePCData[g_uiPCRecevingDataCount] = iRxData;

            if(++g_uiPCRecevingDataCount>=RX_BUFFER_SIZE )

            {

                g_uiPCRecevingDataCount =0;

            }

 

            if (COMM_ETX == iRxData )

            {

                byteCommand = g_bytePCData[0];

                switch(byteCommand)

                {

                case 0x10:    // key 4x4

                    if ( g_uiPCRecevingDataCount>=7)

                    {

                        if (COMM_ETX == g_bytePCData[6] )

                        {

                            SendKey4x4( GetKey4x4());

                        }

                        RXClearFromPC();

                    }

                    break;

 

                default:

                    RXClearFromPC();

                    break;

                }            

            }

        }

        else

        {

            // STX 가나오지않았다면STX 가나올때까지기다린다.

            if (COMM_STX == iRxData)

            {

                bPCHeadCheckOK = TRUE;

                g_uiPCRecevingDataCount = 0;

 

            }else{

 

            }

        }

    }

}

 

 

 

 

 

 

 

 

 

C# .NET 2008 소스 (PC용 어플리케이션 소스)

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

using System.Diagnostics;

 

namespace WATkey4x4

{

public partial class frmMain : Form

{

 

// 수신 데이터 보관용 버퍼

List<byte> m_buff = new List<byte>();

 

// 4x4 배열의 버튼 묶음

List<Button> m_Buttons = new List<Button>();

 

 

public frmMain()

{

InitializeComponent();

 

// 시리얼 통신 초기화

m_sp1 = new SerialPort();

m_sp1.DataReceived += new SerialDataReceivedEventHandler(m_sp1_DataReceived);

 

 

// 한번에 처리하기 위해 모든 버튼을 묶음

m_Buttons.Add(this.btnSW1);

m_Buttons.Add(this.btnSW2);

m_Buttons.Add(this.btnSW3);

m_Buttons.Add(this.btnSW4);

m_Buttons.Add(this.btnSW5);

m_Buttons.Add(this.btnSW6);

m_Buttons.Add(this.btnSW7);

m_Buttons.Add(this.btnSW8);

m_Buttons.Add(this.btnSW9);

m_Buttons.Add(this.btnSW10);

m_Buttons.Add(this.btnSW11);

m_Buttons.Add(this.btnSW12);

m_Buttons.Add(this.btnSW13);

m_Buttons.Add(this.btnSW14);

m_Buttons.Add(this.btnSW15);

m_Buttons.Add(this.btnSW16);

 

}

 

void m_sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)

{

// 수신된 데이터를 처리하자.

int iRecSize = m_sp1.BytesToRead;

 

if (iRecSize != 0)

{

 

byte[] buff = new byte[iRecSize];

m_sp1.Read(buff, 0, iRecSize);

 

foreach (byte by in buff)

{

m_buff.Add(by);

}

}

 

 

 

// STX 찾기

 

while (true)

{

if (m_buff.Count <= 0) break;

if (m_buff[0] == 0x02) break;

else

{

m_buff.RemoveAt(0);

}

}

 

if (m_buff.Count >= 8)

{

bool bSame = true;

 

if (0x02 != m_buff[0]) bSame = false;

if (0x03 != m_buff[7]) bSame = false;

 

if (true == bSame)

{

 

// CRC 를 체크해야 하는데 생략 ;;

 

UInt16 byteData = Convert.ToUInt16(m_buff[2]);

byteData <<= 8;

byteData += Convert.ToUInt16(m_buff[3]);

 

 

// 버튼을 하나씩 꺼내서 눌러졌는지 아닌지를 검사하자

foreach (Button btn in m_Buttons)

{

// SW1

if (byteData % 2 == 1)

{

// 눌러졌으면 RED

btn.BackColor = System.Drawing.Color.Red;

}

else

{

// 눌러지지 않았으면 Control(기본색)

btn.BackColor = System.Drawing.SystemColors.Control;

}

byteData >>= 1;

}

 

// 수신 버퍼에서 지금 처리된 데이터를 제거하자

m_buff.RemoveRange(0, 7);

 

 

 

}

else

{

// 수신 버퍼 초기화

m_buff.Clear();

 

}

}

}

 

 

private void btnOpen_Click(object sender, EventArgs e)

{

// 컴포트 열기

this.btnOpen.Enabled = false;

m_sp1.PortName = txbComNum.Text; // 컴포트명

m_sp1.BaudRate = Convert.ToInt32(txbBaud.Text); // 보레이트

 

m_sp1.Open();

 

tmr50mS.Enabled = true;

tmr50mS.Start();

}

 

private void btnClose_Click(object sender, EventArgs e)

{

// 컴포트 닫기

tmr50mS.Stop();

m_sp1.Close();

this.btnOpen.Enabled = true;

}

 

private void TmrRequest(object sender, EventArgs e)

{

// 키패드 값을 요청하자

byte[] byteData =new byte[100];

int iLength=0;

 

byteData[iLength++] = 0x02;

byteData[iLength++] = 0x10;

 

byteData[iLength++] = 0x00;

byteData[iLength++] = 0x00;

byteData[iLength++] = 0x00;

byteData[iLength++] = 0x00;

 

byteData[iLength++] = 0xCC; // CRC 체크를 생략한다;

 

byteData[iLength++] = 0x03;

 

m_sp1.Write(byteData,0,iLength);

}

}

}

 

 

 

 

 

 

 

 

 

 

 

 

필요한 보드

 

 

WAT-AVR128 (ATMEGA128A 모듈)

WAT-AVR128 EXT (ATMEGA128A 외부 인터페이스 보드)

WAT-KEY 4x4 (4x4 키 패드 보드)

 

 

 

 

프로젝트 파일(전체 소스) 다운로드

 

ATMEGA128 소스 &  C# 소스:  ( 압축파일 안의 App 이름이 있는 폴더가 c# 소스입니다.)

EX_01_05 다운로드

 


 

Posted by WhiteAT
,