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];//静态数码管显示对应的码值
	 }
  }
}
相关推荐
腾飞的信仰3 小时前
51单片机同一个timer 作为定时器和波特率发生器么?
网络·单片机·51单片机
思考的味道6 小时前
系统的从零开始学习电子的相关知识,该如何规划?
嵌入式硬件
猿饵块8 小时前
STM32--PWM--函数
stm32·单片机·嵌入式硬件
学习噢学个屁9 小时前
基于51单片机步进电机控制—9个等级
c语言·单片机·嵌入式硬件·51单片机
GXSC10 小时前
国芯思辰| 医疗AED可使用2通道24位模拟前端SC2946(ADS1292)
嵌入式硬件
LaoZhangGong12310 小时前
分析rand()和srand()函数的功能
c语言·经验分享·stm32·单片机
国科安芯11 小时前
自研MCU芯片闪存驱动的实现:OpenOCD详细过程记录与操作指南
单片机·嵌入式硬件·架构
Sandman6z13 小时前
STM32CubeMX安装及使用分享
stm32·嵌入式硬件
Nice__J14 小时前
智芯Z20K144x MCU开发之时钟架构
单片机·嵌入式硬件·架构
DIY机器人工房16 小时前
[6-1] TIM定时中断 江协科技学习笔记(45个知识点)
笔记·科技·stm32·单片机·学习