单片机矩阵键盘程序求解释和修正!

单片机矩阵键盘程序求解释和修正!,第1张

没有硬件电路,单从程序来看应该没错。我加了注释,你可以参考下。

#include<STC12C5A60S2h>

char code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x00,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};

void delayms(int xms)

{

int i,j;

for(i=xms;i>0;i--) //i=xms即延时约xms毫秒

for(j=110;j>0;j--);

}

void display(char num)

{

P1=table[num]; //段选数据

}

void matrixkeyscan()

{

char temp,key;

P3=0xfe;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)//说明有按键按下

{

delayms(10);//延时,去抖动

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)//说明按键被持续按下

{

temp=P3;//记录P3口状态

switch(temp)//根据现在的状态判断哪个按键被按下

{

case 0xee: //p3^4被按下

key=0;

break;

case 0xde: //p3^5

key=1;

break;

case 0xbe://p3^6

key=2;

break;

case 0x7e://p3^7

key=3;

break;

}

while(temp!=0xf0)//按键松开之后跳出循环

{

temp=P3;

temp=temp&0xf0;

}

display(key);//显示

}

}

P3=0xfd;

{};

P3=0xfb:

{};

P3=0xf7;

{};

void main()

{

P0M1 = 0x00;//推挽输出的定义

P0M0 = 0x0f;//推挽输出的定义

P0=0x0f;

while(1)

{

matrixkeyscan();//不停调用键盘扫描程序

}

}

#include<stdioh>

#include<reg51h>

#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)

{

case 0xee:key='0';break;

case 0xde:key='1';break;

case 0xbe:key='2';break;

case 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)

{

case 0xed:key='4';break;

case 0xdd:key='5';break;

case 0xbd:key='6';break;

case 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)

{

case 0xeb:key='8' ;break;

case 0xdb:key='9' ;break;

case 0xbb:key='A';break;

case 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)

{

case 0xe7:key='C';break;

case 0xd7:key='D';break;

case 0xb7:key='E';break;

case 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])

{

//这里写密码正确程序要怎么处理

}

}

}

代码应该可以。。 我没板子,只是想着写。你main里面加上你要的功能试试,顺便把结果告诉我下。。。 我只是给每个按键做标记,然后根据按键按下的顺序,和预定的标记相同则判断密码正确。 按键是低电平选通。

/

矩阵按键实验

实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字

S1-S4:0-3

S5-S8:4-7

S9-S12:8-B

S13-S16:C-F。

注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。

/

#include "reg52h" //此文件中定义了单片机的一些特殊功能寄存器

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)

{

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++;

}

}

}

}

/

函 数 名 : main

函数功能 : 主函数

输 入 : 无

输 出 : 无

/

void main()

{

LSA=0; //给一个数码管提供位选

LSB=0;

LSC=0;

while(1)

{

KeyDown(); //按键判断函数

GPIO_DIG=smgduan[KeyValue]; //

}

}

楼主的疑问是正确的,程序需要修改:

main:

mov p1, #0f0h ;在P10~P13输出低电平

mov r7, #0ffh ;

key:djnz r7, key ;延时

mov a, p1 ;读P1,如有按键,高四位将有0

cpl a ;求反,有按键时,高四位将有1

anl a, #0f0h ;低四位置为0,高四位不变

jz ekey ;全0就是没有按键,退出

这矩阵按键是怎么接的?把开发板的原理图发上来。还有开发版上最右边的4个LED灯指示是怎么接的,不知道也不好写程序的。用仿真图实现你的要求,用了4X4的矩阵按键,接在P3口,4个LED灯接在P0口了,仿真效果如下所示。

以上就是关于单片机矩阵键盘程序求解释和修正!全部的内容,包括:单片机矩阵键盘程序求解释和修正!、求51单片机4*3矩阵键盘6位密码锁c语言程序、求助程序:51单片机矩阵键盘是否按下检测程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9334094.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存