微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机的4X4矩阵键盘的C语言程序

51单片机的4X4矩阵键盘的C语言程序

时间:11-28 来源:互联网 点击:
#include

/////////////////////////////////////////数码管常量/////////////////////////////////////////////////////////

unsigned charcode table[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90}; //LED段码

unsigned char code position[]={1,2,4,8}; //LED选位码

/////////////////////////////////////////延时函数////////////////////////////////////////////////////////////

延时t毫秒

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void delay_ms(unsigned char t)

{

unsigned char t2=126;

while(t--)while(t2--);

}

///////////////////////////// 数码管显示函数 ////////////////////////////////////////////////////////////////////////

参数:待显示的数据

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void led_display(unsigned int dat )

{

unsigned int dat1=dat000; //四位数码管只能显示到一千,此处用于防止溢出

P0=table[dat1/1000]|position[0];

delay_ms(2);

P0=table[(dat100)/100]|position[1];

delay_ms(2);

P0=table[dat10/10]|position[2];

delay_ms(2);

P0=table[(dat1)]|position[3];

delay_ms(2);

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

按键扫描函数

若有按键按下:返回 键值(1-16);

若没按键按下:返回 255

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

unsigned char getch ( )

{

unsigned char X=0,

Y=0,

Z=0,

k=255;

P2=0xff;

P2=0x0f; //先对P2置数 行扫描

if(P2!=0x0f) //判断是否有键按下

{

//延时,软件去干扰

if(P2!=0x0f) //确认按键按下X = P2;

{

X=P2; //保存行扫描时有键按下时状态

P2=0xf0; //列扫描

Y=P2; //保存列扫描时有键按下时状态

Z=X|Y; //取出键值

switch ( Z ) //判断键值(那一个键按下)

{

case 0xee: k=0; break; //对键值赋值

case 0xde: k=1; break;

case 0xbe: k=2; break;

case 0x7e: k=3; break;

case 0xed: k=4; break;

case 0xdd: k=6; break;

case 0xbd: k=7; break;

case 0x7d: k=8; break;

case 0xeb: k=9; break;

case 0xdb: k=7; break;

case 0xbb: k=10;break;

case 0x7b: k=11;break;

case 0xe7: k=12;break;

case 0xd7: k=13;break;

case 0xb7: k=14;break;

case 0x77: k=15;break;

}

while(P2!=0xf0);

}

}

return k;

}

void main()

{

unsigned char temp=0,key=255;

while(1)

{

key=getch(); //扫描

if(key!=255)temp=key; //有按键按下

led_display(temp); //显示按键值

}

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top