51单片机开发:矩阵按键实验

实验目标:按下按键,静态数码管显示对应的码值【0123456789ABCDEF】。

矩阵按键原理图如下图所示:P14~P17控制行,P10~P13控制列,低电平表示按键按下。

|-----|-----|-----|-----|-----|-----|-----|-----|
| P17 | P16 | P15 | P14 | P13 | P12 | P11 | P10 |
| 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
| 0xf7,表示第1列输出低电平 ||||||||

|-----|-----|-----|-----|-----|-----|-----|-----|
| P17 | P16 | P15 | P14 | P13 | P12 | P11 | P10 |
| 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
| 0x77:表示按键S1被按下,第1行为低电平, ||||||||

cpp 复制代码
#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;

#define SMG_A_DP_PORT P0   //静态数码管端口
#define KEY_MATRIX_PORT P1 //按键端口

//数码管段码【0123456789ABCDEF】
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay_10us(u16 ten_us){
	while(ten_us--);
}

u8 key_matrix_ranks_scan(){
    KEY_MATRIX_PORT = 0xf7;   //第1列输出低电平
	if(KEY_MATRIX_PORT != 0xf7){ //有按键被按下
		delay_10us(100);  //过滤抖动
		if(KEY_MATRIX_PORT != 0xf7){
			switch(	KEY_MATRIX_PORT){
			case 0x77:return 1;break; //S1按键按下
			case 0xb7:return 5;break;
			case 0xd7:return 9;break;
			case 0xe7:return 13;break;	
			}
		}
	}
	while(KEY_MATRIX_PORT != 0xf7);//等待按键松开

	KEY_MATRIX_PORT = 0xfb;
	if(KEY_MATRIX_PORT != 0xfb){
		delay_10us(100);
		if(KEY_MATRIX_PORT != 0xf7){
			switch(	KEY_MATRIX_PORT){
			case 0x7b:return 2;break;
			case 0xbb:return 6;break;
			case 0xdb:return 10;break;
			case 0xeb:return 14;break;	
			}
		}
	}
	while(KEY_MATRIX_PORT != 0xfb);

	KEY_MATRIX_PORT = 0xfd;
	if(KEY_MATRIX_PORT != 0xfd){
		delay_10us(100);
		if(KEY_MATRIX_PORT != 0xfd){
			switch(	KEY_MATRIX_PORT){
			case 0x7d:return 3;break;
			case 0xbd:return 7;break;
			case 0xdd:return 11;break;
			case 0xed:return 15;break;	
			}
		}
	}
	while(KEY_MATRIX_PORT != 0xfd);

	KEY_MATRIX_PORT = 0xfe;
	if(KEY_MATRIX_PORT != 0xfe){
		delay_10us(100);
		if(KEY_MATRIX_PORT != 0xfe){
			switch(	KEY_MATRIX_PORT){
			case 0x7e:return 4;break;
			case 0xbe:return 8;break;
			case 0xde:return 12;break;
			case 0xee:return 16;break;	
			}
		}
	}
	while(KEY_MATRIX_PORT != 0xfe);


	return 0;
}



void main(){
  u8 key=0;
  while(1){
	 key = key_matrix_ranks_scan();//扫描矩阵按键
	 if(key>0){
	 	SMG_A_DP_PORT = gsmg_code[key-1];//静态数码管显示对应的码值
	 }
  }
}
相关推荐
LCG元8 分钟前
STM32 ADC 多通道 DMA 采样与数字滤波实战
stm32·嵌入式硬件·microsoft
VALENIAN瓦伦尼安教学设备22 分钟前
转子/行星/平行轴齿轮箱综合故障模拟实验台可复现常见机械问题
大数据·数据库·人工智能·嵌入式硬件·算法
国科安芯1 小时前
基于MOSFET工作电压、电流特性的选型设计
科技·stm32·单片机·嵌入式硬件·系统架构
wuyk5551 小时前
68.嵌入式 C 语言避坑指南:volatile 关键字 —— 单片机中断、寄存器访问的核心技巧
c语言·开发语言·stm32·单片机·嵌入式硬件
电子科技圈2 小时前
第二代无线平台历久弥新,赋能物联网创新迭代
人工智能·嵌入式硬件·mcu·物联网·设计模式·硬件架构·iot
Zevalin爱灰灰14 小时前
能源与电源管理电路——防倒灌电路
单片机·嵌入式硬件·电源管理
jianqiang.xue16 小时前
ESP-IDF保姆级入门02|Ubuntu24.04搭建EIM-GUI开发环境,打通Windows_Linux双平台统一开发
stm32·单片机·物联网
无垠的广袤17 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
嵌入式-老费18 小时前
esp32开发与应用(添加数据分区)
单片机·嵌入式硬件
嵌入式-老费18 小时前
esp32开发与应用(OTA升级)
嵌入式硬件