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];//静态数码管显示对应的码值
	 }
  }
}
相关推荐
FreakStudio8 小时前
一文速通 Python 并行计算:07 Python 多线程编程-线程池的使用和多线程的性能评估
python·单片机·嵌入式·多线程·面向对象·并行计算·电子diy
SlientICE11 小时前
TCP是什么?不需要!使用ESP32网络层直接通信!
网络·单片机·网络协议·tcp/ip
BW.SU14 小时前
单片机 + 图像处理芯片 + TFT彩屏 触摸开关控件 v1.2
单片机·人机交互·ra8889·开关控件·触摸屏设计
双叶83614 小时前
(51单片机)点阵屏LED显示图片(点阵屏LED教程)(74Hc595教程)
c语言·开发语言·单片机·嵌入式硬件·51单片机
深圳市青牛科技实业有限公司14 小时前
D3502C:一款高性能降压转换器的技术解析,可替代U3502C采用ESOP8封装
单片机·嵌入式硬件·快充·扫地机器人吸尘·筋膜枪电机·驱动轮电机
顾念`14 小时前
履带小车+六轴机械臂(2)
单片机·嵌入式硬件
努力创造奇迹15 小时前
STM32 HAL库 ADC+TIM+DMA 3路 1S采样一次电压
stm32·单片机·嵌入式硬件
leoFY12315 小时前
STM32 BOOT设置,bootloader,死锁使用方法
stm32·单片机·嵌入式硬件
czhaii16 小时前
单片机任意普通IO引脚使用定时器扩展外部中断的巧妙方法
单片机·嵌入式硬件
二块烧肉18 小时前
STM32 认识STM32
stm32·单片机·嵌入式硬件