一、原理说明

就是按键矩阵代码书写的一个说明,就是讲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. web开发架构设计

    2015-07-31 13:10:38 一, web服务器 .负载均衡 .不做对URL的rewrite逻辑判断, 全部转发到代码服务器的单一入口文件, 由代码去全权处理 二, 代码服务器(常跟web服 ...

  2. Oracle分页语句

    select * from (select A.*,rownum rd from (select * from [tablename] where [condition] order by  [con ...

  3. 51nod 1605 棋盘问题 (博弈)

    题目:传送门. 题意:中文题.T组数据,每组给定一个n*m的棋盘,棋盘中的1代表黑色,0代表白色,每次可以将1或者非2质数的全黑色方形区域变为白色,不能操作者输,问谁能赢. 题解:每次可以将1或者非2 ...

  4. js判断手机端操作系统(Andorid/IOS),并自动为链接添加相应下载地址

    <script type="text/javascript"> $(document).ready(function(e) { var u = navigator.us ...

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

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

  6. 模拟操作网页 webBrowser

    C# 获取IFrame中body元素 (winform) 方法1. 找出iframe的b.html的src , 利用webbrowser去加载b.html HtmlElementCollection ...

  7. September 23rd 2016 Week 39th Friday

    Even a small star shines in the darkness. 星星再小,也会发光. In the darkness, even a small star can shine. N ...

  8. 在MVC的项目中访问静态页面

    MVC在生成项目的时候会生成的WEB-INF底下.这个文件夹下面的文件是受保护的,都会走MVC的流程, 但是我希望在WebContent底下可以使用静态页面, 那么需要进入springmvc-serv ...

  9. Swift - 获取、改变按钮的标题文本(UIButton点击切换title)

    在开发中,我们常常需要动态地改变按钮标签文字,使用 setTitle() 函数就可以了.有时我们需要在几个标题间切换,比如下面样例所示,按钮点击后按钮文字会在"播放""暂 ...

  10. Vi 的基本使用

    一.Vi入门  Unix 提供了全屏幕的Vi编辑器,这使我们的工作轻松不少.不少DOS用户抱怨Vi编辑器不象DOS下的编辑器如edit那么好用,这 是因为Vi考虑到各种用户的需要,没有使用某些通用的编 ...