目的:通过数码管显示矩阵按键 S1-S16 按下后键值 0-F。
编译软件:keil5
过程:
(1)定义各端口
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
#define KEY_MATRIX_PORT P1 //使用宏定义矩阵按键控制口
#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口
//共阴极数码管显示 0~F 的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}
(2)延时函数定义
函 数 名 : delay_10us
函数功能 : 延时函数,ten_us=1 时,大约延时 10us
输 入 : ten_us
输 出 : 无
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
(3)key_matrix_ranks_scan函数
函 数 名 : key_matrix_ranks_scan
函数功能 : 使用行列式扫描方法,检测矩阵按键是否按下,按下则返回对应键值
输 入 : 无
输 出 : key_value:1-16,对应 S1-S16 键,0:按键未按下
u8 key_matrix_ranks_scan(void)
{
u8 key_value=0;
KEY_MATRIX_PORT=0xf7;//给第一列赋值 0,其余全为 1
if(KEY_MATRIX_PORT!=0xf7)//判断第一列按键是否按下
{
delay_10us(1000);//消抖
switch(KEY_MATRIX_PORT)//保存第一列按键按下后的键值
{
case 0x77: k