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 에서 고유값 얻기 (4917)
- [2015/05/22] C#, 아두이노 간의 WIFI 통신으로 LCD 제어 (4642)
- [2015/04/22] 시리얼통신 소스 코드입니다. 0.2 (12264) *2
- [2015/04/15] 2N2222 NPN 트랜지스터 (3227)
- [2015/03/13] 시리얼통신 소스 코드입니다. 0.1 (9881)
- [2015/03/13] 항상 마지막에 추가한 TEXT 보이게 (16603)
- [2015/01/08] Character LCD 예제 (3815)
- [2014/11/28] 간단한 유니폴라 스텝모터 구동 (3971)
- [2014/11/28] 컴퓨터-아두이노 간의 블루투스 통신 (채팅) (4901)
- [2014/05/13] 0. 3개 이상의 Multi Task 작업 (3926)

 
	
		 


 
    
 
    
 
     
 key_4x4_PORTA.zip
 
key_4x4_PORTA.zip