【蓝桥杯02】——矩阵键盘

独立按键

**P3上电为高电平,只要检测P3口低四位哪一个为低电平,就可以检测哪一个独立按键被按下(使用独立按键需要将2,3脚接地,开发板上对应J5的BTN一端)
**

在这里插入图片描述

独立按键按下,数码管显示对应的数字

#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int

void delay_ms(int n);
void show(uint w,uint n);
uint key_scan();
sbit beer=P0^6;

uchar which[] = {
    
    0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar num[] = {
    
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void main()
{
    
    
  P2=0xA0;beer=0;P2 &= 0x1f;;//上电电位不稳,先关闭蜂鸣器
	while(1)
	{
    
    
		show(1,key_scan());  
  }	
}

//数码管显示函数   w为第几位亮,n为显示的数字
void show(uint w,uint n)  
{
    
    
		P2=(P2&0x1f)|0xc0;// 110 选择Y6C进行位选
    P0=which[w-1];
		P2=(P2&0x1f)|0xe0;// 111 选择Y7C进行段选
    P0=num[n];
		delay_ms(5);
		P0 = 0xFF; 
	  P2 &= 0x1f;
}

//检测独立按键按下,
uint key_scan()
{
    
    
	uint key_value = 0;
	if((P3&0x0F)!=0x0F)//当独立按键按下时,会使低三位有一个不是高电平
	{
    
    
		delay_ms(5); //延时消抖
		if((P3&0x0F)!=0x0F)
			{
    
    
			switch(P3&0x0F)
			{
    
    
				case 0x0e:key_value = 7;break;
				case 0x0d:key_value = 6;break;
				case 0x0b:key_value = 5;break;
				case 0x07:key_value = 4;break;
			}	
		 }	
	 }
	return key_value;
}
 
//延时函数
void delay_ms(int n)
{
    
    
	int i,j;
	for(i=n;i>0;i--)
		for(j=110;j>0;j--);
}

矩阵键盘

矩阵键盘的判断,可以先将一行置为0,然后扫描每一列,以此类推进行扫描,就可以确定按键位置。

#include <STC15F2K60S2.H>
//IAP单片机与51的区别  P36被替换成了P42,P37替换成了P44

void selectHC573(unsigned  choose);
void show(unsigned char num);
void keyscan();


unsigned char leddata[]={
    
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82, 0xF8, 0x80, 0x90,   //0-9
												0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, };                   //A-F   10-15
sbit beer=P0^6;

sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;

sbit C1=P3^4;
sbit C2=P3^5;
sbit C3=P4^2;  
sbit C4=P4^4;

void main()
{
    
    
	selectHC573(5);
	beer=0;
	P2&=0x1f;
	while(1)
	{
    
    
		keyscan();
  }
}

void selectHC573(unsigned  choose)
{
    
    
	switch(choose)
	{
    
    
		case 4:{
    
     P2=P2&0x1f|0x80; break; }  //Y4C——LED灯
	  case 5:{
    
     P2=P2&0x1f|0xA0; break; }	//Y5C——蜂鸣器 继电器  ULN2003芯片
	  case 6:{
    
     P2=P2&0x1f|0xC0; break; }	//Y6C——数码管位选
	  case 7:{
    
     P2=P2&0x1f|0xE0; break; }	//Y7C——数码管段选
  }
}

void show(unsigned char num)
{
    
    
	selectHC573(6);
	P0=0x01;
	selectHC573(7);
	P0=leddata[num];
}

int keynum; //存放键值
void keyscan()
{
    
    
	//先将第一行置0,再扫描每一列
	R1=0;
	R2=R3=R4=1;
	C1=C2=C3=C4=1;
	if(C4==0)
	{
    
    
		while(C4==0);
		keynum=0;
		show(keynum);
  }
	else if(C3==0)
	{
    
    
		while(C3==0);
		keynum=1;
		show(keynum);
  }
		else if(C2==0)
	{
    
    
		while(C2==0);
		keynum=2;
		show(keynum);
  }
		else if(C1==0)
	{
    
    
		while(C1==0);
		keynum=3;
		show(keynum);
  }
	
	//再将第二行置0,再扫描每一列
	R2=0;
	R1=R3=R4=1;
	C1=C2=C3=C4=1;
	if(C4==0)
	{
    
    
		while(C4==0);
		keynum=4;
		show(keynum);
  }
	else if(C3==0)
	{
    
    
		while(C3==0);
		keynum=5;
		show(keynum);
  }
		else if(C2==0)
	{
    
    
		while(C2==0);
		keynum=6;
		show(keynum);
  }
		else if(C1==0)
	{
    
    
		while(C1==0);
		keynum=7;
		show(keynum);
  }
	
	//然后将第三行置0,再扫描每一列
	R3=0;
	R1=R2=R4=1;
	C1=C2=C3=C4=1;
	if(C4==0)
	{
    
    
		while(C4==0);
		keynum=8;
		show(keynum);
  }
	else if(C3==0)
	{
    
    
		while(C3==0);
		keynum=9;
		show(keynum);
  }
		else if(C2==0)
	{
    
    
		while(C2==0);
		keynum=10;
		show(keynum);
  }
		else if(C1==0)
	{
    
    
		while(C1==0);
		keynum=11;
		show(keynum);
  }
	
	R4=0;
	R1=R2=R3=1;
	C1=C2=C3=C4=1;
	if(C4==0)
	{
    
    
		while(C4==0);
		keynum=12;
		show(keynum);
  }
	else if(C3==0)
	{
    
    
		while(C3==0);
		keynum=13;
		show(keynum);
  }
		else if(C2==0)
	{
    
    
		while(C2==0);
		keynum=14;
		show(keynum);
  }
		else if(C1==0)
	{
    
    
		while(C1==0);
		keynum=15;
		show(keynum);
  }
}

猜你喜欢

转载自blog.csdn.net/z3447643805/article/details/113664061