51单片机矩阵键盘按键C语言程序

  • 格式:doc
  • 大小:28.00 KB
  • 文档页数:2

下载文档原格式

  / 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#define uchar unsigned char

#define uint unsigned int

uchar

smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7 1} ;

uchar smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78} ;

//有一篇74HC573必须为高电平

//*************************8

//12M频率下大约50US延时

//**************************

void delay_50us(uint t)

{

uchar j;

for(;t>0;t--)

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

}

void delay_50ms(uint t)

{

uchar j;

for(;t>0;t--)

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

}

/*这个程序可以不用松手检测,因为我们程序首选判断键是否按下

然后发现按下后我们延时5MS,然后再检测。确实是按下啦。我们再执行

在第二个循环假如我们继续检测,那么消耗时间10MS这个短时间中

我们的按键已经松手啦。不会在执行后面的。

*/

void main()

{

uchar key_l,key_h;

uchar key;

while(1)

{

P3=0xf0; //首先给P3口赋值

key_l=P3; //从p3口读一个数据到key_l

key_l=key_l&0xf0;

if(key_l!=0xf0) //如果不等于的话,说明有按键按下去

{

delay_50us(100);//稍微延时一下

if(key_l!=0xf0)

{

key_l=P3&0xf0;// 11100000 再读一次P3的值然后和0xf0相与

key_l=key_l|0x0f; // 11101111

P3=key_l; //在把key_l的值送给P3口

//此时P3口的值为11101111,而正在此时我们把键按下啦因此按下的键为11101110与11101111

// 相与还是11101110;

key_h=P3; //再读一次P3口,键还是按下,可以得到行的值。

key_h=key_h&0x0f; //00001110

key_l=key_l&0xf0; //11100000

key=key_l+key_h; //11101110

}

}

switch(key)

{

case 0xee:P1=smg_du[0];break;

case 0xde:P1=smg_du[1];break;

case 0xbe:P1=smg_du[2];break;

case 0x7e:P1=smg_du[3];break;

case 0xed:P1=smg_du[4];break;

case 0xdd:P1=smg_du[5];break;

case 0xbd:P1=smg_du[6];break;

case 0x7d:P1=smg_du[7];break;

case 0xeb:P1=smg_du[8];break;

case 0xdb:P1=smg_du[9];break;

case 0xbb:P1=smg_du[10];break;

case 0x7b:P1=smg_du[11];break;

case 0xe7:P1=smg_du[12];break;

case 0xd7:P1=smg_du[13];break;

case 0xb7:P1=smg_du[14];break;

case 0x77:P1=smg_du[15];break;

}

}

}