一、原理说明

就是按键矩阵代码书写的一个说明,就是讲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. 自定义ToolBar之一

    其实已经有很多大神写过这方面的文章了,不过我比较蠢吧,老有一些地方看不懂的,翻了很多关于Toolbar方面的文章和视频,这儿总结一下.  参考资料:youtube:slidenerd 阶段一 自定义配 ...

  2. 【leetcode】 Search a 2D Matrix (easy)

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  3. 字符串与byte数组转换

    string weclome=""; byte[] data = new byte[1024]; //字符串转byte数组 data = Encoding.ASCII.GetByt ...

  4. CCF 节日

    问题描述 有一类节日的日期并不是固定的,而是以"a月的第b个星期c"的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日. 现在,给你a,b,c和y1, y2(1850 ≤ ...

  5. .net在当前日期的基础上加一天

    比如今天是:2015-11-10 18:57:01,在这个基础上加一天,那么就是2015-11-11 18:57:01,代码如下: DateTime now_dt = DateTime.Now; ). ...

  6. Oracle、SQL Server、MySQL分页方法

    测试用例:查询TEST_TABLE表中TEST_COLUMN列的第10-20条数据 1,Oracle分页方法 SELECT A.* FROM ( SELECT ROWNUM ROWNO, B.* FR ...

  7. 一个简单的代码计算行数demo编写

    最近手头的项目基本上已经完结,历经了5个月的开发和迭代,各种的需求调整,想对自己的代码量进行一个客观的计算,于是抽了点时间写下了这个小demo,朋友们有需要的可以看看,很简单. 基本的思想就是:根目录 ...

  8. JS_ECMA基本语法中的几种封装的小函数-2

    大家好!今天继续给大家写一下ECMA中的剩下的小函数以及实用的实例: 首先先给大家说一下字符串.数组.数学方法以及json的一点小知识点: 字符串方法: str.length str.charAt(i ...

  9. PHP面向对象——类常量,魔术常量与延期绑定

    普通常量  define('常量名',常量值): 以前说过:define定义的常量,全局有效 无论是页面内,函数内,类内,都可以访问. 例: define('ACC','Deny')    class ...

  10. Powershell实例小结(服务管理)

    有关服务管理的具体实例脚本如下: #$lists="1.1.1.1","2.2.2.2" #远程ip列表 foreach ($list in $lists){ ...