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

发布于:2025-02-10 ⋅ 阅读:(103) ⋅ 点赞:(0)

实验目标:按下按键,静态数码管显示对应的码值【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行为低电平,

#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];//静态数码管显示对应的码值
	 }
  }
}


网站公告

今日签到

点亮在社区的每一天
去签到