实验板采用4*4矩阵键盘,行信号分别为P1.0-P1.3,列信号分别为P1.4-P1.7
4*4矩阵键盘,LED显示所按的键
C语言源程序:
#include<reg52.h>//52单片机头文件包含
#define uint unsigned int //定义宏uint 为 unsigned int
#define uchar unsigned char //定义宏 uchar 为 unsigned char
sbit wei1=P2^0; //定义数码管第一位
uchar code table[]={0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8E};//共阳数码管码表
void delay(uint z);//延时函数声明
uchar keyscan();//键盘扫描程序声明
void desplay(uchar a);//数码管显示函数声明
void main()//主函数
{
wei1=0;//置0打开数码管显示
P0=table[0];//显示数字0
while(1)//主循环开始
{
display(keyscan());//显示从键盘输入的数字
}
}
void display(uchar a) //显示子程序
{
P0=table[a]; //将码表值赋值给P0
}
uchar keyscan() //键盘输入子程序
{
uchar num,temp; //定义无符号变量num,temp
P1=0xfe;//11111110 将0xfe赋值给P1扫描第一行
temp=P1;//P1赋值给temp
temp=temp & 0xf0;//将temp的值与0xf0进行与运算
while(temp!=0xf0)//判断第一行是否有键按下
{
delay(5);//延时5ms
temp=P1;//将P1赋值给temp
temp=temp & 0xf0;//将temp的值与0xf0进行与运算
while(temp!=0xf0)//再次确认是否有键按下
{
temp=P1;//将P1赋值给temp
switch(temp)//根据temp值确认选择的按键
{
case 0xee:num=0;//等于0xee(11101110) 第一行第一列则为0号按键
break;//跳出switch语句
case 0xde:num=1;//等于0xde(11011110) 第一行第二列则为1号按键
break;//跳出switch语句
case 0xbe:num=2;//等于0xde(10111110) 第一行第三列则为2号按键
break;//跳出switch语句
case 0x7e;num=3;//等于0xde(01111110) 第一行第四列则为3号按键
break;//跳出switch语句
}
while(temp!=0xf0) //循环直到按键松开
{
temp=P1;//将P1赋值给temp
temp=temp & 0xf0;//将temp进行与运算
}
}
}
P1=0xfd;//11111101 将0xfd赋值给P1扫描第二行
temp=P1;//P1赋值给temp
temp=temp & 0xf0;//将temp的值与0xf0进行与运算
while(temp!=0xf0)//判断是否有键按下
{
delay(5);//延时5ms
temp=P1;//将P1赋值给temp
temp=temp & 0xf0;//将temp与0xf0进行与运算
while(temp!=0xf0)//再次确认是否有键按下
{
temp=P1;//将P1赋值给temp
switch(temp)//根据temp的值进行选择
{
case 0xed:num=4;//等于0xed(11101101) 第二行第一列则为4号按键
break;//跳出switch语句
case 0xdd:num=5;//等于0xdd(11011101) 第二行第二列则为5号按键
break;//跳出switch语句
case 0xbd:num=6;//等于0xdd(10111101) 第二行第三列则为6号按键
break;//跳出switch语句
case 0x7d;num=7;//等于0xdd(01111101) 第二行第四列则为7号按键
break;//跳出switch语句
}
while(temp!=0xf0)//判断按键是否松开
{
temp=P1;//将P1赋值给temp
temp=temp & 0xf0;//将temp与0xf0进行与运算
}
}
}
P1=0xfb;//11111011 将0xfb赋值给P1扫描第三行
temp=P1;//P1赋值给temp
temp=temp & 0xf0;//将temp的值与0xf0进行与运算
while(temp!=0xf0)//判断是否有键按下
{
delay(5);//延时5ms
temp=P1;//将P1赋值给temp
temp=temp & 0xf0;//将temp值与0xf0进行与运算
while(temp!=0xf0)//判断是否有键按下
{
temp=P1;//将P1赋值给temp
switch(temp)//根据temp的值进行选择
{
case 0xeb:num=8;//等于0xed(11101011) 第三行第一列则为8号按键
break;//跳出switch语句
case 0xdb:num=9;//等于0xed(11011011) 第三行第二列则为9号按键
break;//跳出switch语句
case 0xbb:num=10;//等于0xed(10111011) 第三行第三列则为10号按键
break;//跳出switch语句
case 0x7b;num=11;//等于0xed(01111011) 第三行第四列则为11号按键
break;//跳出switch语句
}
while(temp!=0xf0)//判断按键是否松开
{
temp=P1;//将P1赋值给temp
temp=temp & 0xf0;//将temp与0xf0进行与运算
}
}
}
P1=0xfd;//11110111 将0xf7赋值给P1扫描第二行
temp=P1;//P1赋值给temp
temp=temp & 0xf0;//将temp的值与0xf0进行与运算
while(temp!=0xf0)//判断是否有键按下
{
delay(5);//延时5ms
temp=P1;//将P1赋值给temp
temp=temp & 0xf0;//将temp与0xf0进行与运算
while(temp!=0xf0)//再次判断是否有键按下
{
temp=P1;//将P1赋值给temp
switch(temp)//根据temp的值进行选择
{
case 0xe7:num=12;//等于0xe7(11100111) 第四行第一列则为12号按键
break;//跳出switch语句
case 0xd7:num=13;//等于0xd7(11010111) 第四行第二列则为13号按键
break;//跳出switch语句
case 0xb7:num=14;//等于0xb7(10110111) 第四行第三列则为14号按键
break;//跳出switch语句
case 0x77;num=15;//等于0x77(01110111) 第四行第四列则为15号按键
break;//跳出switch语句
}
while(temp!=0xf0)//判断按键是否松开
{
temp=P1;//将P1赋值给temp
temp=temp & 0xf0;//将temp与0xf0进行与运算
}
}
}
return num; //返回结果
}
void delay(uint z) //延时函数 参数无符号整型z
{
uint x,y; //定义无符号整型变量x,y
for(x=z;x>0;x--) //主循环循环z次
for(y=110;y>0;y--);//子循环循环110次
}
//实验现象 按下矩阵键盘上的按键 数码管显示相应的数字
|