【蓝桥杯】单片机,矩阵键盘控制数码管

矩阵键盘控制数码管

//四列按键每按下一个分别显示一个数

#include

#define uchar unsigned char
#define uint unsigned int

uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X90,0XBF,0XFF};//定义按键数组0,1,2,3,4,5,6,7,8,9,-,灭
uchar num=0;

void delayms(int ms); //延时
void keyscan16(); //按键

void main()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //关闭蜂鸣器
P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF; //一个数码管亮

while(1)
{
	keyscan16();
	P0=tab[num];
}

}

//矩阵按键

void keyscan16()
{
uchar temp;

P44=0;P42=1;P3=0X7F;        //只第一列按键作用0111 1111
temp=P3;
temp=temp&0X0F;        //0111 1111 & 0000 1111= 0000 1111
if(temp!=0X0F)
{
	delayms(5);         //消抖
	temp=P3;
	temp=temp&0X0F;
	if(temp!=0X0F)
	{
		temp=P3;
	switch(temp)
	{
		case 0X7E: num=0;break;   //0111 1110  按下第一列第一个键数码管显示0
		case 0X7D: num=1;break;   //0111 1101  按下第一列第二个键数码管显示1
		case 0X7B: num=2;break;   //0111 1011   按下第一列第三个键数码管显示2
		case 0X77: num=3;break;   //0111 0111  按下第一列第四个键,数码管显示3
	}
	while(temp!=0X0F)          //退出循环,temp重新赋值
	{
		temp=P3;
		temp=temp&0X0F;
	}
}

}
P44=1;P42=0;P3=0XBF; //1011 1111 第二列按键作用
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0XBE: num=4;break;
case 0XBD: num=5;break;
case 0XBB: num=6;break;
case 0XB7: num=7;break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P3=0XDF;P44=1;P42=1; //1101 111 第三列按键作用
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XDE: num=8;break;
case 0XDD: num=9;break;
case 0XDB: num=10;break;
case 0XD7: num=11;break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P3=0XEF;P44=1;P42=1; //1110 111 第四列按键作用
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XEE: num=2;break;
case 0XED: num=4;break;
case 0XEB: num=6;break;
case 0XE7: num=8;break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
}
void delayms(int ms)
{
int i,j;
for(i=ms;i>0;i–)
for(j=845;j>0;j–);
}

你可能感兴趣的:(小白,蓝桥杯,单片机,矩阵键盘)