单片机用33矩阵键盘显示数字0~9

#include //文件包含
#define uint unsigned int
#define uchar unsigned char //宏定义,方便使用


uchar code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90}; //数码管显示编码
uchar num,temp,num1; //全局变量定义


/************************延时子函数***********************************/

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**************************主函数*************************************/

uchar keyscan(); //定义键扫描函数

void display(uchar aa); //定义显示函数


void main()
{
num=0;
P0 = 0xc0 ;

while(1)
{
display(keyscan()); //调用键盘扫描子函数
}
}


/*************************显示子函数**********************************/

void display(uchar aa)
{

P0=table[aa];

}

/************************键盘扫描子函数*******************************/

uchar keyscan()
{
P1=0xfe; //P1赋值,低位送0
temp=P1; //temp读回P1的值,
temp=temp&0xe0; //屏蔽 temp低5位,只看高3位列控是否发声变化
while(temp!=0xe0) //不等,说明第一行有键按下
{ //延时去抖
delay(5); //再检测
temp=P1;
temp=temp&0xe0;
while(temp!=0xe0) //果真有键按下,
{ //把P1给temp,检测按键位置
temp=P1;
switch(temp)
{
case 0xf6:num=1;
break;
case 0xee:num=2;
break;
case 0xde:num=3;
break;

}
while(temp!=0xe0) //一次按键检测,松手跳出循环
{
temp=P1;
temp=temp&0xe0;
}
}
}

P1=0xfd; //检测第二列
temp=P1;
temp=temp&0xe0;
while(temp!=0xe0)
{
delay(5);
temp=P1;
temp=temp&0xe0;
while(temp!=0xe0)
{
temp=P1;
switch(temp)
{
case 0xf5:num=4;
break;
case 0xed:num=5;
break;
case 0xdd:num=6;
break;

}
while(temp!=0xe0)
{
temp=P1;
temp=temp&0xe0;
}
}
}


P1=0xfb;
temp=P1; //检测第三列
temp=temp&0xe0;
while(temp!=0xe0)
{
delay(5);
temp=P1;
temp=temp&0xe0;
while(temp!=0xe0)
{
temp=P1;
switch(temp)
{
case 0xf3:num=7;
break;
case 0xeb:num=8;
break;
case 0xdb:num=9;
break;

}
while(temp!=0xe0)
{
temp=P1;
temp=temp&0xe0;
}
}
}

return num; //返回检测结果,

}

相关文档
最新文档