矩阵键盘程序(stm32矩阵键盘程序)

更新时间:2023-03-01 07:24:45 阅读: 评论:0

矩阵键盘扫描程序

你要放到“死循环”中不断扫描。他的原理图一般是这样的

以第一个按键为例,当你按下时I/O口读到的数据就不是0x0f了。好吧你最开始的赋值错了。你要用0xee,0xde检测的话你应该给0xfe。每四个按键是一组。我这有一个我做密码锁的程序你参考一下。

void key()

{

P3=0xfe;

if(P3!=0xfe)

{

time(50);

if(P3!=0xfe)

{

switch(P3)

{

ca 0xee:num=1,cs++;

break;

ca 0xde:num=2,cs++;

break;

ca 0xbe:num=3,cs++;

break;

ca 0x7e:num=4,cs++;

break;

}

}

while(P3!=0xfe);

}

P3=0xfd;

if(P3!=0xfd)

{

time(50);

if(P3!=0xfd)

{

switch(P3)

{

ca 0xed:num=5,cs++;

break;

ca 0xdd:num=6,cs++;

break;

ca 0xbd:num=7,cs++;

break;

ca 0x7d:num=8,cs++;

break;

}

}

while(P3!=0xfd);

}

P3=0xfb;

if(P3!=0xfb)

{

time(50);

if(P3!=0xfb)

{

switch(P3)

{

ca 0xeb:num=9,cs++;

break;

ca 0xdb:num=0,cs++;

break;

ca 0xbb:cs++;

break;

ca 0x7b:num=10,cs=0,a=b=c=d=e=f=10,ply=1;

break;

}

}

while(P3!=0xfb);

}

}


c51矩阵键盘程序怎么写

#include <reg52.h>

#define key P2
int val;

char code sign[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void delay_10ms();

void key_scan(); //矩阵按键函数声明

void main()
{
while(1)

{
P0=sign[val];
key_scan();
}
}

void key_scan()
{
static char a,b; //a用于判断是不是第一次按下,b用于稍微延时
char state; //记录键值
key=0x0f;
if(key!=0x0f) //如果有按键按下
{
state=key; //记录第一次按键状态
if(a==0) //如果第一次按下
{
b++; //略微延时 不需要延时10ms以提高单片机效率
if(b>3)
{
if(key==state) //判断键值是否和第一次一致
{
a=1,b=0; //复位状态值 a==1说明已经按下,等待后续松开
key=0x0f; //测试列
switch(key)
{
ca (0x07): val=0;break;
ca (0x0b): val=1;break;
ca (0x0d): val=2;break;
ca (0x0e): val=3;break;
}
key=0xf0; // 测试行
switch(key)
{
ca (0x70): val=val;break;
ca (0xb0): val=val+4;break;
ca (0xd0): val=val+8;break;
ca (0xe0): val=val+12;break;
}
}
}
}
}
el
{
a=b=0; //松开后复位状态机
}
}

51单片机4*3矩阵键盘6位密码锁c语言程序

#include<stdio.h>
#include<reg51.h>
#define uchar unsigned char

uchar key;
int i=0;
char b[4]={'0','0','0','0'};//输入的密码放这里和初始的比较来判断是否密码正确
void keyscan() //扫描按键是否按下
{
uchar temp;
P3=0xfe; //扫描第一行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //判断按键是否按下
{
delayms(10);//去抖动
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//确认按键按下
{
temp=P3;
switch(temp)
{
ca 0xee:key='0';break;
ca 0xde:key='1';break;
ca 0xbe:key='2';break;
ca 0x7e:key='3';break;
}
while(temp!=0xf0) //判断按键是否松开
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xfd; //扫描第二行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
ca 0xed:key='4';break;
ca 0xdd:key='5';break;
ca 0xbd:key='6';break;
ca 0x7d:key='7';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xfb; //扫描第三行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
ca 0xeb:key='8' ;break;
ca 0xdb:key='9' ;break;
ca 0xbb:key='A';break;
ca 0x7b:key='B';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xf7; //扫描第四行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
ca 0xe7:key='C';break;
ca 0xd7:key='D';break;
ca 0xb7:key='E';break;
ca 0x77:key='F';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
}

main()
{
char a[4]={'3','5','A','C'}; //这个做初始密码
while(1)//无限循环,保证了b 0-3 四个数有值
{
keyscan();
if(a[0]==b[0]&&a[1]==b[1]&&a[2]==b[2]&&a[3]==b[3])
{
//这里写密码正确程序要怎么处理
}
}
}

矩阵键盘程序解析,扫描和判断程序如下。求注释!!真心看不懂啊!4*4矩阵

大体上看了一下你的程序, 就是一个很简单的键盘扫描~~ 你应该看看矩阵键盘的原理,再看这个的时候就很简单了~~我给你手写也有点累~ 处于责任心,给你写点吧!! 这个程序实现的是4*4的矩阵键盘,用高4位来进行扫描是否有键按下(高位的4个口轮流置零扫描), 如果有键按下(置零的哪个口连接的线就会和低四位其中的一根线接触)低四位中就会有一个口为低电平.... 剩下的就是通过高低4位来判断具体按键是哪个~~ 我不写了~~ 自己了解一下原理吧,很简单~~~ 加油!

PANDUAN: MOV P3,#0FFH //程序开始 p3口全部拉高

  CLR P3.4 //P3.4置零 P3=0XEF

  MOV A,P3 //将P3端口的值赋给A---0XEF
  ANL A,#0FH //将上一步得到的值 和0X0F逻辑与---也就是取P3口低四位0X0F----结果存到A

  XRL A,#0FH //A里面的值 与0X0F异或 ---结果为0

  JZ SW1 //如果为零 则跳转到SW1,否则往下执行---含义就是如果为零则代表无键按下 否则有

  LCALL DELAY10MS //延时10MS--有按键按下, 软件消抖

  JZ SW1 //继续判断---确定有键按下 但是不确定是哪个键按下 --接下来判断哪个键按下

  MOV A,P3 // 以解释
  ANL A,#0FH //以解释

  CJNE A,#0EH,K1 //A不等于0x0E 则跳转到k1, 否则往下执行

  MOV COUNT,#0 //count置零

  LJMP DK //跳转到DK

  K1: CJNE A,#0DH,K2

  MOV COUNT,#4

  LJMP DK

  K2: CJNE A,#0BH,K3

  MOV COUNT,#8

  LJMP DK

  K3: CJNE A,#07H,K4

  MOV COUNT,#12

  K4: NOP

  LJMP DK

  SW1: MOV P3,#0FFH //以上分析的结果--程序跳转到这执行

  CLR P3.5 //与之前的分析很类似--以下不在分析

  MOV A,P3

  ANL A,#0FH

  XRL A,#0FH

  JZ SW2

  LCALL DELAY10MS

  JZ SW2

  MOV A,P3

  ANL A,#0FH

  CJNE A,#0EH,K5

  MOV COUNT,#1

  LJMP DK

  K5: CJNE A,#0DH,K6

  MOV COUNT,#5

  LJMP DK

  K6: CJNE A,#0BH,K7

  MOV COUNT,#9

  LJMP DK

  K7: CJNE A,#07H,K8

  MOV COUNT,#13

  K8: NOP

  LJMP DK

  SW2: MOV P3,#0FFH

  CLR P3.6

  MOV A,P3

  ANL A,#0FH

  XRL A,#0FH

  JZ SW3

  LCALL DELAY10MS

  JZ SW3

  MOV A,P3

  ANL A,#0FH

  CJNE A,#0EH,K9

  MOV COUNT,#2

  LJMP DK

  K9: CJNE A,#0DH,KA

  MOV COUNT,#6

  LJMP DK

  KA: CJNE A,#0BH,KB

  MOV COUNT,#10

  LJMP DK

  KB: CJNE A,#07H,KC

  MOV COUNT,#14

  KC: NOP

  LJMP DK

  SW3: MOV P3,#0FFH

  CLR P3.7

  MOV A,P3

  ANL A,#0FH

  XRL A,#0FH

  JZ SW4

  LCALL DELAY10MS

  JZ SW4

  MOV A,P3

  ANL A,#0FH

  CJNE A,#0EH,KD

  MOV COUNT,#3

  LJMP DK

  KD: CJNE A,#0DH,KE

  MOV COUNT,#7

  LJMP DK

  KE: CJNE A,#0BH,KF

  MOV COUNT,#11

  LJMP DK

  KF: CJNE A,#07H,KG

  MOV COUNT,#15

  KG: NOP

  LJMP DK

  SW4: LJMP PANDUAN

  DK: RET

求助程序:51单片机矩阵键盘是否按下检测程序

/**************************************************************************************
* 矩阵按键实验 *
实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字
S1-S4:0-3
S5-S8:4-7
S9-S12:8-B
S13-S16:C-F。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 KeyValue; //用来存放读取到的键值
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : KeyDown
* 函数功能 : 检测有按键按下并读取键值
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay(1000);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
ca(0X07): KeyValue=0;break;
ca(0X0b): KeyValue=1;break;
ca(0X0d): KeyValue=2;break;
ca(0X0e): KeyValue=3;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
ca(0X70): KeyValue=KeyValue;break;
ca(0Xb0): KeyValue=KeyValue+4;break;
ca(0Xd0): KeyValue=KeyValue+8;break;
ca(0Xe0): KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
{
delay(1000);
a++;
}
}
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
LSA=0; //给一个数码管提供位选
LSB=0;
LSC=0;
while(1)
{
KeyDown(); //按键判断函数
GPIO_DIG=smgduan[KeyValue]; //
}
}

本文发布于:2023-02-28 19:39:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/167762668567457.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:矩阵键盘程序(stm32矩阵键盘程序).doc

本文 PDF 下载地址:矩阵键盘程序(stm32矩阵键盘程序).pdf

标签:矩阵   键盘   程序
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|