基于小蜜蜂蓝桥杯单片机矩阵键盘的基本应用

本文详细描述了如何在CT107D单片机上使用I/O模式编写代码,实现一个4x4矩阵键盘的扫描功能,包括初始化、按键检测和数码管显示。重点讲解了矩阵键盘的工作原理和编程思路。
摘要由CSDN通过智能技术生成

2.7 【基础 07】矩阵键盘的基本操作 新建工程,以 I/O 模式编写代码,在 CT107D 单片机综合训练平台上,实现以下功能:

1、将 CT107D 上 J5 处跳帽接到 1~2 引脚,使 S4 到 S19 成为 4X4 的矩阵键盘。

2、系统上电后,关闭蜂鸣器,关闭继电器,关闭 8 个 LED 灯。

3、循环扫描矩阵键盘状态,发现有按键按下,等待其松开后,在数码管的最左边 1 位 显示相应的数字。从左至右,从上到下,依次显示“0”到“F”。即按下 S7,显示“0”, 按下 S11 显示“1”,按下 S15 显示“2”,按下 S6 显示“4”...依次类推。

【训练要点】: 矩阵键盘的扫描原理与程序设计思路,矩阵键盘的键码识别与基本处理。 【参考资源】: B 站视频教程【基础技能 07】矩阵键盘的扫描原理与基本应用 【考点提醒】: 第 11 届和第 12 届的省赛出现了矩阵键盘的考点,但不是考查 4X4 的矩阵 键盘,而是 2X2 的矩阵键盘。不要背代码,要理解工作原理和本质含义。

限于个人水平,难于做到尽善尽美,且本专栏主要起练习笔记作用。如有前辈发现代码错误或可以优化的地方,还请不吝赐教,学生感激不尽。

#include<STC15F2K60S2.h>

unsigned char  code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};


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

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

 

void SelectHC573Init(unsigned char num1,num2)
{
	P2 = (P2&0x1f)|0x00;
	P0 = num2;
	switch(num1)
	{
		case 0:	P2 = (P2&0x1f)|0x00;	break;//³õʼ»¯
		case 4:	P2 = (P2&0x1f)|0x80;	break;//LED
		case 5:	P2 = (P2&0x1f)|0xA0;	break;//·äÃùÆ÷¡¢¼ÌµçÆ÷
		case 6:	P2 = (P2&0x1f)|0xC0;	break;//λѡ
		case 7:	P2 = (P2&0x1f)|0xE0;	break;//¶ÎÑ¡
	}	
	P2 = (P2&0x1f)|0x00;
}

void Delay(unsigned int t)
{
	while(t--);
}


void DlsplaySMG(unsigned char dat)
{
	SelectHC573Init(6,0x01);
	SelectHC573Init(7,SMG_duanma[dat]);
}


unsigned char keyflag=0;
void ScanKeys()
{
	R1=0;
	R2=R3=R4=1;
	if(C1==0)
	{
		Delay(500);
		if(C1==0)
		{
			keyflag=0;
			DlsplaySMG(keyflag);
			while(C1==0);
		}
	}
	if(C2==0)
	{
		Delay(500);
		if(C2==0)
		{
			keyflag=1;
			DlsplaySMG(keyflag);
			while(C2==0);
		}
	}
	if(C3==0)
	{
		Delay(500);
		if(C3==0)
		{
			keyflag=2;
			DlsplaySMG(keyflag);
			while(C3==0);
		}
	}
	if(C4==0)
	{
		Delay(500);
		if(C4==0)
		{
			keyflag=3;
			DlsplaySMG(keyflag);
			while(C4==0);
		}
	}
	
	R2=0;
	R1=R3=R4=1;
	if(C1==0)
	{
		Delay(500);
		if(C1==0)
		{
			keyflag=4;
			DlsplaySMG(keyflag);
			while(C1==0);
		}
	}
	if(C2==0)
	{
		Delay(500);
		if(C2==0)
		{
			keyflag=5;
			DlsplaySMG(keyflag);
			while(C2==0);
		}
	}
	if(C3==0)
	{
		Delay(500);
		if(C3==0)
		{
			keyflag=6;
			DlsplaySMG(keyflag);
			while(C3==0);
		}
	}
	if(C4==0)
	{
		Delay(500);
		if(C4==0)
		{
			keyflag=7;
			DlsplaySMG(keyflag);
			while(C4==0);
		}
	}
	
	R3=0;
	R2=R1=R4=1;
	if(C1==0)
	{
		Delay(500);
		if(C1==0)
		{
			keyflag=8;
			DlsplaySMG(keyflag);
			while(C1==0);
		}
	}
	if(C2==0)
	{
		Delay(500);
		if(C2==0)
		{
			keyflag=9;
			DlsplaySMG(keyflag);
			while(C2==0);
		}
	}
	if(C3==0)
	{
		Delay(500);
		if(C3==0)
		{
			keyflag=10;
			DlsplaySMG(keyflag);
			while(C3==0);
		}
	}
	if(C4==0)
	{
		Delay(500);
		if(C4==0)
		{
			keyflag=11;
			DlsplaySMG(keyflag);
			while(C4==0);
		}
	}
	
	R4=0;
	R2=R3=R1=1;
	if(C1==0)
	{
		Delay(500);
		if(C1==0)
		{
			keyflag=12;
			DlsplaySMG(keyflag);
			while(C1==0);
		}
	}
	if(C2==0)
	{
		Delay(500);
		if(C2==0)
		{
			keyflag=13;
			DlsplaySMG(keyflag);
			while(C2==0);
		}
	}
	if(C3==0)
	{
		Delay(500);
		if(C3==0)
		{
			keyflag=14;
			DlsplaySMG(keyflag);
			while(C3==0);
		}
	}
	if(C4==0)
	{
		Delay(500);
		if(C4==0)
		{
			keyflag=15;
			DlsplaySMG(keyflag);
			while(C4==0);
		}
	}
}




void main()
{
	while(1)
	{
		ScanKeys();
	}
}

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值