智能车学习(七)——按键矩阵的实现
一、原理说明
就是按键矩阵代码书写的一个说明,就是讲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表示没有按下去,否则就返回对应的按键值。
智能车学习(七)——按键矩阵的实现的更多相关文章
- 智能车学习(十五)——K60野火2013版例程
一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...
- 智能车学习(二十三)——浅谈心得体会
因为毕竟是竞赛,跟学校挂钩,没办法开源代码和算法完成思路,所以不能详细写太多,如果可以等价交换的话,应该还是可以向领导申请一下的. 在厦大信科通信系,参加这个比赛,大家都觉得性 ...
- 智能车学习(十八)——电机学习
一.C车电机选择 1.摘要: 因为C车模在四轮车的优势是有两个电机,可以进行主动差速,劣势是电机太弱了....所以如何选择电机,就是个钱的问题了,电机多一点,就比较好选,但是C车电机跑多了就 ...
- 智能车学习(二十二)——浅谈速度控制
一.经典PID控制 使用遇限反向PID会比较适合有加减速的车子,使用变速积分适合跑匀速的车子.然后这种方法的条件下,一定要尽可能缩短控制周期.. 二.PID加棒棒控制 针对 ...
- 智能车学习(二十)——浅谈C车硬连接与软连接
一.为何要追求软连接? 车子进行软连接之后,可以达到一种效果,就是在高速过程中,车子如果快要发生侧翻的时候,只会跳一个后轮,且只是轻微,而前轮如果进行的内倾,就可以让前轮最大面积接触,增大 ...
- 智能车学习(十七)——舵机学习
一.舵机的结构 舵机简单的说就是集成了直流电机.电机控制器和减速器等,并封装在一个便于安装的外壳里的伺服单元.能够利用简单的输入信号比较精确的转动给定角度的电机系统.舵机安装了一个电位器(或 ...
- 智能车学习(十一)——陀螺仪学习
一.学习说明 感觉就是配置I2C通信,然后直接移植51代码... 二.代码分享: 1.头文件: #ifndef I2C_GYRO_H_ #define I2C_GYRO_H_ /*********** ...
- 智能车学习(八)——菜单的实现
一.代码分享 1.头文件 #ifndef __MENU_H #define __MENU_H /***********宏定义************/ //页面声明 typedef enum Menu ...
- 智能车学习(六)——OLED屏幕使用
一.代码展示 1.头文件: #ifndef OLED_H_ #define OLED_H_ extern unsigned char Draw[]; extern const unsigned cha ...
随机推荐
- 如何使用参数 appActivity+appPackage 和 app
本文针对RobotFrameWork中AppiumLibrary测试库. 首先,Open Application 这个方法不能向手机中安装应用,需要提前在手机中安装好,如使用 adb install ...
- 小项目特供 简易迷宫(基于Java)
明天返校,于是昨天和今天简单熟系了一下JAVA的GUI,做了一个简易的迷宫小游戏(暂时没有时间实现随机迷宫及多关卡,仅供学习) 源码及运行文件(提供JRE8):链接:简易迷宫 密码:hy8v
- ASM:《X86汇编语言-从实模式到保护模式》第11章:进入保护模式
★PART1:进入保护模式 1. 全局描述符表(Global Descriptor Table,GDT) 32位保护模式下,如果要使用一个段,必须先登记,登记的信息包括段的起始地址,段的 ...
- Match:Milking Grid(二维KMP算法)(POJ 2185)
奶牛矩阵 题目大意:给定一个矩阵,要你找到一个最小的矩阵,这个矩阵的无限扩充的矩阵包含着原来的矩阵 思路:乍一看这一题确实很那做,因为我们不知道最小矩阵的位置,但是仔细一想,如果我们能把矩阵都放在左上 ...
- Android Shape自定义纯色圆角按钮
版权声明:分享技术,传播快乐.如果本博客对你有帮助,请在我的博客首页为我打赏吧! 在Android开发中,为响应美化应用中控件的效果,使用Shape定义图形效果,可以解决图片过多的问题. 首先看一下效 ...
- 【hadoop2.6.0】利用JAVA API 实现数据上传
原本的目的是想模拟一个流的上传过程,就是一边生成数据,一边存储数据,因为能用上HADOOP通常情况下原本数据的大小就大到本地硬盘存不下.这一般是通过把数据先一部分一部分的缓冲到本地的某个文件夹下,hd ...
- IOS-ARC和垃圾回收机制
ARC是编译层面的东西,垃圾回收是程序运行以后的机制,两者不可混为一谈 苹果觉得垃圾回收这种严重影响电源使用效率的特性,同移动设备天生的实时性是相冲突的.但是在iOS 5当中苹果引入了自动内存管理机制 ...
- java课后作业7
9.页实验 下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m; 答: d=m;和d=c;引起编译错误: 原因: ...
- ios tableview 适配横竖屏
tableview.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
- self dismissModalViewControllerAnimated:YES 无效(dismissviewcontrolleranimated无效)
作为一个viewController(VC),想要消失的时候可以从parent VC里面调用dismissModalViewControllerAnimated来消去改VC,也可以在该VC里面手动调用 ...