WAT-AVR128보드로 키 패드를 읽어 PC로 전송하는 방법입니다.
키 패드 제어에 대한 자세한 설명은 아래 주소를 참조하세요
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# 소스입니다.)
- [2018/02/26] List 에서 고유값 얻기 (4027)
- [2016/09/24] XML 으로 환경설정 저장하기 ( \n,엔터값 포함, NewLine) (9668)
- [2015/05/22] C#, 아두이노 간의 WIFI 통신으로 LCD 제어 (4565)
- [2015/04/22] 시리얼통신 소스 코드입니다. 0.2 (11759) *2
- [2015/04/15] 2N2222 NPN 트랜지스터 (3113)
- [2015/03/13] 시리얼통신 소스 코드입니다. 0.1 (9420)
- [2015/03/13] 항상 마지막에 추가한 TEXT 보이게 (15782)
- [2015/01/08] Character LCD 예제 (3737)
- [2014/11/28] 간단한 유니폴라 스텝모터 구동 (3883)
- [2014/11/28] 컴퓨터-아두이노 간의 블루투스 통신 (채팅) (4806)