单片机用33矩阵键盘显示数字0~9
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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; //返回检测结果,
}