
实验目的: 了解并掌握矩阵键盘的工作原理;
实验模块: 核心板+矩阵键盘+数字管模块;
实验内容: 数字显像管和矩阵键盘会相应显示,即从左到右,从上到下命名.
对于“ 0--F”;
扩展任务: 数字管和按钮分别显示,并进行乘法显示;
模块连接图:

电路原理图:
矩阵键盘的工作原理: 在矩阵键盘中,水平线和垂直线在交点处不是笔直的
已连接,但通过按钮连接. 这样就可以构成端口(例如P3端口)
4 * 4 = 16键,这是直接在键盘上使用端口线的两倍,而更多的行则是差异
更明显的是,例如,多条线可以组成一个20键键盘,而端口线只能直接使用
一键(9键). 可以看出,当按键数量较大时,采用矩阵法制作键盘是合理的.
的. 矩阵键盘通常使用以下命令确定所按下键的位置.
第一种方法是行扫描:
首先判断键盘上是否有按键,将所有行H0-H3设置为低电平,然后检查列线
L0-L3的状态. 只要一列的水平很低,就表示按下和关闭了键盘上的一个键
The
键位于4个键之间,其中低电平线与4条行线交叉. 如果所有列线都高,那么
键盘上没有按键被按下;然后,确定关闭键的位置. 确认按下键后,您可以输入
确定关闭密钥的过程. 方法是: 依次将行线设置为低电平,即将某行设置为
低电平时,其他行为高电平. 确认某行的位置较低后,然后逐行检查每一列
行的级别状态. 如果某列为低,则关闭设置为低的列线和行线交点处的按钮
关闭按钮.

第二种方法是高低翻转法:
首先,让P1端口的高四位为1,低四位为0. 如果按下一个按钮,则前四位将有一个数字
一个1变为0,并且低四位不变. 此时,可以确定所按下键的行位置;然后让P1
嘴巴的高四位为0,低四位为1. 如果按下按钮,则低四位将有一个1,该位将变为0,
高四位不变,此时可以确定所按下键的列位置.

功能描述: 采用倒置方式实现矩阵键盘扫描,数码管显示4x4键盘扫描结果
硬件连接: 使用8位杜邦电缆连接J8和J12,使用2位杜邦电缆将J11_0连接到J15_DS1,将J11_1连接到J15_DS2,使用8位杜邦电缆将J9连接到J6.
#include“ reg51.h” //包含头文件
位LE1 = P2 ^ 0; //选择573锁存器使能
位LE2 = P2 ^ 1; //细分选择573锁存器启用
#define uchar无符号字符
#define uint unsigned int
uchar keyValue; //定义扫描结果参数
uchar代码dis [16] = {0x3F,0x06,0x5B单片机矩阵键盘课程设计报告,0x4F,0x66,0x6D,0x7D,0x07,
// 0 1 2 3 4 5 6 7
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; // 0〜F段代码
// 8 9 A B C D E F
uchar temp;
// ********************************************* **************************************************** **** ***
//延迟功能
// ********************************************* **************************************************** **** ***
delay(uint time)// int类型数据为16位,因此最大值为65535
{

uint i单片机矩阵键盘课程设计报告,j; //为循环语句定义变量i,j
for(i = 0; i for(j = 0; j)
// ********************************************* **************************************************** **** ***
//矩阵键盘扫描功能
// ********************************************* **************************************************** **** ***
keyScan()
{
uchar x,y;
P3 = 0xf0; // P3分配0xf0
if((P3&0xf0)!= 0xf0)//确定高4位是否全为1(高4位中的全1表示没有按键)
{
delay(20); //延时反跳,一般为5ms〜10ms(由于机械触点的弹力作用,关闭时按钮无法稳定开启,
//并且在关闭时会产生一系列抖动,按键的抖动会导致多次误读按键)
if((P3&0xf0)!= 0xf0)//如果仍然可以检测到键盘按动
{
x = P3&0xf0; //读取P3端口数据
P3 = 0x0f; //反向,P3分配值为0x0f
y = P3&0x0f; //读取P3端口数据
keyValue = x | y; //获取扫描结果
}
}
}
// ********************************************* **************************************************** **** ***
//矩阵键盘扫描结果处理功能

// ********************************************* **************************************************** **** ***
uchar keyHandle(uchar值)
{
切换(值)
{
case 0xee: {return(0); break;} //对应于按钮S1
case 0xde: {return(1); break;} //对应的按钮S2
case 0xbe: {return(2); break;} //对应的按钮S3
case 0x7e: {return(3); break;} //对应于按钮S4
情况0xed: {return(4); break;} //对应于按钮S5
case 0xdd: {return(5); break;} //对应的按钮S6
case 0xbd: {return(6); break;} //对应的按钮S7
case 0x7d: {return(7); break;} //对应的按钮S8
case 0xeb: {return(8); break;} //对应的按钮S9
case 0xdb: {return(9); break;} //对应于按钮S10
case 0xbb: {return(10); break;} //对应于按钮S11
case 0x7b: {return(11); break;} //对应的按钮S12
case 0xe7: {return(12); break;} //对应的按钮S13
情况0xd7: {return(13); break;} //对应的按钮S14
case 0xb7: {return(14); break;} //对应的按钮S15
情况0x77: {return(15); break;} //对应的按钮S16
默认值: {break;}
}
}

// ********************************************* **************************************************** **** ***
//显示扫描结果功能
// ********************************************* **************************************************** **** ***
show()
{
P1 = 0x00; // 0x00 = 0000 0000,即频闪数字均为8位
LE1 = 1; //锁位
LE1 = 0; //断开锁存器,第573位的Q7〜Q0仍为0x00
P1 = dis [temp]; //代码为0〜F
LE2 = 1; //锁定段代码
LE2 = 0; //断开锁存器,段573的Q7〜Q0仍为[temp]
}
// ********************************************* **************************************************** **** ***
//主要功能
// ********************************************* **************************************************** **** ***
void main()//主函数
{
while(1)//进入while循环
{
keyScan(); //按键扫描
temp = keyHandle(keyValue); //处理扫描结果
show(); // 8位数码管显示键值
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-289618-1.html
真心很好听
各种复杂添加剂
#杨洋2015金投赏##杨洋轻奢young#羊毛携手杨洋