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];//静态数码管显示对应的码值
	 }
  }
}
相关推荐
派阿喵搞电子10 分钟前
STM32的APB1和APB2的区别
stm32·单片机·嵌入式硬件
Archie_IT2 小时前
江协科技/江科大-51单片机入门教程——P[5-1] 模块化编程 & P[5-2] LCD1602调试工具
单片机·嵌入式硬件·mcu·51单片机
电气_空空4 小时前
基于单片机及传感器的机器人设计与实现
单片机·嵌入式硬件·机器人·毕业设计·毕设
木燚垚5 小时前
基于STM32物联网水质监测系统的设计与实现/基于STM32的水产养殖云监控系统设计
stm32·单片机·嵌入式硬件·物联网·智能家居
QQ12971579407 小时前
51单片机 矩阵
单片机·嵌入式硬件·深度学习·算法·硬件工程·集成学习
Moonnnn.7 小时前
51单片机——汇编工程建立、仿真、调试全过程
汇编·笔记·嵌入式硬件·学习·51单片机
森焱森8 小时前
AArch64架构及其编译器
linux·c语言·单片机·架构
想要成为糕手。8 小时前
stm32-RTC时实时钟
stm32·嵌入式硬件·实时音视频
Czzzzlq10 小时前
STM32基础教程——对射式红外传感器计数实验
c语言·stm32·单片机·嵌入式硬件·mcu
集大周杰伦10 小时前
ARM Cortex-M 内存映射详解:如何基于寄存器直接读写 寄存器映射方式编码程序 直接操作硬件寄存器来控制 MCU
arm开发·stm32·单片机·内存映射·arm cortex-m·地址映射·寄存器编码