矩阵键盘扫描程序

矩阵键盘扫描程序,第1张

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

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

void key()

{

    P3=0xfe

    if(P3!=0xfe)

    {

        time(50)

        if(P3!=0xfe)

            {

            switch(P3)

                {

case 0xee:num=1,cs++

break

case 0xde:num=2,cs++

break

case 0xbe:num=3,cs++

break

case 0x7e:num=4,cs++

break

                }

        }

        while(P3!=0xfe)

}

P3=0xfd

if(P3!=0xfd)

{

time(50)

if(P3!=0xfd)

{

switch(P3)

{

case 0xed:num=5,cs++

break

case 0xdd:num=6,cs++

break

case 0xbd:num=7,cs++

break

case 0x7d:num=8,cs++

break

}

}

while(P3!=0xfd)

}

P3=0xfb

if(P3!=0xfb)

{

time(50)

if(P3!=0xfb)

{

         switch(P3)

{

case 0xeb:num=9,cs++

break

case 0xdb:num=0,cs++

break

case 0xbb:cs++

break

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

break

}

  }

while(P3!=0xfb)

}

}

淘bao 旺铺: 广州华电 单片机学习板 单片机外围学习模块/传感器模块

//4*4键盘检测程序,按下键后相应的代码显示在数码管上

#include<reg51.h>

sbit beep=P2^3

sbit dula=P2^6

sbit wela=P2^7

unsigned char i=100

unsigned char j,k,temp,key

void delay(unsigned char i)

{

for(j=ij>0j--)

for(k=125k>0k--)

}

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

display(unsigned char num)

{

P0=table[num]

dula=1

dula=0

P0=0xc0

wela=1

wela=0

}

void main()

{

dula=0

wela=0

while(1)

{

P3=0xfe

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delay(10)

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

beep=0

}

beep=1

display(key)

P1=0xfe

}

}

P3=0xfd

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delay(10)

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

beep=0

}

beep=1

display(key)

}

}

P3=0xfb

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delay(10)

if(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xeb:

key=8

break

case 0xdb:

key=9

break

case 0xbb:

key=10

break

case 0x7b:

key=11

break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

beep=0

}

beep=1

display(key)

}

}

P3=0xf7

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delay(10)

if(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xe7:

key=12

break

case 0xd7:

key=13

break

case 0xb7:

key=14

break

case 0x77:

key=15

break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

beep=0

}

beep=1

display(key)

}

}

}

}

C51 P1端口 4X4键盘说明

这是一个用C51单片机P1端口制作的4X4键盘,p1端口低4位是键盘列扫描线,高4位是键盘行扫描线,

列扫描线是输出,行扫描线是输入。

下面就程序作一个说明

(***)表示注意点

1、首先判断整个键盘有无按下键,只要行扫描线输入不为全1,(1111)即有键按下;

P1 = 0xf0if((P1&0xf0)!=0xf0) 如果无按键按下,全1,则返回return -1

如果有键按下则延时,再次判断有无按键按下,Delay()if((P1&0xf0)!=0xf0)如果无按键按下则返回return -1。

有键按下则继续,这个过程就是判键消抖,避免多次读键值,***或者因为按键抖动到读键值的时候无键按下,发生错误,***列扫描线是输出全0,P1 = 0xf0。

2、进入读键值了,与上面不同,每一次判断,***列扫描线只有一根输出为0,即P1=0xfe,0xfd,0xfb,0xf7

首先列扫描线P1.0,sCode = 0xfe如果行扫描线全1,则本列无键按下,扫描下一列

sCode = _crol_(sCode,1)***sCode左移一位,即0xfd,如此扫描4次,行扫描线都全0,则无键按下,

返回return -1

如果行扫描线不全0,就是有键按下,现在可以读键值了

kCode = ~P1//P1=EE,ED...

for(i=0i<16i++)

{

if(kCode == KeyCodeTable[i])

return i

}

1.首先kCode = ~P1***p1值取反行扫描线可能的是1,2,4,8;同样列扫描线对应值1,2,4,8

合起p1有16个值,就是KeyCodeTable[i]表的x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,

0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88

如果 if(kCode == KeyCodeTable[i]) 成立,对应的 i 值就是键号。

2.返回i值就是键号,return i。

uchar Keys_Scan()

{

uchar sCode,kCode,i,k

P1 = 0xf0

if((P1&0xf0)!=0xf0) //扫描列

{

Delay()

if((P1&0xf0)!=0xf0)//消抖

{

sCode = 0xfe

for(k=0k<4k++)

{

P1 = sCode//查找低位

if((P1&0xf0)!=0xf0)//只有等于才执行else P1和0xf0作与为0xf0 与 同真为真,一假为假

{

kCode = ~P1//P1=EE,ED...

for(i=0i<16i++)

{

if(kCode == KeyCodeTable[i])

return i

}

}

else

sCode = _crol_(sCode,1)

}

}

}

return -1

}


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

原文地址:https://54852.com/yw/8141949.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存