Professional Documents
Culture Documents
1. 구성사진
PROCHILD
1
Application Note : 4 X 4 Key Matrix
2. I/O SETTING
아래의 표와 같이 포트를 설정해 주시고 COLUMNS 으로 설정된 부
분은 PULL UP REGISTER를 셋팅하여 저항을 사용하지 않고 사용할 수
있습니다.
PIO14 ROWS 0 OUTPUT PIO16 COLUMNS 0 INPUT/PULL UP
PIO15 ROWS 1 OUTPUT PIO20 COLUMNS 1 INPUT/PULL UP
PIO19 ROWS 2 OUTPUT PIO22 COLUMNS 2 INPUT/PULL UP
PIO21 ROWS 3 OUTPUT PIO23 COLUMNS 3 INPUT/PULL UP
표1. 포트설정
3. FLOW CHART
KEY SCAN()
INITIALIZATION()
COLUMNS 핀을 읽어온다.
COLUMNS 핀을 읽어온다.
40msCOUNT증가.
COUNT>5
눌린키가있나?
END END
PROCHILD
2
Application Note : 4 X 4 Key Matrix
4.Software
keyscan.c
#include "keyscan.h"
#include "Board.h"
//*----------------------------------------------------------------------------
//*----------------------------------------------------------------------------
void Keyscan(void)
//*begin
unsigned char i;
for(i = 0;i<4;i++){
delay();
// temp = AT91F_PIO_GetInput(AT91C_BASE_PIOA);
switch(Key_pressed){
case (SW_C0):
PROCHILD
3
Application Note : 4 X 4 Key Matrix
break;
case (SW_C1):
break;
case (SW_C2):
break;
case (SW_C3):
break;
Keytime +=4;
Keytime = 0;
if(Diff_key == 1)
if(Old_Key != NewKey){
Old_Key = NewKey;
Keychange = 1;
else{
if(Keychange == 1 )
Keychange = 0;
Diff_key =0;
AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU,NewKey);
else{
if(count_timer0_interrupt > 3)
count_timer0_interrupt =0;
NewKey = 0; Old_Key = 0;
PROCHILD
4
Application Note : 4 X 4 Key Matrix
}
//*end
Keyscan.h
#ifdef KEY_GLOBALS
#define KEY_EXT
#else
#endif
void Keyscan(void);
//*----------------------------------------------------------------------------
//*----------------------------------------------------------------------------
#include "Board.h"
int count_timer0_interrupt;
PROCHILD
5
Application Note : 4 X 4 Key Matrix
volatile unsigned int i;
Main.c
int main(void)
//*Begin
AT91PS_AIC pAic;
pAic = AT91C_BASE_AIC;
//* Enable User Reset and set its Minimal assertion to 960 us
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,1<<AT91C_ID_PIOA);
AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,ROWS_MASK);
AT91F_PIO_CfgPullup(AT91C_BASE_PIOA,COLUMNS_MASK);
AT91F_PIO_CfgInput(AT91C_BASE_PIOA,COLUMNS_MASK);
timer_init();
AT91F_DBGU_Init();
for(;;)
Keyscan();
asm("nop");
PROCHILD
6
Application Note : 4 X 4 Key Matrix
}
//*End
interrupt_timer0.c
//*----------------------------------------------------------------------------
//*----------------------------------------------------------------------------
#include "Board.h"
#define TIMER0_INTERRUPT_LEVEL 1
/*-----------------*/
/* Clock Selection */
/*-----------------*/
//*----------------------------------------------------------------------------
PROCHILD
7
Application Note : 4 X 4 Key Matrix
//* Input Parameters : <tc_pt> = TC Channel Descriptor Pointer
//*----------------------------------------------------------------------------
//*begin
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,1<<TimerId);
TC_pt->TC_CCR = AT91C_TC_CLKDIS;
TC_pt->TC_IDR = 0xFFFFFFFF;
//* Suppress warning variable "dummy" was set but never used
dummy =dummy;
TC_pt->TC_CMR = Mode;
TC_pt->TC_CCR = AT91C_TC_CLKEN;
//*end
//*----------------------------------------------------------------------------
//*----------------------------------------------------------------------------
void timer0_c_irq_handler(void)
PROCHILD
8
Application Note : 4 X 4 Key Matrix
//*begin
dummy = TC_pt->TC_SR;
dummy = dummy;
count_timer0_interrupt++;
else
//*end
//*----------------------------------------------------------------------------
//*----------------------------------------------------------------------------
void timer_init(void)
//*begin
count_timer0_interrupt=0;
PROCHILD
9
Application Note : 4 X 4 Key Matrix
//* Open timer0
AT91F_TC_Open(AT91C_BASE_TC0,TC_CLKS_MCK32,AT91C_ID_TC0);
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_TC0,TIMER0_INTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,timer0_c_irq_handler);
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_TC0);
AT91F_AIC_Trig(AT91C_BASE_AIC,AT91C_ID_TC0);
AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG;
//*end
Debug.c
//*----------------------------------------------------------------------------
//*----------------------------------------------------------------------------
#include "Board.h"
#include "dbgu.h"
//*--------------------------1--------------------------------------------------
//* \brief This function is used to send a string through the DBGU channel
//*----------------------------------------------------------------------------
void AT91F_DBGU_Init(void)
//*begin
AT91F_DBGU_CfgPIO();
PROCHILD
10
Application Note : 4 X 4 Key Matrix
//* Configure DBGU
AT91F_US_Configure(
MCK,
0);
//*end
//*--------------------------1--------------------------------------------------
//* \brief This function is used to send a string through the DBGU channel
//*----------------------------------------------------------------------------
//*begin
while(*buffer != '\0'){
while(!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU,*buffer++);
//*end
//*----------------------------------------------------------------------------
//*----------------------------------------------------------------------------
//*begin
else
PROCHILD
11
Application Note : 4 X 4 Key Matrix
*val=AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
return(true);
//*end
//*----------------------------------------------------------------------------
//*----------------------------------------------------------------------------
//*begin
char buff[10];
buff[nb_read] = (char)read;
if((char)read == 0x08){
if(nb_read != 0){
nb_read--;
AT91C_BASE_DBGU->DBGU_THR = read;
//*echo
else{
AT91C_BASE_DBGU->DBGU_THR = read;
nb_read++;
PROCHILD
12
Application Note : 4 X 4 Key Matrix
}
sscanf(buff,type,val);
//*end
PROCHILD
13