说明:为使博文看起来简单,以下程序中没有的函数都在前面已经出现过,如果需要,请自行查阅。
实验现象: 下载程序到实验板,按开发板的矩阵按键可以显示对应的数字,具体按键排列是:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
注意: 跳线帽一定要接KBD(靠左侧的地方)
程序:
matrix_key.h
#ifndef matrix_key
#define matrix_key
sfr P4 = 0xC0; //头文件中没有P4寄存器的定义
sbit P42 = P4^2;
sbit P44 = P4^4;
extern uchar xdata Key_Read_Value;
void Matrix_Key_Scan(); // 矩阵按键扫描
#endif
matrix_key.c
#include"All.h"
uchar xdata Key_Read_Value=0;
void Matrix_Key_Scan()
{
P3 = 0x0f; P42 = 0; P44 = 0; // 0000 1111 拉低列,先使行使能
if(P3 != 0x0f) // 有按键按下
{
Delay_ms(5); // 消抖
if(P3 != 0x0f) // 确定按键按下
{
switch(P3) // 判断是哪一行的按键按下
{
case 0x07: Key_Read_Value = 12; break; // 0000 0111 // 最后一行按下
case 0x0B:Key_Read_Value = 8; break; // 0000 1011
case 0x0D:Key_Read_Value = 4;break; // 0000 1101
case 0x0E: Key_Read_Value = 0;break; // 0000 1110 // 第一行按下
}
P3 = 0xf0; P42 = 1; P44 =1; // 拉低行 判断列
if(P44 == 0) Key_Read_Value += 0; while(P44 == 0); // 第一列按下
if(P42 == 0) Key_Read_Value += 1; while(P42 == 0); // 第二列按下
if(P3 == 0xD0) Key_Read_Value += 2;while(P3 == 0xD0); // 1101 0000
if(P3 == 0XE0) Key_Read_Value += 3; while(P3 == 0XE0); // 第四列按下
}
}
}
main.c
#include "All.h"
/* 按下按键的时候,第一行 0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
*/
/* 主函数 */
void main()
{
/* 屏蔽蜂鸣器*/
HC138_Enable_CS(5);
P0 = 0x00; // 全是0 ,经过反相器
while(1)
{
disbuffer[0] = Key_Read_Value / 10; // 显示10位
disbuffer[1] = Key_Read_Value % 10; // 显示个位
SMG_Circle_Display(); // 数码管动态显示
Matrix_Key_Scan(); // 矩阵按键扫描
}
}
效果: