[原创] 学习心得:最近采用的键盘扫描,采用键反转方法,大家可以贴出其他方法

zyc1   2011-4-7 22:55 楼主
#include "hw_memmap.h"                // hw_memmap.h - Macros defining the memory map of Stellaris.
#include "hw_types.h"                // hw_types.h - Common types and macros.       
#include "hw_sysctl.h"
#include "sysctl.h"               
#include "rom.h"                       
#include"hw_gpio.h"
#include "gpio.h"                       
#include "hw_ints.h"                 
//#include"key316.h"

#define uchar  unsigned char
#define uint   unsigned int
#define ulong  unsigned long
//extern void Delay(ulong ulVal)

//#ifndef KEYBOARD_H
//#define KEYBOARD_H
//定义长标识符成较短的形式
#define SysCtlPeriEnable        SysCtlPeripheralEnable
#define SysCtlPeriDisable       SysCtlPeripheralDisable
#define GPIOPinTypeIn           GPIOPinTypeGPIOInput
#define GPIOPinTypeOutOD        GPIOPinTypeGPIOOutputOD

//行线使用GPIOF(0-3)
#define KEYBOARD_LIN_PERIPH        SYSCTL_PERIPH_GPIOF
#define KEYBOARD_LIN_BASE          GPIO_PORTF_BASE
#define KEYBOARD_LIN_PIN       0x0F                  
//列线使用GPIOH(0-3)
#define KEYBOARD_COL_PERIPH        SYSCTL_PERIPH_GPIOH
#define KEYBOARD_COL_BASE          GPIO_PORTH_BASE
#define KEYBOARD_COL_PIN       0x0F                             
////读取按键的函数
//extern uchar scankeyboard(void);
////键盘初始化函数
//extern uchar KeyInit(void);
////将获取的按键转化为相应的指令,0xFF代表非法指令或者未按键
//extern void keyProcess(void);
#endif

uchar scanKeyboard(void)
{

ulong scanValue[20]={0xEE,0xDE,0xBE,0x7E,
                            0xED,0xDD,0xBD,0x7D,
                            0xEB,0xDB,0xBB,0x7B,
                            0xE7,0xD7,0xB7,0x77,                                                                       
                           };

const ulong keyASC[20]={'1','2','3','4',
                            '5','6','7','8',
                            '9','10','11','12',
                            '13','14','15','16',
                               };         

         
//定义变量及使能GPIOE和GPIOB                 
ulong key,temp,temp1,temp2,temp3;
SysCtlPeripheralEnable(KEYBOARD_LIN_PERIPH);
SysCtlPeripheralEnable(KEYBOARD_COL_PERIPH);
//9个引脚全部上拉电阻有效
GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
GPIOPinTypeOutOD(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);         
GPIOPinTypeIn(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN);              
GPIOPinWrite(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,0x00);              
temp1=GPIOPinRead(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN)& KEYBOARD_COL_PIN;
temp1=temp1<<4;                                   

GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
GPIOPinTypeIn(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);               
GPIOPinTypeOutOD(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN);            
GPIOPinWrite(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,0x00);               
temp2=GPIOPinRead(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN)& KEYBOARD_LIN_PIN;   
temp=temp1 | temp2;                                                                   

if(temp!=0xFF)                                    
{
//    Delay(13*SysCtlClockGet()/4000);                            //延时去抖动
    SysCtlDelay(13*(SysCtlClockGet()/3000));
    GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
    GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
    GPIOPinTypeOutOD(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);      
    GPIOPinTypeIn(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN);         
    GPIOPinWrite(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,0x00);           
    temp1=GPIOPinRead(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN)& KEYBOARD_COL_PIN;
    temp1=temp1<<4;  
          
        GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
    GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
    GPIOPinTypeIn(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);         
    GPIOPinTypeOutOD(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN);      
    GPIOPinWrite(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,0x00);           
    temp2=GPIOPinRead(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN)& KEYBOARD_LIN_PIN;
          
        temp3=temp1 | temp2;
          
          if(temp3==temp)
                  {
                     for(key=0;key<20;key++)       
                       if(temp==scanValue[key])
                                {
                                  GPIOPinTypeIn(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);
                                  GPIOPinTypeIn(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN);       
                                  return(keyASC[key]);                       
                                }
                  }
}
return ('N');
}

void KeyInit(void)
{
   SysCtlPeriEnable(KEYBOARD_LIN_PERIPH);
   SysCtlPeriEnable(KEYBOARD_COL_PERIPH);       
   GPIOPinTypeIn(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);
   GPIOPinTypeIn(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN);       
}

void keyProcess(uchar KeyValue)
{
//  完成按键的功能;
}

[ 本帖最后由 zyc1 于 2011-4-7 22:59 编辑 ]

    key.rar (2011-4-7 22:55 上传)

    1.23 KB, 下载次数: 38

回复评论 (13)

如果贴出思路比较好吧 光看 感觉比较麻烦
点赞  2011-4-7 23:22
看得我云里雾里~
点赞  2011-4-7 23:41

学习了

http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2011-4-9 06:42

注释了下

#include "hw_memmap.h"  // hw_memmap.h - Macros defining the memory map of Stellaris.
#include "hw_types.h"  // hw_types.h - Common types and macros. 定义了一个tBoolean(unsigned char),定义位带
#include "hw_sysctl.h"
#include "sysctl.h"  // sysctl.h - Prototypes for the system control driver.
#include "rom.h"   // rom.h - Macros to facilitate calling functions in the ROM.
#include"hw_gpio.h"
#include "gpio.h"   // gpio.h - Defines and Macros for GPIO API.
#include "hw_ints.h"    // hw_ints.h - Macros that define the interrupt assignment on Stellaris.
//#include"key.h"    //原来下面的宏定义是在头文件里面的,为了方便看就放负复制到key.C来了一样用

#define uchar  unsigned char
#define uint   unsigned int
#define ulong  unsigned long
//extern void Delay(ulong ulVal)

//#ifndef KEYBOARD_H
//#define KEYBOARD_H
//定义长标识符成较短的形式
#define SysCtlPeriEnable        SysCtlPeripheralEnable
#define SysCtlPeriDisable       SysCtlPeripheralDisable
#define GPIOPinTypeIn           GPIOPinTypeGPIOInput
#define GPIOPinTypeOutOD        GPIOPinTypeGPIOOutputOD

//行线使用GPIOF
#define KEYBOARD_LIN_PERIPH        SYSCTL_PERIPH_GPIOF
#define KEYBOARD_LIN_BASE          GPIO_PORTF_BASE
#define KEYBOARD_LIN_PIN      GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4      //  0x0F
//列线使用GPIOH
#define KEYBOARD_COL_PERIPH        SYSCTL_PERIPH_GPIOH
#define KEYBOARD_COL_BASE          GPIO_PORTH_BASE
#define KEYBOARD_COL_PIN       GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4      // 0x0F                            
////读取按键的函数
//extern uchar scanKeyboard(void);
////键盘初始化函数
//extern uchar KeyboardInit(void);
////将获取的按键转化为相应的指令,0x1E1F代表非法指令或者未按键
//extern void keyProcess(void);
////#endif

uchar scanKeyboard(void)
{
 ulong scanValue[16]={0xEE,0xDE,0xBE,0x7E,     //定义键值
                     0xED,0xDD,0xBD,0x7D,
                     0xEB,0xDB,0xBB,0x7B,
                     0xE7,0xD7,0xB7,0x77,                                                          
                    };
             
 const uchar keyASC[20]={1,2,3,4,       //返回键号
                         5,6,7,8,
                         9,10,11,12,
       13,14,15,16

                        }; 
//定义变量及使能GPIO   
ulong key,temp,temp1,temp2,temp3;
SysCtlPeripheralEnable(KEYBOARD_LIN_PERIPH);
SysCtlPeripheralEnable(KEYBOARD_COL_PERIPH);
//8个引脚全部上拉电阻有效
GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
GPIOPinTypeOutOD(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);          //设置为输出(行线)GPIOF(0-3)
GPIOPinTypeIn(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN);              //设置为输入(列线)GPIOH(0-3)
GPIOPinWrite(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,0x00);              //行线输出0
temp1=GPIOPinRead(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN)& KEYBOARD_COL_PIN; //读列线的值
temp1=temp1<<4;                                  

GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
GPIOPinTypeIn(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);                //设置为输入(行线)
GPIOPinTypeOutOD(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN);             //设置为输出(列线)
GPIOPinWrite(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,0x00);                //列线输出0
temp2=GPIOPinRead(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN)& KEYBOARD_LIN_PIN;   //读行线的值
temp=temp1 | temp2;                  

if(temp!=0xFF)                                            //有键按下
{
//    Delay(13*SysCtlClockGet()/4000);                     //延时去抖动
    SysCtlDelay(13*(SysCtlClockGet()/3000));
    GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
    GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
    GPIOPinTypeOutOD(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);       //设置为输出(行线)
    GPIOPinTypeIn(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN);           //设置为输入(列线)
    GPIOPinWrite(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,0x00);           //行线输出0
    temp1=GPIOPinRead(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN)& KEYBOARD_COL_PIN;
    temp1=temp1<<4; 
  
 GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
    GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);
    GPIOPinTypeIn(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);          //设置为输入(行线)
    GPIOPinTypeOutOD(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN);        //设置为输出(列线)
    GPIOPinWrite(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,0x00);           //列线输出0
    temp2=GPIOPinRead(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN)& KEYBOARD_LIN_PIN;
  
 temp3=temp1 | temp2;
  
   if(temp3==temp)
    {
       for(key=0;key<20;key++) 
         if(temp==scanValue[key])
           {
             GPIOPinTypeIn(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN);
             GPIOPinTypeIn(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN); 
             return(keyASC[key]);        
           }
    }
}
return ('N');
}

[ 本帖最后由 zyc1 于 2011-4-16 23:26 编辑 ]
点赞  2011-4-16 23:17
把有的语句注释了下,大家就好明白了 其实也很简单的啊
点赞  2011-4-16 23:28
辛苦啦
加油!在电子行业默默贡献自己的力量!:)
点赞  2011-4-17 08:23
现在有一种检测按键的方法是---基于“状态机”的,你可以试一下
点赞  2011-4-17 17:08
这么长的代码,合用,在实际应用中有何好处?
点赞  2011-4-17 17:50
ti彻底火了哈哈哈
点赞  2011-4-17 19:18

回复 10楼 鑫海宝贝 的帖子

LS的话说的好莫名其妙
点赞  2011-4-17 20:27

回复 11楼 leang521 的帖子

嘿嘿
点赞  2011-4-18 09:09
thank u............
点赞  2011-7-9 17:20
不知道为什么会有这么长的延时  SysCtlDelay(13*(SysCtlClockGet()/3000));


cpu白白等待13mS,这个时间内,可以运行上万条指令了
点赞  2012-4-14 18:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复