矩阵按键的应用1.0(行列式扫描法)

使用某C51学习板,编写一个C51程序,实现如下功能:

1)启动时,数码管显示11, 代表第1行第1列

2)按下矩阵键盘中某键时,数码管显示按键对应的行号和列号,例如23代表2行3列

#include <reg51.h>
 
typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;
 
//定义矩阵按钮的端口
#define AnNiu P1
 
//定义数码管段码口
#define SMG	P0
 
//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
 
//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				          0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
 
u16 x=1;//定义一个变量存储按键的值
u16 num=1;//定义一个变量存储按键返回的值									
									
//延时
void delay_10us(u8 ten_us)
{
	while(ten_us--);	
}
 
 
//矩阵按键
u16 key_discern(void)
{	
	
	AnNiu=0xf7;//第一列为低电平
	if(AnNiu!=0xf7)
	{
		delay_10us(1000);
		switch(AnNiu)
		{
			case 0x77:x=1;break;
			case 0xb7:x=5;break;
			case 0xd7:x=9;break;
			case 0xe7:x=13;break;
 
		}	
	}	
	AnNiu=0xfb;//第二列为低电平
	if(AnNiu!=0xfb)
	{
		delay_10us(1000);
		switch(AnNiu)
		{
			case 0x7b:x=2;break;
			case 0xbb:x=6;break;
			case 0xdb:x=10;break;
			case 0xeb:x=14;break;
 
		}	
	}		
	AnNiu=0xfd;//第三列为低电平
	if(AnNiu!=0xfd)
	{
		delay_10us(1000);
		switch(AnNiu)
		{
			case 0x7d:x=3;break;
			case 0xbd:x=7;break;
			case 0xdd:x=11;break;
			case 0xed:x=15;break;
 
		}	
	}	
	AnNiu=0xfe;//第四列为低电平
	if(AnNiu!=0xfe)
	{
		delay_10us(1000);
		switch(AnNiu)
		{
			case 0x7e:x=4;break;
			case 0xbe:x=8;break;
			case 0xde:x=12;break;
			case 0xee:x=16;break;
 
		}	
	}		
	return x;
}	
 
//显示数码管									
void smg_display(void)
{	
	//行的数码管
	LSC=1;LSB=1;LSA=1;//译码器显示第8个数码管
	SMG=gsmg_code[(num-1)/4+1];//传送段选数据
	delay_10us(100);//延时一段时间,等待显示稳定
	SMG=0x00;//消隐
	
	//列的数码管
	LSC=1;LSB=1;LSA=0;//译码器显示第7个数码管
	SMG=gsmg_code[(num-1)%4+1];//传送段选数据
	delay_10us(100);//延时一段时间,等待显示稳定
	SMG=0x00;//消隐
}
 
 
void main()
{	
	while(1)
	{		
		num=key_discern();
		smg_display();		
	}		
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个矩阵扫描行列扫描的代码示例: 引用\[1\]中的代码是一个行列式扫描程序的示例。该程序定义了一个扫描函数`key_scan()`,用于检测按键的值。程序通过设置不同的行和列的电平状态来扫描按键,并返回按键的值。 引用\[2\]中的代码是一个头文件`KEY.H`的示例。该头文件定义了一些宏,用于检测行和列的电平状态。同时,该头文件声明了一个函数`KEY_SCAN()`,用于扫描按键。 综合以上两个引用的代码,可以实现一个矩阵扫描行列扫描的功能。具体实现的主函数部分没有提供,可以根据实际需求进行编写。 请注意,以上代码只是一个示例,具体的实现可能会根据硬件平台和编程语言的不同而有所差异。 #### 引用[.reference_title] - *1* [矩阵按键行列式扫描](https://blog.csdn.net/tcx_123321/article/details/126225667)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32矩阵键盘——行列扫描编码模式](https://blog.csdn.net/lgyLGY35/article/details/119066325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值