6727|13

154

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

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

#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

1.23 KB, 下载次数: 38

最新回复

不知道为什么会有这么长的延时  SysCtlDelay(13*(SysCtlClockGet()/3000)); cpu白白等待13mS,这个时间内,可以运行上万条指令了  详情 回复 发表于 2012-4-14 18:22
 
点赞 关注

回复
举报

7173

帖子

195

TA的资源

五彩晶圆(高级)

沙发
 
如果贴出思路比较好吧 光看 感觉比较麻烦
 
 

回复

31

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
看得我云里雾里~
 
 
 

回复

1万

帖子

16

TA的资源

版主

4
 

学习了

 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

154

帖子

0

TA的资源

纯净的硅(初级)

5
 

注释了下

#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 编辑 ]
 
 
 

回复

154

帖子

0

TA的资源

纯净的硅(初级)

6
 
把有的语句注释了下,大家就好明白了 其实也很简单的啊
 
 
 

回复

2万

帖子

74

TA的资源

管理员

7
 
辛苦啦
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

373

帖子

0

TA的资源

纯净的硅(初级)

8
 
现在有一种检测按键的方法是---基于“状态机”的,你可以试一下
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

9
 
这么长的代码,合用,在实际应用中有何好处?
 
 
 

回复

4138

帖子

0

TA的资源

五彩晶圆(中级)

10
 
ti彻底火了哈哈哈
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

11
 

回复 10楼 鑫海宝贝 的帖子

LS的话说的好莫名其妙
 
 
 

回复

4138

帖子

0

TA的资源

五彩晶圆(中级)

12
 

回复 11楼 leang521 的帖子

嘿嘿
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

13
 
thank u............
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

14
 
不知道为什么会有这么长的延时  SysCtlDelay(13*(SysCtlClockGet()/3000));


cpu白白等待13mS,这个时间内,可以运行上万条指令了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表