📄 init_kb.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include "usr_config.h"
#include "osaware.h"
#include <systypes.h>
#include <bsp.h>
//#define READ_REGI 0x06003000 /*****两个寄存器*******/
//#define WRITE_REGI 0x06004000
#define FST_ROW 0xfe
#define SND_ROW 0xfd
#define THIRD_ROW 0xfb
#define FOURTH_ROW 0xf7
#define FIFTH_ROW 0xef
#define FST_COL 0xfe
#define SND_COL 0xfd
#define THIRD_COL 0xfb
#define FOURTH_COL 0xf7
#define ArraySize(x) sizeof(x)/sizeof(x[0])//
enum bool {false,true};
//typedef judge bool;
unsigned char Rows[]={FST_ROW,SND_ROW,THIRD_ROW,FOURTH_ROW,FIFTH_ROW};
unsigned char Cols[]={FST_COL,SND_COL,THIRD_COL,FOURTH_COL};
unsigned char *read_regi=(unsigned char *)(0x06003000);
unsigned char *write_regi=(unsigned char *)(0x06004000);
char KeyScanCodeTable[5][4] =
{
{0x1b,'0',',',0x08}, /* row 1:ESC 0 , 删除 */
{'+','1','2','3'}, /* row 2:+ 1 2 3 */
{'-','4','5','6'}, /* row 3:- 4 5 6 */
{'*','7','8','9'}, /* row 4:* 7 8 9 */
{'/',0x20,'.',0x0d} /* row 5:/ 空格 . 回车 */
};
delta_task Init();
void testKB();
void task_delete_hook( void *stack )
{
free( stack );
}
delta_task Init(void)//主程序
{
printf("\n*** Enter KB test***\n");
while(1)
testKB();
}
//Delay函数
inline static void Delay(long d)
{
while(d--);
}
//写寄存器清0
T_VOID fnDR_KeyboardInitialize(T_VOID)
{
Delay(2000);
*write_regi=0;//
}
T_BYTE fnDR_KeyboardInch(T_VOID)
{
unsigned char Regi_value=0xFF,Test_value;
int row_num=0,col_num=0;
enum bool row_flag=false;
enum bool col_flag=false;
int i=0,j=0;
char c;
while(row_flag==false || col_flag==false)//不停地循环,直到有键按下为止
{
Delay(80000);
while(1)//确定被按下的键所在的行,循环直到读寄存器的值不为FF
{
row_flag=false;
for(i=0;i<ArraySize(Rows);i++)//低电平行扫描
{
Delay(2000);
*write_regi=Rows[i];//将行地址写入写寄存器
Delay(100);
Regi_value=*read_regi;//寄存器值记录在Regi_value中
Delay(200000);
if(Regi_value!=0xFF)
{
row_flag=true;
row_num=i;//将行数记录在row_num中
break;//跳出for循环
}
}
if(row_flag==true)
break;//跳出确定行的循环(第2层while循环)
}
col_flag=false;
col_num=0;
Test_value=0x01;
for(j=0;j<ArraySize(Cols);j++)
{
if((Regi_value & Test_value)==0)
{
col_flag=true;
break;//如果找到按下的列,就跳出该for循环
}
Test_value<<=1;//左移一位
col_num++;
}
}//跳出第一层while循环
Delay(80000);
// 将对应的字符取出
c=KeyScanCodeTable[row_num][col_num];
if(c==0x1b)
{printf("ESC"); return 0;}
else {
if(c==0x08)
{printf("BACKSPACE"); return 0;}
else return c;
}
}
void testKB()
{
int value;
printf("Enter a character: ");
scanf(" %d\n",&value);
printf("The character is %d\n",value);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -