单片机2×2按键扫描程序

如题所述

如果使用P0口要加上拉电阻。
#define l1 P0_0
#define l2 P0_1
#define c1 P0_2
#define c2 P0_3
unsigned char getkey()
{
c1=1;
c2=1;
l1=0;
l2=1;
if(c1==0)
return 1;
if(c2==0)
return 2;
l1=1;
l2=0;
if(c1==0)
return 3;
if(c2==0)
return 4;
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-27
网络上搜一下4*4矩阵键盘,这个给你参考...
自己做点小小修改吧...

/*******************************************************************/
/* */
/* 单片机开发系统演示程序 - 矩阵键盘键值显示 */
/* */
/* 一位数码管显示 */
/* */
/*******************************************************************/

#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

uchar table[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, //0,1,2,3,4,5,6
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF};//7,8,9,A,B,C,D,E,F,-

sbit BEEP = P3^7; //蜂鸣器驱动线
uchar dis_buf; //显示缓存
uchar temp;
uchar key; //键顺序吗

void beep(); //蜂鸣器
void delay0(uchar x); //x*0.14MS
//--------------------------------------------------
/* 延时子程序*/

void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)

}
}
//--------------------------------------------------
/*键扫描子程序*/
void keyscan(void)
{
P1=0x0F; //低四位输入
delay(1);
temp=P1; //读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1)
key=0;
else if(temp==2)
key=1;
else if(temp==4)
key=2;
else if(temp==8)
key=3;
else
key=16;

P1=0xF0; //高四位输入
delay(1);
temp=P1; //读P1口
temp=temp&0xF0;
temp=~((temp>>4)|0xF0);
if(temp==1)
key=key+0;
else if(temp==2)
key=key+4;
else if(temp==4)
key=key+8;
else if(temp==8)
key=key+12;
else
key=16;

dis_buf=table[key]; //查表得键值
}
//--------------------------------------------------
/*判断键是否按下*/
void keydown(void)
{
P1=0xF0;
if(P1!=0xF0)
{
keyscan();
beep();
while(P1!=0xF0); //等待键释放
}
}
//--------------------------------------------------

void beep()
{
unsigned char i;
for (i=0;i<180;i++)
{
delay0(6);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(250); //延时
}
//--------------------------------------------------
void delay0(uchar x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
//--------------------------------------------------
main()
{
P0=0xFF; //置P0口
P2=0xFF; //置P2口
dis_buf=0xBF;

while(1)
{
keydown();
P0 = dis_buf; //键值送显示
delay(2);
P2 = 0x7F;
}
}
//--------------------------------------------------
追问

不好 还是谢谢 我已经会写了