实验目标:按下按键,静态数码管显示对应的码值【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];//静态数码管显示对应的码值
}
}
}