首页 > 其他分享 >蓝桥杯单片机学习(Day13 矩阵键盘 )

蓝桥杯单片机学习(Day13 矩阵键盘 )

时间:2024-07-21 15:30:26浏览次数:10  
标签:P3 value else 蓝桥 单片机 flag key Day13 sbit

现象:

            按键S7、S11、S15、S19数码管显示00-03
            按键S6、S10、S14、S18数码管显示04-07
            按键S5、S9、S13、S17数码管显示08-11
            按键S4、S8、S12、S16数码管显示12-15

矩阵键盘介绍:

        注意:J5接KBD矩阵键盘

        矩阵键盘就是4×4,一共16个按键。其工作原理是:一个按键周围有四个引脚,其中两个短接了有着上电时的电平,这时另外两个也有着相同的电平,但是由于键帽没有按下故而没有连通,检测原理是键帽按下时该两个引脚连通电平与两外两个引脚相同,检测按下。

        按键检测原理 :

 如图,因为每一时刻只能检测到一个按键,且每个引脚检测着四个键帽的按下与否,所以我们可以列坐标穷举。

        按键检测:

//行定义
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
//列定义
sbit C1=P4^4;
sbit C2=P4^2;
sbit C3=P3^5;
sbit C4=P3^4;

void key_board()
{
    //第一行
    R1=0;
    R2=R3=R4=1;
    C1=C2=C3=C4=1;
    if(C1==0) //(1,1)
    {
        while(C1==0)  //等待按键松开
        key_value=0;
    }
    else if(C2==0)  //(1,2)
    {
        while(C2==0);
        key_value=1;
    }
    else if(C3==0)  //(1,3)
    {
        while(C3==0);
        key_value=2;
    }

    else if(C4==0)  //(1,4)
    {
        while(C4==0);
        key_value=3;
    }

    //第二行......依此类推

        完整代码:

#include <STC15F2K60S2.H>

//行定义
sbit r1=P3^0;
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
//列定义
sbit c1=P4^4;
sbit c2=P4^2;
sbit c3=P3^5;
sbit c4=P3^4;


code unsigned char tab[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xFF};
unsigned char buf[8] = {10, 10, 10, 10, 10, 10, 10, 10}; //段选
unsigned char key_value=0xff;  //键值
bit flag;
void key_board();
void display();
//关闭蜂鸣器
void cls_buzz()
{
	P2=(P2&0x1f)|0xa0;
	P0=0x00;
	P2&=0x1f;
}
//关闭led
void cls_led()
{
	P2=(P2&0x1f)|0x80;
	P0=0xff;
	P2&=0x1f;
}
//定时器初始化+开启中断
void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
}

//主函数
void main()
{
	Timer0Init();
	cls_buzz();
	cls_led();
	while(1)
	{
		if(flag)
		{
			flag=0;
			key_board();
			if(key_value!=0xff)
			{
				buf[6]=key_value/10;
				buf[7]=key_value%10;
			}
		}
	}
}

//中断服务函数
void Timer0_Proc() interrupt 1
{
	static unsigned char ms;
	if(++ms==10)
	{
		flag=1;
		ms=0;
	}
	display();
}

//另外一种方法
//矩阵键盘
//void key_board()
//{
//	static unsigned char hang;
//	static unsigned char key_flag=0;
//	switch(key_flag)
//	{
//		case 0:
//		{
//			
//			P3=0x0f;
//			P42=0;
//			P44=0;
//			 //初始状态
//			if(P3!=0x0f)  //有按键按下
//				key_flag=1;
//		}
//		break;
//		case 1:  //1 进入行处理
//		{
//			P3=0x0f;
//			P42=0;
//			P44=0;
//			if(P3!=0x0f)  //有按键按下
//			{
//				if(P30==0){hang=1;}
//				else if(P31==0){hang=2;}
//				else if(P32==0){hang=3;}
//				else if(P33==0){hang=4;}  //检测在哪行按下
//				switch(hang)  //进入列处理
//				{
//					case 1:
//					{
//						P3=0xf0;  //P34属于高四位了 所以是P3=0xf0;
//						P42=1;  //进入列处理赋值1
//						P44=1;
//						if(P44==0){key_value=0;key_flag=2;}
//						else if(P42==0){key_value=1;key_flag=2;}
//						else if(P35==0){key_value=2;key_flag=2;}
//						else if(P34==0){key_value=3;key_flag=2;}
//					}
//					break;
//						case 2:
//					{
//						P3=0xf0;
//						P42=1;
//						P44=1;
//						if(P44==0){key_value=4;key_flag=2;}
//						else if(P42==0){key_value=5;key_flag=2;}
//						else if(P35==0){key_value=6;key_flag=2;}
//						else if(P34==0){key_value=7;key_flag=2;}
//					}
//					break;
//						case 3:
//					{
//						P3=0xf0;
//						P42=1;
//						P44=1;
//						if(P44==0){key_value=8;key_flag=2;}
//						else if(P42==0){key_value=9;key_flag=2;}
//						else if(P35==0){key_value=10;key_flag=2;}
//						else if(P34==0){key_value=11;key_flag=2;}
//					}
//					break;
//						case 4:
//					{
//						P3=0xf0;
//						P42=1;
//						P44=1;
//						if(P44==0){key_value=12;key_flag=2;}
//						else if(P42==0){key_value=13;key_flag=2;}
//						else if(P35==0){key_value=14;key_flag=2;}
//						else if(P34==0){key_value=15;key_flag=2;}
//					}
//					break;
//				}
//			} 
//		}
//		break;
//		case 2:
//		{
//			P3=0x0f;
//			P42=0;
//			P44=0;
//			if(P3==0x0f)  //松开按键
//				key_flag=0;
//		}
//		break;
//	}
//	
//}

//数码管显示
void display(void)
{
    static unsigned char com = 0;
    P0 = 0xff;
    P2 = ((P2 & 0x1f) | 0xE0);
    P2 &= 0x1f;

    P0 = 1 << com;
    P2 = ((P2 & 0x1f) | 0xC0);
    P2 &= 0x1f;

    P0 = tab[buf[com]];
    P2 = ((P2 & 0x1f) | 0xE0);
    P2 &= 0x1f;

    if(++com == 8)
    {
        com = 0;
    }
}
//矩阵键盘
void key_board()
{
	//第一行
	r1=0;
	r2=r3=r4=1;
	c1=c2=c3=c4=1;
	if(c1==0)
	{
		while(c1==0);//等待松开
		key_value=0;  //s7
	}
	else if(c2==0)
	{
		while(c2==0);
		key_value=1;
	}
	else if(c3==0)
	{
		while(c3==0);
		key_value=2;
	}
	else if(c4==0)
	{
		while(c4==0);
		key_value=3;
	}
	
		//第二行
	r2=0;
	r1=r3=r4=1;
	c1=c2=c3=c4=1;
	if(c1==0)
	{
		while(c1==0);//等待松开
		key_value=4;  //s7
	}
	else if(c2==0)
	{
		while(c2==0);
		key_value=5;
	}
	else if(c3==0)
	{
		while(c3==0);
		key_value=6;
	}
	else if(c4==0)
	{
		while(c4==0);
		key_value=7;
	}
	
		//第三行
	r3=0;
	r2=r1=r4=1;
	c1=c2=c3=c4=1;
	if(c1==0)
	{
		while(c1==0);//等待松开
		key_value=8;  //s7
	}
	else if(c2==0)
	{
		while(c2==0);
		key_value=9;
	}
	else if(c3==0)
	{
		while(c3==0);
		key_value=10;
	}
	else if(c4==0)
	{
		while(c4==0);
		key_value=11;
	}
	
		//第四行
	r4=0;
	r2=r3=r1=1;
	c1=c2=c3=c4=1;
	if(c1==0)
	{
		while(c1==0);//等待松开
		key_value=12;  //s7
	}
	else if(c2==0)
	{
		while(c2==0);
		key_value=13;
	}
	else if(c3==0)
	{
		while(c3==0);
		key_value=14;
	}
	else if(c4==0)
	{
		while(c4==0);
		key_value=15;
	}
}

         

 

         

标签:P3,value,else,蓝桥,单片机,flag,key,Day13,sbit
From: https://blog.csdn.net/2302_80724534/article/details/140554239

相关文章

  • 1029、基于单片机的闹钟(存储)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能单片机期末考试任务书设计一个程序,实现以下功能:具有4个以上按键,具有确定键,返回键,上移键,下移键,可以通过按键设定时间的时钟,分钟设......
  • 1028、基于单片机的流水灯(5个按键)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能花样流水灯1、扩展32个LED灯,低电平驱动2、使用5个按键切换5种花样二、proteus仿真三、原理图四、程序源码五、......
  • 嵌入式单片机STM32中堆栈使用方法
       学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。    对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区:栈区(stack......
  • 蓝桥杯 算法季度赛2
    T2第一发没判最后一组后没有间隔T3WA了两发,调不出来往后看T5是线段树板子,1A了T4贺了个zfunction板子,WA了两发,调不出来剩下的题都没来得及看丑陋sol3.兽之泪II讨论选不选\(x_n\)比较好些如果讨论的是\(y_n\),在选\(y_i\)的情况下可能会选一些\(>y_i\)......
  • 【I²C协议】STC89C51单片机IIC通信(代码+原理)
    STC89C51单片机IIC通信什么是I²C协议特点构成通信协议开始信号、结束信号、应答信号数据传输代码示例什么是I²C协议IIC,即I²C,全称Inter-IntegratedCircuit,字面上的意思是集成电路之间,它其实是I²CBus简称,所以中文应该叫集成电路总线,是由PHILIPS公司在80年......
  • 基于单片机的远程烟雾报警系统的硬件电路设计
    摘要:目前,智能家居已成为信息化时代的产物遍布全国各地,其中适用于家用的烟雾报警系统已成为家庭设备中安全管理的基础。本文设计了一款基于单片机对家用燃气进行实时监测的系统,该系统可通过短信的形式通知家庭主人当前的烟雾浓度。本设计主要完成了硬件电路设计,其中包括基于A......
  • 基于单片机的温控光控智能窗帘设计探讨
    摘要:文章使用的核心原件是AT89C52单片机,以此为基础进行模块化的设计,在整个设计中通过加入光检测模块和温度检测模块,从而对室内的温度和光照强度进行检测,然后将检测得到的数据传输给单片机,单片机对电机的继电圈的通断进行控制,从而通过电机的正转和反转,从而实现对窗帘开合......
  • 蓝桥杯Python算法竞赛常用的函数库
    博客主页:音符犹如代码系列专栏:Python关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......
  • 【51单片机】1-2创建keil代码工程
    1.双击打开keil软件,点击Project->newuVisionproject2.在适当位置新建项目工程文件夹Template,双击进入该文件夹,并输入下方文件名保存。3.选择AT89C51或AT89C52均可后,点击是4.新建文本文件,保存为.c文件,主要保存.c文件的文件名与工程名相同5.右键添加文件或者双击......
  • 蓝桥杯省赛 垂直柱状图(字符串+模拟)
    描述写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过 100 个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。输入描述四行字符,由大写字母组成,每行不超过 100 个字符。输出描述由若干行组成,前几行由空......