
Proteus仿真实验---4x4矩阵按键
简单介绍一下矩阵按键:将按键排列成4x4的矩阵,按照行列将按键的各引脚接在起,行接在P1口的高四位,列接在了P1口的低四位;最后仿真出现的问题是,列的值可以判断出,但是到行却没有?
最近在回顾学习,之前一直没想到要记录一下,突然想到还是要写一写学习笔记的,不仅能记录自己的学习过程,还能记录一下学习过程中出现的问题和思考。(知识能力有限,有错的地方还请不吝指正,谢谢!)
下面先来记录一下第一个问题:
一个简单的矩阵按键加数码显示如下:
简单介绍一下矩阵按键:将按键排列成4x4的矩阵,按照行列将按键的各引脚接在起,行接在P1口的高四位,列接在了P1口的低四位;用的数码管为四引脚控制的七段数码管。
电路:
keil程序:
行列判断:如有按键按下,判断列,先将P1口设置为0x0f,也就是将高四位置0低四位置为1,若是第一行第一列按下,则P1口值为0x07,给keyvalue赋值为0,也就是按键S0,表示第一行第一列,第二列P1口值为0x0b,keyvalue的值按它的排序值给,就是1,也是按键S1,剩下两列P1口值分别为0x0d,0x0e;
判断行,将P1口设置为0xf0,也就是高四位置1,低四位置0,若是第一列第一行按下,则P1口值为0x70,给keyvalue赋值为原来的keyvalue,第二行第一列按下P1口值为0xb0,keyvlaue的值则是在列判断基础上加4,按键则是S4,后面三个按键也是在原来列基础上加4,就是这一行的按键,还有两列对应的P1口的值为0xd0,0xe0。
这里有个问题:为什么P1口赋值0x0f,按键按下后为1的引脚会变为0?
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define GPIO_KEY P1
#define GPIO_LED P2
u8 KeyValue; //用来存放按键的值
void delay(u16 i) //延时函数
{
while(i--);
}
//u8 code smgduan[17] = {0x40,0xcf,0x24,0x30,0x19,
// 0x12,0x02,0xf8,0x00,0x10}; //单个数码管对应的0~9的值
void keyscan(void)
{
u8 a=0;
GPIO_KEY = 0x0f; //判断列
if(GPIO_KEY != 0x0f) //检测按键是否按下
{
delay(1000); //延时10ms消抖
if(GPIO_KEY != 0x0f)
{
GPIO_KEY = 0x0f; //判断列
switch(GPIO_KEY)
{
case(0x07):KeyValue = 0;break; //列的值
case(0x0b):KeyValue = 1;break;
case(0x0d):KeyValue = 2;break;
case(0x0e):KeyValue = 3;break;
}
GPIO_KEY = 0xf0; //判断行
switch(GPIO_KEY)
{
case(0x70):KeyValue = KeyValue;break; //
case(0xb0):KeyValue = KeyValue+4;break;
case(0xd0):KeyValue = KeyValue+8;break;
case(0xe0):KeyValue = KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY != 0xf0))
{
delay(1000);
a++;
}
}
}
}
void main()
{
while(1)
{
keyscan();
GPIO_LED = KeyValue;
}
}
最后仿真出现的问题是,列的值可以判断出,但是到行却没有?
更多推荐
所有评论(0)