📄 main.c
字号:
//******************************************************
//Beijing Winsilicon Technology LT.CO,
//File Name: main.c
//Description: Keyboard Test
//Author: JuGuang,Lee
//Date:
//******************************************************
#include "s3c4510b_add.h"
void delay(unsigned int x);
void InitUART(int Port,int Baudrate);
void PrintUART0(char *s);
int key_scan(void);
int C_Entry()
{
int i=0;
//P0~P3:switch,I,P4~P7:LED,O,P8~P11:ROW,O,P12~P15:COL,I
IOPMOD=0x0FF0;
InitUART(0,0x500);
PrintUART0("\r\n\r\nPress any key to test...\r\n\r\n");
while(1)
{
i=key_scan();
}
}
//*********************************************************
//函数名: PrintUART0();
//描述: 向UART0发送一个字符串;
//参数: 要发送的字符串;
//返回值: 无
//*********************************************************
void PrintUART0(char *s)
{
for(;*s!='\0';s++)
{
while(!(USTAT0&0x40));
UTXBUF0=*s;
}
}
//*********************************************************
//函数名: InitUART();
//描述: 初始化指定的串行口;
//参数: 串行口号;数据通信协议;
//返回值: 无
//*********************************************************
void InitUART(int Port,int Baudrate)
{
if(Port==0)
{ULCON0=0x03;
UCON0=0x09;
UBRDIV0=Baudrate;
}
if(Port==1)
{ULCON1=0x03;
UCON1=0x09;
UBRDIV1=Baudrate;
}
}
//*********************************************************
//函数名: delay(();
//描述: 软件延时;
//参数: 延时时间;
//返回值: 无
//*********************************************************
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();
//描述: 键盘扫描;
//参数: 无
//返回值: 无
//*********************************************************
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:
PrintUART0("KEY_CODE=0x01\n\r");
break;
case 0x1b:
PrintUART0("KEY_CODE=0x02\n\r");
break;
case 0x1c:
PrintUART0("KEY_CODE=0x03\n\r");
break;
case 0x1d:
PrintUART0("KEY_CODE=0xF1\n\r");
break;
case 0x2a:
PrintUART0("KEY_CODE=0x04\n\r");
break;
case 0x2b:
PrintUART0("KEY_CODE=0x05\n\r");
break;
case 0x2c:
PrintUART0("KEY_CODE=0x06\n\r");
break;
case 0x2d:
PrintUART0("KEY_CODE=0xF2\n\r");
break;
case 0x3a:
PrintUART0("KEY_CODE=0x07\n\r");
break;
case 0x3b:
PrintUART0("KEY_CODE=0x08\n\r");
break;
case 0x3c:
PrintUART0("KEY_CODE=0x09\n\r");
break;
case 0x3d:
PrintUART0("KEY_CODE=0xF3\n\r");
break;
case 0x4a:
PrintUART0("KEY_CODE=确认\n\r");
break;
case 0x4b:
PrintUART0("KEY_CODE=0x00\n\r");
break;
case 0x4c:
PrintUART0("KEY_CODE=取消\n\r");
break;
case 0x4d:
PrintUART0("KEY_CODE=0xF4\n\r");
break;
}
step=0;
break;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -