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# 소스입니다.)
'AVR키트' 카테고리의 다른 글
WAT-AVR128_EXT 보드 (0) | 2011.07.20 |
---|---|
WAT-AVR128 모듈 (0) | 2011.07.20 |
로터리(Rotary) 스위치 값을 FND(4401ASR)에 표시하는 예제 (0) | 2011.07.12 |
가변저항 변화에 따라 LED 상태 변화 (4) | 2011.07.07 |
스위치 누름 카운터 Character LCD에 출력 (0) | 2011.07.06 |