一、实验目的

1.掌握4×4矩阵式键盘程序识别原理。

2.掌握4×4矩阵式键盘按键的设计方法。

二、设计原理

(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键 “0-F”的序号。

(2)键盘中对应按键的序号排列如图14.1所示。

三、参考电路

图14.2 4×4矩阵式键盘识别电路原理图

图14.1 4×4键盘0-F显示

图14.3 4×4矩阵式键盘识别程序流程图

四、电路硬件说明

(1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。

(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。

五、程序设计内容

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

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

六、程序流程图(如图14.3所示)

七、汇编源程序

;;;;;;;;;;定义单元;;;;;;;;;;

COUNT EQU 30H

;;;;;;;;;;入口地址;;;;;;;;;;

ORG 0000H

LJMP START

ORG 0003H

RETI

ORG 000BH

RETI

ORG 0013H

RETI

ORG 001BH

RETI

ORG 0023H

RETI

ORG 002BH

RETI

;;;;;;;;;;主程序入口;;;;;;;;;;

ORG 0100H

START: LCALL CHUSHIHUA

LCALL PANDUAN

LCALL XIANSHI

LJMP START

;;;;;;;;;;初始化程序;;;;;;;;;;

CHUSHIHUA: MOV COUNT,#00H

RET

;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;;

PANDUAN: MOV P3,#0FFH

CLR P3.4

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW1

LCALL DELAY10MS

JZ SW1

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,K1

MOV COUNT,#0

LJMP DK

K1: CJNE A,#0DH,K2

MOV COUNT,#4

LJMP DK

K2: CJNE A,#0BH,K3

MOV COUNT,#8

LJMP DK

K3: CJNE A,#07H,K4

MOV COUNT,#12

K4: NOP

LJMP DK

SW1: MOV P3,#0FFH

CLR P3.5

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW2

LCALL DELAY10MS

JZ SW2

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,K5

MOV COUNT,#1

LJMP DK

K5: CJNE A,#0DH,K6

MOV COUNT,#5

LJMP DK

K6: CJNE A,#0BH,K7

MOV COUNT,#9

LJMP DK

K7: CJNE A,#07H,K8

MOV COUNT,#13

K8: NOP

LJMP DK

SW2: MOV P3,#0FFH

CLR P3.6

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW3

LCALL DELAY10MS

JZ SW3

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,K9

MOV COUNT,#2

LJMP DK

K9: CJNE A,#0DH,KA

MOV COUNT,#6

LJMP DK

KA: CJNE A,#0BH,KB

MOV COUNT,#10

LJMP DK

KB: CJNE A,#07H,KC

MOV COUNT,#14

KC: NOP

LJMP DK

SW3: MOV P3,#0FFH

CLR P3.7

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW4

LCALL DELAY10MS

JZ SW4

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,KD

MOV COUNT,#3

LJMP DK

KD: CJNE A,#0DH,KE

MOV COUNT,#7

LJMP DK

KE: CJNE A,#0BH,KF

MOV COUNT,#11

LJMP DK

KF: CJNE A,#07H,KG

MOV COUNT,#15

KG: NOP

LJMP DK

SW4: LJMP PANDUAN

DK: RET

;;;;;;;;;;显示程序;;;;;;;;;;

XIANSHI: MOV A,COUNT

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SK: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ SK

RET

;;;;;;;;;;10ms延时程序;;;;;;;;;;

DELAY10MS: MOV R6,#20

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

;;;;;;;;;;200ms延时程序;;;;;;;;;;

DELAY: MOV R5,#20

LOOP: LCALL DELAY10MS

DJNZ R5,LOOP

RET

;;;;;;;;;;共阴码表;;;;;;;;;;

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

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

;;;;;;;;;;结束标志;;;;;;;;;;

END

八、C语言源程序

#include

unsigned char code table[]={0x3f,0x66,0x7f,0x39,

0x06,0x6d,0x6f,0x5e,

0x5b,0x7d,0x77,0x79,

0x4f,0x07,0x7c,0x71};

void main(void)

{ unsigned char i,j,k,key;

while(1)

{ P3=0xff; //给P3口置1//

P3_4=0; //给P3.4这条线送入0//

i=P3;

i=i&0x0f; //屏蔽低四位//

if(i!=0x0f) //看是否有按键按下//

{ for(j=50;j>0;j--) //延时//

for(k=200;k>0;k--);

if(i!=0x0f) //再次判断按键是否按下//

{ switch(i) //看是和P3.4相连的四个按键中的哪个//

{ case 0x0e:

key=0;

break;

case 0x0d:

key=1;

break;

case 0x0b:

key=2;

break;

case 0x07:

key=3;

break;

}

P0=table[key]; //送数到P0口显示//

}

}

P3=0xff;

P3_5=0; //读P3.5这条线//

i=P3;

i=i&0x0f; //屏蔽P3口的低四位//

if(i!=0x0f) //读P3.5这条线上看是否有按键按下//

{ for(j=50;j>0;j--) //延时//

for(k=200;k>0;k--);

i=P3; //再看是否有按键真的按下//

i=i&0x0f;

if(i!=0x0f)

{ switch(i) //如果有,显示相应的按键//

{ case 0x0e:

key=4;

break;

case 0x0d:

key=5;

break;

case 0x0b:

key=6;

break;

case 0x07:

key=7;

break;

}

P0=table[key]; //送入P0口显示//

}

}

P3=0xff;

P3_6=0; //读P3.6这条线上是否有按键按下//

i=P3;

i=i&0x0f;

if(i!=0x0f)

{ for(j=50;j>0;j--)

for(k=200;k>0;k--);

i=P3;

i=i&0x0f;

if(i!=0x0f)

{ switch(i)

{ case 0x0e:

key=8;

break;

case 0x0d:

key=9;

break;

case 0x0b:

key=10;

break;

case 0x07:

key=11;

break;

}

P0=table[key];

}

}

P3=0xff;

P3_7=0; //读P3.7这条线上是否有按键按下//

i=P3;

i=i&0x0f;

if(i!=0x0f)

{ for(j=50;j>0;j--)

for(k=200;k>0;k--);

i=P3;

i=i&0x0f;

if(i!=0x0f)

{ switch(i)

{ case 0x0e:

key=12;

break;

case 0x0d:

key=13;

break;

case 0x0b:

key=14;

break;

case 0x07:

key=15;

break;

}

P0=table[key];

}

}

}

}

九、注意事项

在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。

单片机阵列式键盘实验C语言,单片机4×4矩阵式键盘的课程设计相关推荐

  1. 查询式键盘实验c语言,单片机实验上机--实验十七查询式键盘实验.doc

    实验十七 查询式键盘实验 一.实验目的 1.掌握键盘和显示器的接口方法和编程方法 2.掌握键盘和八段码显示器的工作原理 3.静态显示的原理和相关程序的编写 二.实验说明 本实验提供了8个按钮的小键盘, ...

  2. 独立式键盘实验c语言,单片机设计报告—独立式键盘控制的4级流水灯.doc

    单片机设计报告-独立式键盘控制的4级流水灯 单片机结题报告 独立式键盘控制的4级流水灯 班 级 姓 名 吴泽宇 学 号 2008405340 一.任务目的: 通过采用单片机制作一个独立式键盘控制的4级 ...

  3. 单片机实例14——4×4矩阵式键盘识别技术(硬件电路图+汇编程序+C语言程序)

    14. 4×4矩阵式键盘识别技术 1. 实验任务 如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线:在数码管上显示每个按键 ...

  4. 代写python期末作业价格_代写program留学生作业、代做Python程序语言作业、代写Python课程设计作业...

    代写program留学生作业.代做Python程序语言作业.代写Python课程设计作业 日期:2019-11-29 12:55 Completing the Final Project - Pyth ...

  5. 查询式键盘实验c语言,查询式键盘与阵列式键盘实验.doc

    查询式键盘与阵列式键盘实验 PAGE \* MERGEFORMAT 1 论 文 提 要 在大部分嵌入式系统中,人机交互界面是必不可少的一个重要部分,人机交互界面的设计往往占据很大一部分工作.人机交互界 ...

  6. 单片机并口应用实验c语言,1单片机并口简单应用(流水灯).docx

    试验1单片机并口简单应用(流水灯) 实验目的 1.了解单片机C语言程序的基本结构 2.了解单片机C语言程序的设计和调试方法 3.掌握顺序控制程序的简单编程 4.熟悉51单片机的端口使用 实验仪器 单片 ...

  7. 山东大学单片机原理与应用实验 C语言程序实验

    一.实验题目 C语言程序实验 二.试验要求 片内RAM30H开始的32个单元中分布着随机的有符号8位二进制数,按从小到大的顺序进行排序,排序后的数据仍然保存到30H开始的32个单元中(低地址存放小数据 ...

  8. pc机串口通讯实验c语言,单片机实验六 单片机与PC机串口通讯

    实验报告六 实验名称:单片机与PC机串口通讯 实验目的 : 1.掌握串行口工作方式的程序设计,掌握单片机通讯的编制. 2.了解实现串行通讯的硬环境,数据格式的协议,数据交换的协议. 3.了解PC机通讯 ...

  9. p1口输入 输出实验C语言,单片机P1口输入输出实验单片机P1口输入输出实验.ppt

    单片机P1口输入输出实验单片机P1口输入输出实验 单片机I/O口输入输出实验 (或单片机数字量输入输出实验);单片机P1口输入输出实验 ;2.实验要求(1).2)为必做,3)为选做) 3) P1口作输 ...

  10. 单片机io口的控制实验c语言,单片机io口控制实验报告

    <单片机io口控制实验报告>由会员分享,可在线阅读,更多相关<单片机io口控制实验报告(5页珍藏版)>请在人人文库网上搜索. 1.单片机io口控制实验报告 精品文档,仅供参考单 ...

最新文章

  1. Redis学习(4)-数据类型set和zset
  2. TikTok游戏话题浏览上涨,预示出海新机会
  3. 004_Bean标签
  4. sdut 2139BFS
  5. 特征训练、预测一致性管理工具:开源项目Feast
  6. 大剑无锋之了解什么是CAP吗?【面试推荐】
  7. 根据不同地区的名称显示不同的页面
  8. Silverlight语音朗读
  9. Android/Linux之procrank查内存工具
  10. Linux文件的基本属性
  11. 生活情景英语:英语国家生存英语精选
  12. python汉化版下载-Python中文版
  13. 安卓支持AES 256加密解密
  14. ads1115应用电路及驱动程序
  15. 数据分析 | 多元线性回归
  16. 正则表达式 第一次碰到某个特定字符就返回
  17. Karplus-Strong Algorithm 弦乐器模拟 吉他弦乐器发声原理 泛音 乐理概述
  18. 红外对管应该如何选择比较好
  19. NBA常规赛总得分排行榜(数据截止至11年4月14日)
  20. 模拟浏览器整理电影榜单

热门文章

  1. 预测大盘最准确的指标_通达信大盘预测指标,通达信副图指标,需要写一个关于大盘每日成交量的指标高手请进啊...
  2. 招聘PHP聚合系统,Thinkphp5开发OA办公系统之招聘申请
  3. 网盘助手插件chrome插件
  4. 图解深度学习的笔记:1.MP模型,感知器,BP下的多层感知器
  5. python爬虫淘宝视频_python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据...
  6. 智慧能源:浅谈新一代信息技术在智慧能源的应
  7. 最新京东批量试用助手
  8. 基于 Retinex 的几种图像增强算法总结
  9. 多尺度图像增强Retinex相关算法学习及实现
  10. pdfjs实现pdf预览