⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init_kb.c

📁 lcd 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 + -