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

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

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

#include<STC12C5A60S2.h>

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=xmsi>0i--)//i=xms即延时约xms毫秒

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

}

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()//不停调用键盘扫描程序

}

}

uchar

keyscan(void)//键盘扫描函数,使用行列反转扫描法

比如:行为低电位,列为高四位

{

uchar

cord_h,cord_l//行列值

P3=0x0f

//行线输出全为0

cord_h=P3&0x0f

//读入列线值

if(cord_h!=0x0f)

//这个句话意思是这样的,如果有启余按键按下的话。那肯定就不是0x0f了。

{

主要就是识别按键按下作用

delay(100)

//去抖

if(cord_h!=0x0f)

//这是双重判定作用而已

{

cord_h=P3&0x0f

//读入列线值

P3=cord_h|0xf0

//输出当前列线值

cord_l=P3&0xf0

//读入液碧行线值

return(cord_h+cord_l)//键盘最后组合码值

}

}return(0xff)

//返回该值

}

好像你的程序解释得很好了。但是好像这么快,最好要延时下才准的。

我教闹旁举你按键的原理吧

就是那根线如果是高电平的话,遇到底电平就会变为底电平的。所以如果有按键按下的话,高电平就会变为低电平了。所以就可以读取了。


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

原文地址: https://outofmemory.cn/yw/12324192.html

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

发表评论

登录后才能评论

评论列表(0条)

保存