📄 key.c
字号:
//***************************************************************************************************
//Chinese Academy of Sciences, Institute of Automation
//File Name: Key.c
//Description: Test Matrix Keyboard.
//Author: Lee JuGuang
//Date: 2004-1-4
//***************************************************************************************************
#include "s3c4510b_add.h"
#include "uart.h"
static void delay(unsigned int x);
static int key_scan(void);
extern void KeyTest()
{
unsigned int tmp,i;
//P0~P7:GPIO ,P8~P11:ROW,O,P12~P15:COL,I
IOPMOD=0x0FF0;
tmp=EXTDBWTH;
EXTDBWTH=0x05503002;
i_printf("\r\n\r\nPress any to continue...\r\n\r\n");
while(1)
{
i=key_scan();
if(kbd_hit())
{
LED4=LED3=LED2=LED1=0x0;
EXTDBWTH=tmp;
return;
}
}
}
//*********************************************************
//函数名: delay();
//描述: 软件延时;
//参数: 延时时间;
//返回值: 无
//*********************************************************
static void delay(unsigned int x)
{
unsigned int i,j,k;
for(i=0;i<=x;i++)
for(j=0;j<0xa0;j++)
for(k=0;k<0xff;k++);
}
//*********************************************************
//函数名: key_scan();
//描述: 键盘扫描;
//参数: 无
//返回值: 无
//*********************************************************
static int key_scan()
{
static unsigned int step=0,ROW=0,COL=0,i=0,KEY_CODE,KEY_CODE1;
unsigned char LED;
switch(step)
{
case 0:
KEY_CODE=0;KEY_CODE1=0;
LED=IOPDATA&0x3F0FF;//P8~P11=0;
IOPDATA=LED;
LED=(IOPDATA&0xF000)>>8;
if(LED!=0xf0)
{
step++; //有键按下,取行号
LED=(~LED)&0xf0;
for(i=1;i<5;i++)
{
LED=LED<<1;
if(LED==0)
{
ROW=i<<4;
break;
}
}
}
break;
case 1:
for(i=0;i<4;i++)
{
IOPDATA=0x01<<(8+i);
LED=(IOPDATA&0xF000)>>8;
if(LED==0xf0) //键释放或找到被按下的键的列值
{
step++;
COL=i+0x0a;
KEY_CODE=ROW|COL;
break;
}
}
if(i==4)
step=0;
break;
case 2:
delay(1);
step++;
break;
case 3:
LED=IOPDATA&0x3F0FF;//P8~P11=0;
IOPDATA=LED;
LED=(IOPDATA&0xF000)>>8;
if(LED!=0xf0)
{
step++; //有键按下,取行号
LED=(~LED)&0xf0;
for(i=1;i<5;i++)
{
LED=LED<<1;
if(LED==0)
{
ROW=i<<4;
break;
}
}
}
else
step=0;
break;
case 4:
for(i=0;i<4;i++)
{
IOPDATA=0x01<<(8+i);
LED=(IOPDATA&0xF000)>>8;
if(LED==0xf0) //键释放或找到被按下的键的列值
{
step++;
COL=i+0x0a;
KEY_CODE1=ROW|COL;
break;
}
}
if(i==4)
step=0;
break;
case 5:
if(KEY_CODE==KEY_CODE1) //键确认
step++;
else
step=0;
break;
case 6:
IOPDATA=IOPDATA&0x3F0FF;
LED=(IOPDATA&0xF000)>>8;
if(LED==0xf0)
step++;
break;
case 7:
switch(KEY_CODE)
{
case 0x1a:
LED3=LED2=LED1=LED4=0x57;
//i_printf("KEY_CODE=3\n\r");
break;
case 0x1b:
LED3=LED2=LED1=LED4=0x73;
//i_printf("KEY_CODE=2\n\r");
break;
case 0x1c:
LED3=LED2=LED1=LED4=0x06;
//i_printf("KEY_CODE=1\n\r");
break;
case 0x1d:
LED3=LED2=LED1=LED4=0xb7;
//i_printf("KEY_CODE=0\n\r");
break;
case 0x2a:
LED3=LED2=LED1=LED4=0x07;
//i_printf("KEY_CODE=7\n\r");
break;
case 0x2b:
LED3=LED2=LED1=LED4=0xf5;
//i_printf("KEY_CODE=6\n\r");
break;
case 0x2c:
LED3=LED2=LED1=LED4=0xd5;
//i_printf("KEY_CODE=5\n\r");
break;
case 0x2d:
LED3=LED2=LED1=LED4=0xc6;
//i_printf("KEY_CODE=4\n\r");
break;
case 0x3a:
LED3=LED2=LED1=LED4=0xf4;
//i_printf("KEY_CODE=B\n\r");
break;
case 0x3b:
LED3=LED2=LED1=LED4=0xE7;
//i_printf("KEY_CODE=A\n\r");
break;
case 0x3c:
LED3=LED2=LED1=LED4=0xd7;
//i_printf("KEY_CODE=9\n\r");
break;
case 0x3d:
LED3=LED2=LED1=LED4=0xf7;
//i_printf("KEY_CODE=8\n\r");
break;
case 0x4a:
LED3=LED2=LED1=LED4=0xe1;
//i_printf("KEY_CODE=F\n\r");
break;
case 0x4b:
LED3=LED2=LED1=LED4=0xf1;
//i_printf("KEY_CODE=E\n\r");
break;
case 0x4c:
LED3=LED2=LED1=LED4=0x76;
//i_printf("KEY_CODE=D\n\r");
break;
case 0x4d:
LED3=LED2=LED1=LED4=0xb1;
//i_printf("KEY_CODE=C\n\r");
break;
}
step=0;
break;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -