文档介绍:矩阵键盘
/***源程序默认硬件环境:52单片机,12MHz晶振,P1口 4×4矩阵键盘,详细布局如下***/
/* 默认矩阵布局,按键扫描方式1使用
P0 P1 P2 P3
│ │ │ │
矩阵键盘
/***源程序默认硬件环境:52单片机,12MHz晶振,P1口 4×4矩阵键盘,详细布局如下***/
/* 默认矩阵布局,按键扫描方式1使用
P0 P1 P2 P3
│ │ │ │
P4─┼──┼──┼──┤ S1 S2 S3 S4
│ │ │ │
P5─┼──┼──┼──┤ S5 S6 S7 S8
│ │ │ │
P6─┼──┼──┼──┤ S9 S10 S11 S12
│ │ │ │
P7─┴──┴──┴──┘ S13 S14 S15 S16
*/
#include"" //包含52头文件
#define TRUE 1 //定义布尔量'1':真
#define FALSE 0 //定义布尔量'0':假
#define uchar unsigned char //定义 无符号字符型数据 简称
#define uint unsigned int //定义 无符号整型数据 简称
#define KeyPort P1
#define Key1Value 1
#define Key2Value 2
//uchar code KeyCodeList[16]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xeb,0xe7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};//按键代码列表,按键扫描方式2使用,可按需要随意修改顺序
uchar KeyScan() //按键扫描函数(方式1,需配合源程序矩阵布局,返回值0表示无按键,1-16为对应按键),缺点:无法扫描组合键(同时按2个按键以上)
{
uchar temp_h,temp_l,scan_value,i;
KeyPort=0xf0; //设置低4位为0(扫描线),准备读取高4位(返回线)状态
if(KeyPort==0xf0) return 0; //若高4位状态不变,表示无按键,返回无按键 键值0
temp_h=~KeyPort>>4; //若高4位状态改变,表示有按键,读取高4位,并将结果转成正逻辑(按键对应 行线 为 1 )存在temp_h低位上
KeyPort=0x0f; //设置高4位为0(扫描线),准备读取低4位(返回线)状态
temp_l=~(KeyPort|0xf0); //读取低4位,并将结果转成正逻辑(按键对应 列线 为 1 )存在temp_l低位上
while(i<4) //将 按键行线号 转成数值
{
if((temp_h>>i)==0x01) break; //读取按键行线号
i++;
}
if(i==4) return 0; //若读取出错,返回无按键
temp_h=i; //将 按键行线数值 结果存于 temp_h
i=0;
while(i<4)