一、原理说明

就是按键矩阵代码书写的一个说明,就是讲K5到K7先输出高电平,而K1和K4则调成上拉输入,如果检测到K1到K4有一个变为0,说明有按键按下去,立刻进行转换,是的K1到K4设置为输出高电平,然后读取K5到K7为上拉输入,然后再读取到为0的点,通过这两个数据就能确定按下了那个按键。

二、基于KVL25代码书写:

1、头文件

#ifndef __KEYSQUARE_H
#define __KEYSQUARE_H /***********宏定义************/ #define keySquare_K1 PTD7
#define keySquare_K2 PTD6
#define keySquare_K3 PTD5
#define keySquare_K4 PTD4
#define keySquare_K5 PTD3
#define keySquare_K6 PTD2
#define keySquare_K7 PTD1 #define Keynum1 1
#define Keynum2 2
#define Keynum3 3
#define Keynum4 4
#define Keynum5 5
#define Keynum6 6
#define Keynum7 7
#define Keynum8 8
#define Keynum9 9
#define Keynum10 10
#define Keynum11 11
#define Keynum12 12
/*****************************/ /***********函数神经***********/ int keyBoard_get(void); /*****************************/ #endif

2、源文件

#include "include.h"
#include "common.h"
#include "OLED.h"
#include "gpio.h"
#include "KeySquare.h"
#include "lptmr.h" int keyBoard_get(void)
{
unsigned char tempdata=0x00;
unsigned char bdata=0x00;
int keyNum=0; //设置为输入,用于检测
gpio_init (keySquare_K1, GPI , 1);
gpio_init (keySquare_K2, GPI , 1);
gpio_init (keySquare_K3, GPI , 1);
gpio_init (keySquare_K4, GPI , 1); //设置为上拉
port_init_NoALT(keySquare_K1,PULLUP );
port_init_NoALT(keySquare_K2,PULLUP );
port_init_NoALT(keySquare_K3,PULLUP );
port_init_NoALT(keySquare_K4,PULLUP ); //设置为输出
gpio_init (keySquare_K5,GPO , 0);
gpio_init (keySquare_K6,GPO , 0);
gpio_init (keySquare_K7,GPO , 0); lptmr_delay_us(4);
tempdata = gpio_get(keySquare_K1);
tempdata += gpio_get(keySquare_K2) << 1;
tempdata += gpio_get(keySquare_K3) << 2;
tempdata += gpio_get(keySquare_K4) << 3;
if(tempdata != 0xff)
{
bdata = (tempdata << 4) | 0x00; gpio_init (keySquare_K1, GPO , 0);
gpio_init (keySquare_K2, GPO , 0);
gpio_init (keySquare_K3, GPO , 0);
gpio_init (keySquare_K4, GPO , 0); gpio_init (keySquare_K5,GPI , 1);
gpio_init (keySquare_K6,GPI , 1);
gpio_init (keySquare_K7,GPI , 1); //上拉
port_init_NoALT(keySquare_K5,PULLUP);
port_init_NoALT(keySquare_K6,PULLUP);
port_init_NoALT(keySquare_K7,PULLUP); lptmr_delay_us(4); tempdata = gpio_get(keySquare_K5);
tempdata += gpio_get(keySquare_K6) << 1;
tempdata += gpio_get(keySquare_K7) << 2;
bdata += tempdata;
switch(bdata)
{
case 230: keyNum=Keynum1; break;
case 214: keyNum=Keynum2; break;
case 182: keyNum=Keynum3; break;
case 118: keyNum=Keynum4; break;
case 229: keyNum=Keynum5; break;
case 213: keyNum=Keynum6; break;
case 181: keyNum=Keynum7; break;
case 117: keyNum=Keynum8; break;
case 227: keyNum=Keynum9; break;
case 211: keyNum=Keynum10; break;
case 179: keyNum=Keynum11; break;
case 115: keyNum=Keynum12; break;
default: break;
}
} return keyNum; }

三、使用说明

使用的时候,在Main函数进行调用,每次会返回一个值,0表示没有按下去,否则就返回对应的按键值。

智能车学习(七)——按键矩阵的实现的更多相关文章

  1. 智能车学习(十五)——K60野火2013版例程

    一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...

  2. 智能车学习(二十三)——浅谈心得体会

          因为毕竟是竞赛,跟学校挂钩,没办法开源代码和算法完成思路,所以不能详细写太多,如果可以等价交换的话,应该还是可以向领导申请一下的.       在厦大信科通信系,参加这个比赛,大家都觉得性 ...

  3. 智能车学习(十八)——电机学习

    一.C车电机选择 1.摘要:      因为C车模在四轮车的优势是有两个电机,可以进行主动差速,劣势是电机太弱了....所以如何选择电机,就是个钱的问题了,电机多一点,就比较好选,但是C车电机跑多了就 ...

  4. 智能车学习(二十二)——浅谈速度控制

    一.经典PID控制       使用遇限反向PID会比较适合有加减速的车子,使用变速积分适合跑匀速的车子.然后这种方法的条件下,一定要尽可能缩短控制周期..   二.PID加棒棒控制       针对 ...

  5. 智能车学习(二十)——浅谈C车硬连接与软连接

    一.为何要追求软连接?       车子进行软连接之后,可以达到一种效果,就是在高速过程中,车子如果快要发生侧翻的时候,只会跳一个后轮,且只是轻微,而前轮如果进行的内倾,就可以让前轮最大面积接触,增大 ...

  6. 智能车学习(十七)——舵机学习

    一.舵机的结构      舵机简单的说就是集成了直流电机.电机控制器和减速器等,并封装在一个便于安装的外壳里的伺服单元.能够利用简单的输入信号比较精确的转动给定角度的电机系统.舵机安装了一个电位器(或 ...

  7. 智能车学习(十一)——陀螺仪学习

    一.学习说明 感觉就是配置I2C通信,然后直接移植51代码... 二.代码分享: 1.头文件: #ifndef I2C_GYRO_H_ #define I2C_GYRO_H_ /*********** ...

  8. 智能车学习(八)——菜单的实现

    一.代码分享 1.头文件 #ifndef __MENU_H #define __MENU_H /***********宏定义************/ //页面声明 typedef enum Menu ...

  9. 智能车学习(六)——OLED屏幕使用

    一.代码展示 1.头文件: #ifndef OLED_H_ #define OLED_H_ extern unsigned char Draw[]; extern const unsigned cha ...

随机推荐

  1. Unity3d 防止内存修改工具的小方法

    一个非常简单的方法,直接上代码. private int curATK; private int curAtkKey; public int CurATK { get { return curATK ...

  2. Java for LeetCode 223 Rectangle Area

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  3. nyoj739_笨蛋难题四

    笨蛋难题四 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 这些日子笨蛋一直研究股票,经过调研,终于发现xxx公司股票规律,更可喜的是 笨蛋推算出这家公司每天的股价, ...

  4. js中apply,call的用法

    最近一直在用 js 写游戏服务器,我也接触 js 时间不长,大学的时候用 js 做过一个 H3C 的 web的项目,然后在腾讯实习的时候用 js 写过一些奇怪的程序,自己也用 js 写过几个的网站.但 ...

  5. HDU 5996 dingyeye loves stone ---BestCoder Round #90

    题目链接 设根节点的深度为0,将所有深度为奇数的节点的石子数目xor起来,则先手必胜当且仅当这个xor和不为0. 证明同阶梯博弈.对于偶深度的点上的石子,若对手移动它们,则可模仿操作:对于奇深度上的石 ...

  6. Oracle数据库对象题库

    一.    填空题 在用 create 语句创建基本表时,最初只是一个空的框架,用户可以使用insert命令把数据插入表中. 在基本表不需要时,可以使用 drop table 语句撤消.在一个基本表撤 ...

  7. 详解web.xml中元素的加载顺序

    一.背景 最近在项目中遇到了启动时出现加载service注解注入失败的问题,后来经过不懈努力发现了是因为web.xml配置文件中的元素加载顺序导致的,那么就抽空研究了以下tomcat在启动时web.x ...

  8. 基于Spring的可扩展Schema进行开发自定义配置标签支持

    一.背景 最近和朋友一起想开发一个类似alibaba dubbo的功能的工具,其中就用到了基于Spring的可扩展Schema进行开发自定义配置标签支持,通过上网查资料自己写了一个demo.今天在这里 ...

  9. HTML标记语法之图片Img元素

    语法:<img src=”xxx.jpg”alt=”xxx”title=”xxx”> 属性可取值如下: 属性名称 属性值 说明 src URL 图片路径 alt 文本 图片无法显示时的文本 ...

  10. Union函数

    . 共用体声明和共用体变量定义 共用体(参考“共用体”百科词条)是一种特殊形式的变量,使用关键字union来定义 共用体(有些人也叫"联合")声明和共用体变量定义与结构体十分相似. ...