由于DPJ8的16个按键属矩阵式键盘,较之直接接法要复杂,加之dpj8版本变换时输入/输出口作过变化,因此造成很多读者对DPJ8实验仿真板中的键盘用法不甚明了。
以下以C语言为例写一个例子,说明键的用法:
#include "at89x52.h"
typedef unsigned char uchar;
typedef unsigned int uint;
void mDelay(uint j)
{ uint i;
for(;j>0;j--)
for(i=0;i<125;i++);
}
/*键盘接法:
矩阵式键盘:

p3.7~p3.4是行线,用于输出
P3.3~P3.0是列行,用于输入
先读入P3的高4位的值,然后将相应的值再写入P3口的低4位
例:按键F读入P3.7的值,如果是0,则P3.3为0,否则为1
按键E 0, P3.4
.
.
.
.
*/
uchar GetKey()
{ uchar KeyValue,tmp;
uchar i;
P3=0x0f; //用于输入的P3口的I/O线置高,用于输出的I/O口线全部为低
KeyValue=P3; //获得P3口的值
KeyValue|=0xf0; //低4位置高
if(KeyValue==0xff)
return 0; //无键按下
else
mDelay(10); //否则延时10ms去键抖动
P3=0x0f; //用于输入的P3口的I/O线置高,用于输出的I/O口线全部为低
KeyValue=P3; //获得P3口的值
KeyValue|=0xf0; //低4位置高
if(KeyValue==0xff)
return 0;
else
{ for(i=0;i<4;i++)
{ P3=0xff; //P3口全部置高
P3&=~(0x80>>i);
/*0x80就是10000000B,当i=0时,0x80>>i即为该数本身,~为取反,即P3和01111111B相与
如果i=1,那么0x80>>i的结果是01000000,取反后是10111111,即P3和该数相与
i是其他值依次类推,保证每次总是只有一条输出线是低电平
*/
KeyValue=P3; //取键值
KeyValue|=0xf0;
if(KeyValue!=0xff)
break;
}
KeyValue&=~(0x10<
for(;;) //以下等待键释放
{ P3=0x0f;
tmp=P3;
tmp|=0xf0;
if(tmp==0xff)
break;
}
return KeyValue;
}
}
void main()
{
uchar KeyValue;
for(;;)
KeyValue=GetKey();
}
以下是按下各键后返回的键值:
E7,EB,ED,EE
D7,DB,DD,DE
B7,BB,BD,BE
77,7B,7D,7E
在得到这些键值后,不难对各键进行相应的处理。
顶一下 0
踩一下
相关文章
用户评论
已有0位网友发表了看法
400-810-1218
热点技术




发表评论