«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

ITGenerations

[avr]키패드 입력, 세븐세그먼트 [실패] 본문

Univ/AVR atmega128

[avr]키패드 입력, 세븐세그먼트 [실패]

ITGenerations 2017. 12. 9. 22:51

// source 27

//키패드 입력, 세븐세그먼트


/*


#include <avr/io.h>

#include <avr/interrupt.h>

#include "iseg7.h"

#include "keypad.h"


int main()

{

unsigned char key;

unsigned short data=0;

ISeg7Init();

KeyInit();

sei();


ISeg7DispNum(data, 10);

while(1)

{

key=KeyInput();

switch(key)

{

case SW1:

data+=1;

break;

case SW2:

data+=2;

break;

case SW3:

data+=3;

break;

default:

break;

}

ISeg7DispNum(data,10);

}

}



*/


----------------------------------------keypad.h-----------------------------------------------------------------------

#ifndef __KEYPAD_H__

#define __KEYPAD_H__


// 키패드 스위치 코드 값

#define SW0     0x18    // 0-번째 행

#define SW1     0x14

#define SW2     0x12

#define SW3     0x11

#define SW4     0x28    // 1-번째 행

#define SW5     0x24

#define SW6     0x22

#define SW7     0x21

#define SW8     0x48    // 2-번째 행

#define SW9     0x44

#define SW10    0x42

#define SW11    0x41

#define SW12    0x88    // 3-번째 행

#define SW13    0x84

#define SW14    0x82

#define SW15    0x81


#define NO_KEY 0x00

                   

//

// 함수 정의

//                                    

void KeyInit(void);

unsigned char KeyInput(void);

#endif


-------------------------------------------------------------------------------------------------------------------






------------------------------------keypad.c-------------------------------------------------------------------


//=====================================================

//  Keypad Matrix 인터페이스

// 

//  포트 핀     F7  F6  F5  F4  F3  F2  F1  F0  

//  키 패드     I3  I2  I1  I0  O3  O2  O1  O0

//

//      In : 키패드 입력 핀

//      On : 키패드 출력 핀

//=====================================================


#include <avr/io.h>             

#include <util/delay.h>

#include <stdio.h>


#include "keypad.h" 

#define N_COL   4 // 스캔 할 키패드 열 수 

#define KEY_OUT PORTF // keyboard 출력 포트

#define KEY_IN  PINF // keyboard 입력 포트         

#define KEY_DIR DDRF // keyboard 입출력 방향 레지스터 


static unsigned char key_scan(void);


static unsigned char pin = 0; // 이전 키값


void KeyInit()

{

        KEY_OUT = 0xF0; // 출력 초기 값으로 0을 출력

        KEY_DIR = 0x0F; // 하위니블 ->출력, 상위니블->입력

}        


//==============================================

//  키패드의 스캔 코드 값을 리턴한다.

//

//      리턴 값 : 0이 아닐 때 : 스캔 코드 값

//                0일 때      : 입력 값이 없음

//==============================================   

unsigned char KeyInput(void)

{

unsigned char in, in1;

        

in = key_scan(); // 키스캔을 하여 값을 읽는다.


while(1)

{

_delay_ms(10); _delay_ms(10); _delay_ms(10);

in1 = key_scan(); // 한 번 더 읽는다.

if(in==in1) break;

in = in1;

}

       

if(!(in & 0xF0))        // 눌러진 키가 없음

{

pin =0;

return 0;

}                                     

        

if(pin == in) // 같은 키를 계속 누르고 있음 

return 0; // 새로운 키 입력이 없는 것으로 리턴

                        

pin = in; // 키 값을 저장 함.

        

return in; // 코드를 반환한다.

}


//-------------------------------------------

// 스캔코드값을 리턴함

//-------------------------------------------

static unsigned char key_scan(void)

{

unsigned char out, i, in;


out = 0x01;        // 3-열부터 스캔

                

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

{

KEY_OUT = ~out;    // 출력 포트에 스캔출력을 낸다.  

asm("nop"::);   // 1사이클 지연

                

in = (~KEY_IN) & 0xF0;  // 입력된 값의 

//상위 4비트를 취한다.  

if(in) // 키 입력이 있음

{

in += out; // 출력과 입력을 조합하여 코드생성

break; // 입력이 있으므로 루프 탈출

}

out <<= 1;  // 다음 스캔코드로 변경 

}


return in; // 스캔코드 값 리턴

}



-------------------------------------------------------------------------------------------------------------------