AT89S51单片机对4×4矩阵键盘的控制设计

发布者:荣耀使者最新更新时间:2023-09-01 来源: elecfans关键字:AT89S51  单片机  4×4  矩阵键盘 手机看文章 扫描二维码
随时随地手机看文章

1.实验任务

如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图4.14.1所示

AT89S51单片机对4×4矩阵键盘的控制设计

4.14.1

2.硬件电路原理图

AT89S51单片机对4×4矩阵键盘的控制设计

图4.14.2

3.系统板上硬件连线

(1).把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;

(2).把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。

4.程序设计内容

(1).4×4矩阵键盘识别处理

(2).每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

5.程序框图


图4.14.3

6. 汇编源程序

KEYBUF EQU 30H

ORG 00H

START: MOV KEYBUF,#2

WAIT:

MOV P3,#0FFH

CLR P3.4

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY1

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY1

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK1

MOV KEYBUF,#0

LJMP DK1

NK1: CJNE A,#0DH,NK2

MOV KEYBUF,#1

LJMP DK1

NK2: CJNE A,#0BH,NK3

MOV KEYBUF,#2

LJMP DK1

NK3: CJNE A,#07H,NK4

MOV KEYBUF,#3

LJMP DK1

NK4: NOP

DK1:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

DK1A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK1A

NOKEY1:

MOV P3,#0FFH

CLR P3.5

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY2

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY2

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK5

MOV KEYBUF,#4

LJMP DK2

NK5: CJNE A,#0DH,NK6

MOV KEYBUF,#5

LJMP DK2

NK6: CJNE A,#0BH,NK7

MOV KEYBUF,#6

LJMP DK2

NK7: CJNE A,#07H,NK8

MOV KEYBUF,#7

LJMP DK2

NK8: NOP

DK2:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

DK2A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK2A

NOKEY2:

MOV P3,#0FFH

CLR P3.6

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY3

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY3

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK9

MOV KEYBUF,#8

LJMP DK3

NK9: CJNE A,#0DH,NK10

MOV KEYBUF,#9

LJMP DK3

NK10: CJNE A,#0BH,NK11

MOV KEYBUF,#10

LJMP DK3

NK11: CJNE A,#07H,NK12

MOV KEYBUF,#11

LJMP DK3

NK12: NOP

DK3:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

DK3A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK3A

NOKEY3:

MOV P3,#0FFH

CLR P3.7

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY4

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY4

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK13

MOV KEYBUF,#12

LJMP DK4

NK13: CJNE A,#0DH,NK14

MOV KEYBUF,#13

LJMP DK4

NK14: CJNE A,#0BH,NK15

MOV KEYBUF,#14

LJMP DK4

NK15: CJNE A,#07H,NK16

MOV KEYBUF,#15

LJMP DK4

NK16: NOP

DK4:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

DK4A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK4A

NOKEY4:

LJMP WAIT

DELY10MS:

MOV R6,#10

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H

DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

END

7.C语言源程序

#include

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

unsigned char temp;

unsigned char key;

unsigned char i,j;

void main(void)

{

while(1)

{

P3=0xff;

P3_4=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=50;i》0;i--)

for(j=200;j》0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=7;

break;

case 0x0d:

key=8;

break;

case 0x0b:

key=9;

break;

case 0x07:

key=10;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

}

}

P3=0xff;

P3_5=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=50;i》0;i--)

for(j=200;j》0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=4;

break;

case 0x0d:

key=5;

break;

case 0x0b:

key=6;

break;

case 0x07:

key=11;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

}

}

P3=0xff;

P3_6=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=50;i》0;i--)

for(j=200;j》0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=1;

break;

case 0x0d:

key=2;

break;

case 0x0b:

key=3;

break;

case 0x07:

key=12;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

}

}

P3=0xff;

P3_7=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=50;i》0;i--)

for(j=200;j》0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=0;

break;

case 0x0d:

key=13;

break;

case 0x0b:

key=14;

break;

case 0x07:

key=15;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

}

}

}

}


关键字:AT89S51  单片机  4×4  矩阵键盘 引用地址:AT89S51单片机对4×4矩阵键盘的控制设计

上一篇:AT89S51单片机按键识别的过程和方法
下一篇:51单片机中断用法实例解析

推荐阅读最新更新时间:2024-11-02 14:55

基于单片机的声光报警系统的设计方案
1 声光报警系统基本原理 超声波是指频率高于20000Hz 的机械波。为了实现超声波回波测距,必须通过超声波传感器产生和接收超声波。超声波传感器是利用压电效应和逆压电效应原理实现电能和超声波能之间的相互转化,即超声波发射器是通过逆压电效应将电能转换为超声波能,产生超声波;而超声波接收器是通过压电效应将超声波能转换为电能,接收超声波。若超声波发射器发出的超声波是以速度v( 单位:m/s) 在介质中传播,在有效防范区域内遇到被测物体超声波受到反射,被超声波接收器接收,传播经历的时间为t(单位:s),那么可以计算出入侵者与防范物体之间的距离s(单位:m),公式为: 系统结构框图如图1 所示,单片机按照晶振电路给出的时钟时序下接收来自超声
[电源管理]
基于<font color='red'>单片机</font>的声光报警系统的设计方案
AT&T与高通共同测试4GLTE网络无人机
  高通公司与AT&T本月开始测试无人机在商用4G网络及未来5G网络上的飞行状况,并测试其对未来无人机运行的影响。   此次合作将测试移动网络的覆盖率、信号强度,可移动性以及测试整个飞行过程中如何运作。高通和AT&T表示,这将有助于确保即便在飞行视线以外无人机也能与网络互连,   IoT解决方案副总裁AT&T Chris Penrose表示:“关注到监管和商业需求方面,网络LTE互联性有潜力提供最佳飞行计划、可几乎实时追踪无人机的位置并调整航线。”   无人机测试基于高通的Snapdragon Flight无人机开发平台,这一开发平台有很多无人机都有使用,配有四核2.26GHz处理器,双频WiFi,蓝牙4.0,支持全球导航卫星系
[机器人]
如何学习51单片机/心得/KEIL4/DXP
什么是单片机 学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制。 有人觉得要先学汇编。不过我个人觉得,学习51单片机,还是从C语言入手,一来方便,二来容易上手,仁者见仁,智者见智吧。 关于学习51单片机的书籍,市场上有很多,大家可以择优选取。 那么,如何用程序控制单片机的呢? 我开始学单片机的时候也曾有过这样的困惑啊,ok,下面帮大家整理一下思路。 怎么在Keil里写程序?keil怎么安装破解? 用过VC6.0的同学都知道,VC6.0是一个编译环境。什么是编译环境?简单地说,就是你写代码的地方。 那么,同理,单片机的编译环境就是Ke
[单片机]
如何学习51<font color='red'>单片机</font>/心得/KEIL<font color='red'>4</font>/DXP
AVRmeg16单片机实现按键控制LCD1602的数据显示
/********************************** *action: meg16 LCD1602控制程序 **********************************/ #include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int #define RS_CLR PORTD &= ~(1 4) #define RS_SET PORTD |= (1 4) #define RW_CLR PORTD &= ~(1 5) #define RW_SET PORTD |= (1
[单片机]
Microchip宣布推出全新单片机系列
全新单片机采用独立于内核的外设实现闭环数字控制和安全监测,新增的外设集成通过硬件PID、相位角测量和100 mA电流驱动实现高级功能控制。 全球领先的整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商——Microchip Technology Inc.(美国微芯科技公司)近日在德国慕尼黑电子展上宣布推出多外设、低引脚数的PIC16(L)F161X系列,拓展其8位PIC®单片机产品线。全新的单片机引入并扩展了Microchip独立于内核的外设(CIP)。这些CIP均具备低功耗的特性,不仅缩短中断延迟,提升系统的效率和安全性,而且最大限度地降低了设计时间和投入。这些外设无需额外代码和外部组件,大大降低了系统的复
[单片机]
Microchip宣布推出全新<font color='red'>单片机</font>系列
C51单片机定时器/计数器中断功能详细分析(二)
一.外部中断相关寄存器 1.定时器/计数器控制寄存器控制寄存器(TCON) IT0:外部中断0触发方式控制位 当IT0=0时,为电平触发方式(低电平有效) 当IT0=1时,为边沿触发方式(下降沿有效) IT1:外部中断1触发方式控制位 当IT1=0时,为电平触发方式(低电平有效) 当IT1=1时,为边沿触发方式(下降沿有效) 2.中断允许控制寄存器(IE) EX0:外部中断0允许位; EX1:外部中断1允许位; EA :CPU中断允许(总允许)位。 二.外部中断的处理过程 1、设置中断触发方式,即IT0=1或0,IT1=1或0 2、开对应的外部中断,即EX0=1或EX1=1; 3、开总中断,即EA=1; 4、等待外部设
[单片机]
C51<font color='red'>单片机</font>定时器/计数器中断功能详细分析(二)
基于NXP 32位MCU的医疗用多参数监护仪解决方案
  多参数监护仪能为医学临床诊断提供重要的病人信息,可实时检测人体的心电信号、心率、血氧饱和度、血压、呼吸频率和体温等重要参数,实现对各参数的监督报警。信息存储和传输,是一种监护病人的重要设备,监护仪可实时、连续、长时间地监测病人的重要生命特征参数,具有很重要的临床使用参考价值,并可便携移动、车载使用,大大提高了使用率,为监护病人和抢救病人提供了第一手临床信息资料和多样的生命特征参数。      随着经济不断发展,人民生活水平不断改善,医疗水平的不断提高,各种医疗体制和社会保障体系的逐渐健全,目前医院在临床监护意识和监护产品的选择上呈现较大提高,在监护仪的综合化、模块化、专业化、智能化以及信息网络化等方面的需求日益突出。由此,
[单片机]
基于NXP 32位<font color='red'>MCU</font>的医疗用多参数监护仪解决方案
意法半导体STM32C0系列高能效微控制器性能大幅提升
新微控制器 STM32C071扩大闪存和 RAM容量,增加USB控制器,支持 TouchGFX图形软件,让终端产品变得更纤薄、小巧,更具竞争力 2024 年 10 月 16 日,中国——现在, STM32 开发人员可以在 STM32C0微控制器(MCU)上获得更多存储空间和更多功能,在资源有限和成本敏感的嵌入式应用中实现更先进的功能。 STM32C071 MCU配备高达128KB的闪存和 24KB 的 RAM ,还新增不需要外部晶振的USB从设备,支持TouchGFX图形软件。片上 USB控制器让设计人员轻松节省至少一个外部时钟和四个去耦电容,降低物料清单成本,简化 PCB元器件布局。此外,新产品只有一对电源线,这有助
[单片机]
意法半导体STM32C0系列高能效<font color='red'>微控制器</font>性能大幅提升
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved