单片机4x4矩阵式键盘的设计与仿真
4x4矩阵键盘设计报告
![4x4矩阵键盘设计报告](https://img.taocdn.com/s3/m/db4c862424c52cc58bd63186bceb19e8b8f6ec2f.png)
4x4矩阵键盘设计报告1.引言1.1 概述概述:4x4矩阵键盘是一种常用的输入设备,广泛应用于各种电子产品中。
本报告旨在介绍4x4矩阵键盘的设计理念、技术实现以及使用体验,并对其设计优势进行分析。
同时,将收集用户反馈,展望未来对4x4矩阵键盘的发展趋势进行探讨。
通过本报告的阐述,读者可以更加全面地了解4x4矩阵键盘的设计与应用,为相关产品的设计与开发提供参考和借鉴。
1.2 文章结构本报告将分为引言、正文和结论三个部分。
引言部分将概述本设计报告的目的和重要性,介绍文章结构和各部分内容的主要内容。
正文部分将详细介绍设计理念、技术实现和使用体验,通过分析和阐述设计的过程和特点,展现4x4矩阵键盘设计的全面性和独特性。
结论部分将对设计的优势进行总结,考虑用户反馈和展望未来的发展方向,以期为4x4矩阵键盘的设计提供参考和启示。
文章1.3 目的:本报告的目的是介绍我们设计的4x4矩阵键盘,并分析其设计理念、技术实现和使用体验。
通过本报告,读者可以了解我们的设计思路和创新之处,以及用户在使用过程中的反馈和建议。
同时,我们还会对该键盘的设计优势进行评估,并展望未来可能的发展方向。
通过本报告的阐述,我们希望能够为相关领域的学习和研究提供有益的参考和启发。
2.正文2.1 设计理念设计理念部分的内容:在设计4x4矩阵键盘时,我们以用户体验和便捷性为设计理念的核心。
我们希望设计一款符合人体工程学的键盘,使用户在使用过程中能够感受到舒适和便捷。
同时,我们也注重键盘的美学设计,希望能够设计出外观时尚,符合当代审美的产品。
此外,我们也考虑了键盘的功能多样性,希望能够满足不同用户的需求,提供更好的用户体验。
因此,在设计理念上,我们以用户体验和功能多样性为重点,致力于设计出一款符合人体工程学、外观时尚、功能多样的4x4矩阵键盘。
2.2 技术实现在本节中,我们将讨论4x4矩阵键盘的技术实现。
我们首先考虑到了键盘的布局和排列,通过设计合理的矩阵布局,我们可以实现较小尺寸的键盘同时保证较高的按键准确性。
课程设计-制作单片机的4X4矩阵键盘
![课程设计-制作单片机的4X4矩阵键盘](https://img.taocdn.com/s3/m/f84614437f1922791688e8fd.png)
1.2.1矩阵式键盘介绍
矩阵式键盘(或者叫行列式键盘)常应用在按键数量比较多的系统之中。这种键盘由行线和列线组成,按键设置在行、列结构的交叉点上,行、列线分别接在按键开关的两端。行列式键盘可分为非编码键盘和编码键盘两大类。编码键盘内部设有键盘编码器,被按下键的键号由键盘编码器直接给出,同时具有防抖和解决重键的功能。非编码键盘通常采用软件的方法,逐行逐列检查键盘状态,当有键按下时,通过计算或查表的方法获取该键的键值,通常,计算机通过程序控制对键盘扫描,从而获取键值,根据计算机扫描的方法可以分为定时扫描法和中断扫描法两种。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
课程设计-制作单片机的4X4矩阵键盘
第一章硬件部分
第一节AT89C51
AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。引脚如图所示
单片机 矩阵键盘实验 实验报告
![单片机 矩阵键盘实验 实验报告](https://img.taocdn.com/s3/m/bc83bd62ff4733687e21af45b307e87101f6f898.png)
单片机矩阵键盘实验实验报告一、实验目的本次实验的目的是掌握原理和方法,利用单片机识别矩阵键盘并编程实现键码转换功能,控制LED点亮显示。
二、实验原理矩阵键盘是一种由多路单向控制器输入行选择信号与列选择信号连接而形成的一一对应矩阵排列结构。
它广泛应用于电子游戏机、办公自动化设备、医疗仪器、家电控制及书籍检索机器等方面。
本次实验采用的矩阵键盘是一个4 x 4矩阵,用4段数码管显示按键编码,每个按键都可以输入一个代码,矩阵键盘连接单片机,实现一个软件算法来识别键码转化。
从而将键盘中的按键的按下信号转换成程序能够识别的代码,置于相应的输出结果中,控制LED点亮,从而可以实现矩阵键盘按键的转换功能。
三、实验方法1.硬件搭建:矩阵键盘(4行4列)与单片机(Atmel AT89C51)相连,选择引脚连接,并将数码管和LED与单片机相连以实现显示和点亮的功能。
2.程序设计:先建立控制体系,利用中断服务子程序识别和码值转换,利用中断服务子程序实现从按键的按下信号转换为程序能够识别的代码,然后将该代码段编写到单片机程序中,每次按下矩阵键盘按键后单片机给出相应的按键编码输出,用数码管显示,控制LED点亮。
四、实验结果经过实验,成功实现了矩阵键盘与单片机之间的连接,编写了中断服务子程序,完成了按键编码输出与LED点亮的功能。
实验完成后,数码管显示各种按键的编码,同时LED会点亮。
本次实验介绍了矩阵键盘的原理,论述了键码转换的程序设计步骤,并实验完成矩阵键盘与单片机的连接,实现用LED点亮以及数码管显示按键的编码。
通过本次实验,受益匪浅,使我对使用单片机编写算法与程序有了更深入的认识,同时丰富了课堂学习的内容,也使我更加热爱自己所学的专业。
单片机c语言程序设计---矩阵式键盘实验报告
![单片机c语言程序设计---矩阵式键盘实验报告](https://img.taocdn.com/s3/m/54cd1a460a1c59eef8c75fbfc77da26924c59657.png)
单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。
(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。
在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
操作方完成矩阵式键盘实验。
具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。
完成思考题。
三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。
2.在keil上进行编译后生成“xxx.hex”文件。
3.编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。
单片机4×4矩阵键盘设计方案
![单片机4×4矩阵键盘设计方案](https://img.taocdn.com/s3/m/c7a16e0ba45177232f60a2e8.png)
1、设计原理(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。
(2)键盘中对应按键的序号排列如图14.1所示。
2、参考电路图14.2 4×4矩阵式键盘识别电路原理图3、电路硬件说明(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。
4、程序设计内容(1)4×4矩阵键盘识别处理。
(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
5、程序流程图(如图14.3所示)6、汇编源程序;;;;;;;;;;定义单元;;;;;;;;;;COUNT EQU 30H;;;;;;;;;;入口地址;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100HSTART: LCALL CHUSHIHUALCALL PANDUANLCALL XIANSHILJMP START;;;;;;;;;;初始化程序;;;;;;;;;;CHUSHIHUA: MOV COUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;;PANDUAN: MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHJZ SW1LCALL DELAY10MS JZ SW1MOV A,P3ANL A,#0FHCJNE A,#0EH,K1 MOV COUNT,#0 LJMP DKK1: CJNE A,#0DH,K2 MOV COUNT,#4 LJMP DKK2: CJNE A,#0BH,K3 MOV COUNT,#8 LJMP DKK3: CJNE A,#07H,K4 MOV COUNT,#12K4: NOPLJMP DKSW1: MOV P3,#0FFH CLR P3.5MOV A,P3ANL A,#0FHJZ SW2LCALL DELAY10MS JZ SW2MOV A,P3ANL A,#0FHCJNE A,#0EH,K5 MOV COUNT,#1 LJMP DKK5: CJNE A,#0DH,K6 MOV COUNT,#5 LJMP DKK6: CJNE A,#0BH,K7 MOV COUNT,#9 LJMP DKK7: CJNE A,#07H,K8 MOV COUNT,#13K8: NOPLJMP DKSW2: MOV P3,#0FFH CLR P3.6MOV A,P3ANL A,#0FHJZ SW3LCALL DELAY10MS JZ SW3MOV A,P3ANL A,#0FHCJNE A,#0EH,K9 MOV COUNT,#2 LJMP DKK9: CJNE A,#0DH,KA MOV COUNT,#6 LJMP DKKA: CJNE A,#0BH,KB MOV COUNT,#10 LJMP DKKB: CJNE A,#07H,KC MOV COUNT,#14 KC: NOPLJMP DKSW3: MOV P3,#0FFH CLR P3.7MOV A,P3ANL A,#0FHJZ SW4LCALL DELAY10MSJZ SW4MOV A,P3ANL A,#0FHCJNE A,#0EH,KDMOV COUNT,#3LJMP DKKD: CJNE A,#0DH,KE MOV COUNT,#7LJMP DKKE: CJNE A,#0BH,KF MOV COUNT,#11 LJMP DKKF: CJNE A,#07H,KG MOV COUNT,#15KG: NOPLJMP DKSW4: LJMP PANDUAN DK: RET ;;;;;;;;;;显示程序;;;;;;;;;; XIANSHI: MOV A,COUNTMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ALCALL DELAYSK: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ SKRET;;;;;;;;;;10ms延时程序;;;;;;;;;;DELAY10MS: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5,#20LOOP: LCALL DELAY10MSDJNZ R5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H;;;;;;;;;;结束标志;;;;;;;;;;END7、C语言源程序#includeunsigned 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、注意事项在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。
基于51单片机4乘4矩阵键盘的设计
![基于51单片机4乘4矩阵键盘的设计](https://img.taocdn.com/s3/m/c6444357ba1aa8114431d9e8.png)
case 0x7d:KEY=7;break;
case 0xeb:KEY=8;break;
case 0xdb:KEY=9;break;
case 0xbb:KEY=10;break;
case 0x7b:KEY=11;break;
case 0xe7:KEY=12;break;
控制任务:
编程实现4乘4的矩阵键盘控制连接在P0口和P1口上的16个LED,当按下某键并释放后只有对应的LED灯亮,例如按S0后D0亮,按S1后D1亮。
程序及仿真:
#include<reg51.h>
unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
b=P2;
a=a|b;
switch(a)
{
case 0xee:KEY=0;break;
case 0xde:KEY=1;break;
case 0xbe:KEY=2;break;
case 0x7e:KEY=3;break;
case 0xed:KEY=4;break;
case 0xdd:KEY=5;break;
{
P0=0xff;
P1=led[n-8];
}}
int main(void)
{
whilsplay(KEY);
}
return 0;
}
更多资源,请关注微博“风竹弈星”,私聊。
unsigned char KEY=0xff;
void keyscan(void)
{
unsigned char a,b;
P2=0xf0;//高四位作为输入(高电平),低四位输出低电平
4×4矩阵键盘的工作原理与编程
![4×4矩阵键盘的工作原理与编程](https://img.taocdn.com/s3/m/5da95a88a98271fe900ef981.png)
4×4矩阵键盘的工作原理与编程ME300B单片机学习开发系统应用之三---4×4矩阵键盘的工作原理与编程作者:山西太原贵国庆本文介绍如何在ME300B型51/AVR单片机学习开发系统上使用数码管显示4×4矩阵键盘的键值。
一、硬件工作原理的简单介绍该实验使用ME300B上的8位数码管显示电路和4×4矩阵键盘电路。
现将这二部分的电路工作原理进行简单的介绍:1、4×4矩阵键盘的工作原理矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4×4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
图1为ME300B矩阵键盘电路图,行线接P1.4-P1.7,列线接P1.0-P1.3。
地显示。
图3 数码管电路数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。
数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。
若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。
所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮度,又要数码管显示时不产生闪烁现象。
在ME300B单片机开发系统中使用数码管来显示信息时,要将JP2的2、3端短接。
见图3二、演示程序的编程方法1、4×4矩阵键盘的编程方法:1.1、先读取键盘的状态,得到按键的特征编码。
先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。
再从P1口的低四位输出低电平,高四位输出高电平,从P1口的高四位读取键盘状态。
将两次读取结果组合起来就可以得到当前按键的特征编码。
使用上述方法我们得到16个键的特征编码。
举例说明如何得到按键的特征编码:假设“1”键被按下,找其按键的特征编码。
单片机4×4矩阵键盘设计方案
![单片机4×4矩阵键盘设计方案](https://img.taocdn.com/s3/m/3ac0e7244693daef5ff73d44.png)
1、设计原理(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。
(2)键盘中对应按键的序号排列如图14.1所示。
2、参考电路图14.24×4矩阵式键盘识别电路原理图3、电路硬件说明(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。
4、程序设计内容(1)4×4矩阵键盘识别处理。
(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
5、程序流程图(如图14.3所示)6、汇编源程序;;;;;;;;;;定义单元;;;;;;;;;;COUNTEQU30H;;;;;;;;;;入口地址;;;;;;;;;;ORG0000HLJMPSTARTORG0003HRETIORG000BHRETIORG0013HRETIORG001BHRETIORG0023HRETIORG002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG0100HSTART:LCALLCHUSHIHUALCALLPANDUANLCALLXIANSHILJMPSTART;;;;;;;;;;初始化程序;;;;;;;;;; CHUSHIHUA:MOVCOUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;; PANDUAN:MOVP3,#0FFHCLRP3.4MOVA,P3ANLA,#0FHXRLA,#0FHJZSW1LCALLDELAY10MSJZSW1MOVA,P3ANLA,#0FHCJNEA,#0EH,K1MOVCOUNT,#0LJMPDKK1:CJNEA,#0DH,K2MOVCOUNT,#4 LJMPDKK2:CJNEA,#0BH,K3 MOVCOUNT,#8 LJMPDKK3:CJNEA,#07H,K4 MOVCOUNT,#12K4:NOPLJMPDKSW1:MOVP3,#0FFH CLRP3.5MOVA,P3ANLA,#0FH XRLA,#0FHJZSW2 LCALLDELAY10MS JZSW2MOVA,P3ANLA,#0FH CJNEA,#0EH,K5 MOVCOUNT,#1LJMPDKK5:CJNEA,#0DH,K6 MOVCOUNT,#5 LJMPDKK6:CJNEA,#0BH,K7 MOVCOUNT,#9 LJMPDKK7:CJNEA,#07H,K8 MOVCOUNT,#13K8:NOPLJMPDKSW2:MOVP3,#0FFH CLRP3.6MOVA,P3ANLA,#0FH XRLA,#0FHJZSW3 LCALLDELAY10MS JZSW3MOVA,P3ANLA,#0FHCJNEA,#0EH,K9 MOVCOUNT,#2 LJMPDKK9:CJNEA,#0DH,KA MOVCOUNT,#6 LJMPDKKA:CJNEA,#0BH,KB MOVCOUNT,#10 LJMPDKKB:CJNEA,#07H,KC MOVCOUNT,#14 KC:NOPLJMPDKSW3:MOVP3,#0FFH CLRP3.7MOVA,P3ANLA,#0FH XRLA,#0FHJZSW4 LCALLDELAY10MS JZSW4ANLA,#0FHCJNEA,#0EH,KD MOVCOUNT,#3LJMPDKKD:CJNEA,#0DH,KE MOVCOUNT,#7LJMPDKKE:CJNEA,#0BH,KF MOVCOUNT,#11LJMPDKKF:CJNEA,#07H,KG MOVCOUNT,#15KG:NOPLJMPDKSW4:LJMPPANDUANDK:RET;;;;;;;;;;显示程序;;;;;;;;;; XIANSHI:MOVA,COUNT MOVDPTR,#TABLEMOVCA,@A+DPTRLCALLDELAYSK:MOVA,P3ANLA,#0FHXRLA,#0FHJNZSKRET;;;;;;;;;;10ms延时程序;;;;;;;;;; DELAY10MS:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;; DELAY:MOVR5,#20LOOP:LCALLDELAY10MSDJNZR5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB7FH,6FH,77H,7CH,39H,5EH,79H,71H7、C语言源程序#includeunsignedcharcodetable[]={0x3f,0x66,0x7f,0x39,0x06,0x6d,0x6f,0x5e,0x5b,0x7d,0x77,0x79,0x4f,0x07,0x7c,0x71};voidmain(void){unsignedchari,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相连的四个按键中的哪个// {case0x0e:key=0;break;case0x0d:key=1;break;case0x0b:key=2;break;case0x07: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)//如果有,显示相应的按键// {case0x0e:key=4;break;case0x0d:key=5;break;case0x0b:key=6;break;case0x07: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){case0x0e:key=8;break;case0x0d:key=9;break;case0x0b:key=10;break;case0x07:key=11;}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){case0x0e:key=12;break;case0x0d:key=13;case0x0b:key=14;break;case0x07:key=15;break;}P0=table[key];}}}}8、注意事项在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。
单片机4×4矩阵键盘方案设计
![单片机4×4矩阵键盘方案设计](https://img.taocdn.com/s3/m/dab95f4fccbff121dd36838e.png)
1、设计原理(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。
(2)键盘中对应按键的序号排列如图14.1所示。
2、参考电路图14.2 4×4矩阵式键盘识别电路原理图3、电路硬件说明(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。
4、程序设计内容(1)4×4矩阵键盘识别处理。
(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
5、程序流程图(如图14.3所示)6、汇编源程序;;;;;;;;;;定义单元;;;;;;;;;;COUNT EQU 30H;;;;;;;;;;入口地址;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100HSTART: LCALL CHUSHIHUALCALL PANDUANLCALL XIANSHILJMP START;;;;;;;;;;初始化程序;;;;;;;;;; CHUSHIHUA: MOV COUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;; PANDUAN: MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW1LCALL DELAY10MSJZ SW1MOV A,P3ANL A,#0FHCJNE A,#0EH,K1 MOV COUNT,#0LJMP DKK1: CJNE A,#0DH,K2 MOV COUNT,#4LJMP DKK2: CJNE A,#0BH,K3 MOV COUNT,#8LJMP DKK3: CJNE A,#07H,K4 MOV COUNT,#12K4: NOPLJMP DKSW1: MOV P3,#0FFH CLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW2LCALL DELAY10MSJZ SW2MOV A,P3ANL A,#0FHCJNE A,#0EH,K5 MOV COUNT,#1LJMP DKK5: CJNE A,#0DH,K6 MOV COUNT,#5LJMP DKK6: CJNE A,#0BH,K7 MOV COUNT,#9LJMP DKK7: CJNE A,#07H,K8 MOV COUNT,#13K8: NOPLJMP DKSW2: MOV P3,#0FFH CLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW3LCALL DELAY10MSJZ SW3MOV A,P3ANL A,#0FHCJNE A,#0EH,K9 MOV COUNT,#2LJMP DKK9: CJNE A,#0DH,KA MOV COUNT,#6LJMP DKKA: CJNE A,#0BH,KB MOV COUNT,#10 LJMP DKKB: CJNE A,#07H,KC MOV COUNT,#14 KC: NOPLJMP DKSW3: MOV P3,#0FFH CLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW4LCALL DELAY10MSJZ SW4MOV A,P3ANL A,#0FHCJNE A,#0EH,KD MOV COUNT,#3LJMP DKKD: CJNE A,#0DH,KE MOV COUNT,#7LJMP DKKE: CJNE A,#0BH,KFLJMP DKKF: CJNE A,#07H,KGMOV COUNT,#15KG: NOPLJMP DKSW4: LJMP PANDUANDK: RET;;;;;;;;;;显示程序;;;;;;;;;; XIANSHI: MOV A,COUNTMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ALCALL DELAYSK: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ SKRET;;;;;;;;;;10ms延时程序;;;;;;;;;; DELAY10MS: MOV R6,#20DJNZ R7,$DJNZ R6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5,#20LOOP: LCALL DELAY10MSDJNZ R5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71H;;;;;;;;;;结束标志;;;;;;;;;;END7、C语言源程序#includeunsigned 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: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: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;{ 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;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、注意事项在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。
4×4矩阵键盘在单片机中的应用(Proteus)
![4×4矩阵键盘在单片机中的应用(Proteus)](https://img.taocdn.com/s3/m/836dd34e581b6bd97f19eaca.png)
4×4矩阵键盘原理及其在单片机中的简单应用基于Proteus仿真1、4×4矩阵键盘的工作原理如下图所示,4×4矩阵键盘由4条行线和4条列线组成,行线接P3.0-P3.3,列线接P3.4-P3.7,按键位于每条行线和列线的交叉点上。
按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。
第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。
当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。
第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。
第三步,将第一步得到的列码和第二步得到的行码拼合成被按键的位置码,即Y0Y1Y2Y3X0X1X2X3(因为行线和列线各有一条为低电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。
当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y0Y1Y2Y3X0X1X2X3为0111 0111,即0X77。
当5键按下时,行线X1和列线Y1为低电平,其余行列线为高电平,于是可得到5键的位置码Y0Y1Y2Y3X0X1X2X3为1011 1011,即0XBB。
全部矩阵键盘的位置码如下:2、4×4矩阵键盘在单片机的简单应用举例(一)如下图所示,运行程序时,按下任一按键,数码管会显示它在矩阵键盘上的序号0~F,并且蜂鸣器发出声音,模拟按键的声音。
此处采用线反转法识别按键。
C程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit buzzer=P1^0;uchar code dis[]= //0~9,A~F的共阳显示代码{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E};uchar code tab[]= //矩阵键盘按键位置码{0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};void delay(uint x) //延时函数{uchar i;while(x--)for(i=0;i<120;i++);}uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;P3=0XF0; //P3口输出11110000a=P3; //读取列码delay(10); //防抖延时10msP3=0X0F; //P3口输出00001111b=P3; //读取行码c=a+b; //得到位置码for(i=0;i<16;i++)if(c==tab[i])return i; //查表得到按键序号并返回return -1; //无按键,则返回-1}void beep() //蜂鸣器发出声音,模拟按键的声音{ uchar i;for(i=0;i<100;i++){buzzer=~buzzer;delay(1);}buzzer=0;}void main(){uchar key;buzzer=0; //关闭蜂鸣器while(1){key=scan(); //得到按键号if(key!=-1) //有按键则显示,并且蜂鸣器发出声音{P0=dis[key];beep();delay(100);}}}Proteus仿真运行结果如下:3、4×4矩阵键盘在单片机的简单应用举例(二)如下图所示,运行程序时,按下的按键键值越大,点亮的LED灯越多,例如,按下1号键时,点亮一只LED灯,按下2号键时,点亮两只LED灯,按下16号键时,点亮全部LED 灯。
基于单片机4X4矩阵键盘控制数码管显示的Proteus仿真
![基于单片机4X4矩阵键盘控制数码管显示的Proteus仿真](https://img.taocdn.com/s3/m/42ac9d6602768e9951e738b2.png)
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
21 22 23 24 25 26 27 P2.6 28 P2.7
10 11 12 13 14 15 16 17
K0
K1
K4
K5
K8
K9
KC
KD
图 3-2:当按下 K4 键时,数码管显示数字‘4’
软件设计方面,我感觉到在编写循环嵌套程序时非常容易出错,需要反复的查错 和耐心的调试。我虽然能够编写出程序,其可读性却有待于提高。
经过这次仿真设计,我对 51 系统的单片机内部构造的了解认识有了一定程度的提 高。我体会到做设计是一项细致的工作,必须要投入时间及精力,要有耐心有韧性。
我相信这几次的仿真设计会为我以后的发展打下一定的基础,我会更加努力,争取 自己在单片机的开发上有更深层次的提高,与此同时经过此次仿真,锻炼了团队协作 能力。
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
21 22 23 24 25 26 27 P2.6 28 P2.7
10 11 12 13 14 15 16 17
K0
K1
K2
K3
K4
单片机 矩阵键盘实验 实验报告
![单片机 矩阵键盘实验 实验报告](https://img.taocdn.com/s3/m/a3169936b42acfc789eb172ded630b1c58ee9b56.png)
单片机矩阵键盘实验实验报告
实验名称:单片机矩阵键盘实验
实验目的:掌握单片机矩阵键盘的原理和应用,能够使用单片机按键输入
实验内容:利用Keil C51软件,采用AT89C51单片机实现一个4x4的矩阵键盘,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。
实验步骤:
1、搭建实验电路,将矩阵键盘与单片机相连,连接好电源正负极,然后将电路焊接成一个完整的矩阵键盘输入电路。
2、打开Keil C51软件,新建一个单片机应用工程,然后编写代码。
3、通过代码实现对矩阵键盘输入的扫描功能,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。
4、编译代码,生成HEX文件,下载HEX文件到单片机中,将单片机与电源相连,然后就可以测试了。
5、测试完成后,根据测试结果修改代码,重新编译生成HEX 文件,然后下载到单片机中进行验证。
实验结果:
经过测试,实验结果良好,能够准确地输入按键的值,显示在液晶屏上。
实验感想:
通过这次实验,我深深地认识到了矩阵键盘技术的重要性以及应用价值,同时也更加深入了解单片机的工作原理和应用技术,这对我的学习和工作都有很好的帮助。
4×4矩阵按键模拟编程及控制仿真(汇编+C语言)
![4×4矩阵按键模拟编程及控制仿真(汇编+C语言)](https://img.taocdn.com/s3/m/6f2204e1f605cc1755270722192e453611665b40.png)
4×4矩阵按键模拟编程及控制仿真(汇编+C语言)4×4矩阵按键模拟编程及控制仿真(中级实验)实验介绍:利用单片机控制一组矩阵按键(4×4)以及一个数码管,当按键按下后,数码管会显示按下按键的序号。
共16个按键,序号从0开始,一直到F。
(矩阵按键较独立按键更节省I/O口,例如在本例中,共有16个按键,仅仅需要8个I/O 口,而采用独立按键则需要16个I/O 口。
在I/O口使用较多,且按键较多的情况下可以采用。
但是矩阵按键的程序要比独立按键复杂。
)实验目的:通过本次实验,理解矩阵按键的结构以及工作原理。
能够根据使用需求,独立设计矩阵按键的电路图,能够编程实现对矩阵按键的控制。
通过与独立按键的对比,理解矩阵按键与独立按键的硬件及软件的区别。
通过对比的方式,理解各自的优缺点。
仿真原理图:使用Proteus仿真软件搭建仿真原理图如下图所示。
图1图2使用仿真软件Proteus搭建的原理图参考如图1所示。
(注意事项:一般情况下,采用矩阵按键的形式来控制单片机时,按键数量较多,所以在摆放按键的时候要成行成列的防止,一方面是比较美观,另外一方面是便于编程控制。
另外矩阵按键电路比较复杂,电路连线往往比较多,为了让电路看起来更加简洁,可以采用“Terminal Label”的方式进行连线。
如图2所示,电路连接简化很多。
)编程思路:对于独立按键,编程过程较为简单,按照顺序逐个编写就行。
主要分为两种编程控制方法:按键扫描的方式以及中断的方式。
按键扫描的方式需要实时扫描每个按键是否按下。
编程时,首先通过单片机实时判断第一个按键是否按下,如果按下就执行相应的程序。
只要编制出来第一个按键的程序,其他按键的程序基本相同,只要稍作修改即可。
也可以使用中断的方式实现,这种方式一般需要配合外部的电路来实现。
掌握外部中断控制的读者,可以使用。
矩阵按键的编程思路一般为:实时判断按键的按下情况,首先将连接每一行按键的单片机引脚设置为低电平(每一列按键的单片机引脚设置为输入状态即高电平),判断哪一列按键有按下。
基于Proteus软件的4x4矩阵键盘设计与仿真
![基于Proteus软件的4x4矩阵键盘设计与仿真](https://img.taocdn.com/s3/m/6a45676ef12d2af90342e619.png)
基于Proteus软件的4x4矩阵键盘设计与仿真4*4矩阵键盘仿真摘要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。
由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。
单片机系统的开发过程中,程序设计语言的选择尤为重要。
C51提供高效的代码,结构化的编程和丰富的操作符,多被采用。
C51是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能,而且可以直接实现对硬件的控制。
本毕业设计以AT89S51芯片为核心,程序设计采用汇编语言,辅以必要的电路,并运用proteus软件设计了4*4矩阵键盘仿真。
目录前言 (1)第一章单片机的概述.................................................................. 2 1.1什么是单片机.......................................................................................2 1.2MCS-51单片机内部结构............................................................ 2 1.3单片机的应用领域 (3)1.4 AT89C51简介.......................................................................................4 第二章软件的介绍及使用............................................................ 7 2.2 Proteus软件的介绍和使用.................................................................. 7 2.1Keil uVision2软件的介绍和使用............................................................ 9 第三章系统总体设计..................................................................14 3.1 系统原理.......................................................................................... 14 3.2电路组成.......................................................................................... 14 3.2.1键盘部分..........................................................................................14 3.2.2LED显示.......................................................................................... 15 3.2.3晶振电路..........................................................................................16 3.3系统功能和原理图................................................................................. 16 3.3.1实现功能....................................................................................... 16 3.3.2硬件电路原理图.............................................................................. 16 3.4系统与硬件的连接................................................................................. 17 第四章系统软件设计........................................................................... 18 4.1程序流程图.......................................................................................... 18 4.2源程序................................................................................................ 18 第五章程序的编译调试与仿真............................................................... 21 5.1程序的编译 (21)5.2调试与仿真 (22)第六章结束语………………………………………………………………………………24 6.1论文总结…………………………………………………………………………………24 6.2工作展望.............................................................................................24 参考文献 (25)致谢 (25)前言随着人们生活水平的提高,19世纪兴起的数字电路以其先天的便捷、稳定的优点在现代电子技术电路中占有越来越重要的地位。
基于51单片机-STC-4X4矩阵键盘-实验-Proteus仿真-程序
![基于51单片机-STC-4X4矩阵键盘-实验-Proteus仿真-程序](https://img.taocdn.com/s3/m/98107f86da38376baf1faebe.png)
矩阵键盘显示调试实训
一、实训目的
1.学会使用I/O口的基本输入、输出功能。
2.了解矩阵键盘接口技术及编程方法。
二、原理图
图16-1 DA402矩阵键盘模块
三、实训模块
DA001 MCS51主机、DA102六位动态数码管显示、DA402矩阵键盘模块、DA701电源模块。
四、实训步骤
1.用8P扁平数据排线将“DA001 MCS51主机”的P0.0~P0.7(JD1口)、P
2.0~P2.7(JD3口)连接到“DA102 六位动态数码管显示”的A~DP(JD1口)、DIG1~DIG6(JD2口),“DA001 MCS51主机”的P1.0~P1.7(JD2口)连接到“DA402矩阵键盘模块”的JD1口。
2.接上各模块的电源。
3.将仿真器接头插到“DA001 MCS51主机”上的40P仿真接口(J10)中(注意方向)。
4.打开“V系列仿真器集成调试软件”,在软件中打开文件“…\THETDA-3 型实训程序\16 矩阵键盘\矩阵键盘.asm”。
5.将程序下载到仿真器中,全速运行程序。
6.现象:按下“DA402矩阵键盘模块”相应的按键,“DA102 六位动态数码管显示”显示相应数字。
7.也可以将编译生成的可执行文件用ISP烧录器烧录到89S52芯片中运行(ISP烧录器的使用查看附录1)。
单片机矩阵按键实训报告
![单片机矩阵按键实训报告](https://img.taocdn.com/s3/m/6c871a7fcdbff121dd36a32d7375a417866fc12c.png)
一、实训目的1. 理解矩阵键盘的工作原理和电路设计。
2. 掌握矩阵键盘的编程方法,实现按键的检测和响应。
3. 培养实际动手能力和团队协作能力。
二、实训内容1. 矩阵键盘电路设计2. 矩阵键盘编程3. 矩阵键盘应用实例三、实训环境1. 单片机开发板:51单片机开发板2. 矩阵键盘:4x4矩阵键盘3. 编程软件:Keil uVision54. 仿真软件:Proteus四、实训过程1. 矩阵键盘电路设计矩阵键盘由行线和列线组成,通过行列交叉连接的按键阵列实现按键功能。
在4x4矩阵键盘设计中,共有4条行线和4条列线,共16个按键。
电路设计如下:(1)行线连接:将单片机的P1.0至P1.3端口作为行线输出,用于控制行线电平。
(2)列线连接:将单片机的P2.0至P2.3端口作为列线输入,用于检测按键状态。
(3)按键连接:将16个按键分别连接到行线和列线交叉处。
2. 矩阵键盘编程(1)初始化:设置P1端口为输出模式,P2端口为输入模式。
(2)按键检测:通过逐行扫描的方式检测按键状态。
首先将P1端口的所有行线设置为低电平,然后逐行检查P2端口列线的状态,如果某列线为低电平,则表示该行对应列的按键被按下。
(3)消抖处理:为了避免按键抖动引起的误读,需要进行消抖处理。
通常采用软件消抖方法,即在检测到按键按下后,延时一段时间(如10ms)再次检测按键状态,如果按键仍然被按下,则确认按键操作有效。
(4)按键处理:根据检测到的按键,执行相应的操作。
例如,当按键按下时,在LCD1602显示屏上显示对应的按键值。
3. 矩阵键盘应用实例以LCD1602显示屏为例,实现按键与显示内容的关联。
(1)LCD1602显示屏初始化:设置LCD1602的显示模式、光标位置等。
(2)按键扫描:按照上述方法检测按键状态。
(3)按键处理:根据按键值,在LCD1602显示屏上显示对应的字符。
五、实训结果1. 成功设计并实现了4x4矩阵键盘电路。
2. 编写了矩阵键盘的检测和响应程序,实现了按键的检测和消抖处理。
4×4矩阵键盘原理及其在单片机中的简单应用(基Proteus仿真)
![4×4矩阵键盘原理及其在单片机中的简单应用(基Proteus仿真)](https://img.taocdn.com/s3/m/77915984a0116c175f0e4850.png)
4×4矩阵键盘原理及其在单片机中的简单应用基于Proteus仿真1、4×4矩阵键盘的工作原理如下图所示,4×4矩阵键盘由4条行线和4条列线组成,行线接P3.0-P3.3,列线接P3.4-P3.7,按键位于每条行线和列线的交叉点上。
按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。
第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。
当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。
第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。
第三步,将第一步得到的列码和第二步得到的行码拼合成被按键的位置码,即Y0Y1Y2Y3X0X1X2X3(因为行线和列线各有一条为低电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。
也就是说,当某个键按下时,该键两端所对应的行线和列线为低电平,其余行线和列线为高电平。
比如,当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y0Y1Y2Y3X0X1X2X3为01110111,即0X77。
当5键按下时,行线X1和列线Y1为低电平,其余行列线为高电平,于是可得到5键的位置码Y0Y1Y2Y3X0X1X2X3为10111011,即0XBB。
全部矩阵键盘的位置码如下:2、4×4矩阵键盘在单片机的简单应用举例(一)如下图所示,运行程序时,按下任一按键,数码管会显示它在矩阵键盘上的序号0~F,并且蜂鸣器发出声音,模拟按键的声音。
此处采用线反转法识别按键。
C程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit buzzer=P1^0;uchar code dis[]= //0~9,A~F的共阳显示代码{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E};uchar code tab[]= //矩阵键盘按键位置码{0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};void delay(uint x) //延时函数{uchar i;while(x--)for(i=0;i<120;i++);}uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;P3=0XF0; //P3口输出11110000a=P3; //读取列码delay(10); //防抖延时10msP3=0X0F; //P3口输出00001111b=P3; //读取行码c=a+b; //得到位置码for(i=0;i<16;i++)if(c==tab[i])return i; //查表得到按键序号并返回return -1; //无按键,则返回-1}void beep() //蜂鸣器发出声音,模拟按键的声音{ uchar i;for(i=0;i<100;i++){buzzer=~buzzer;delay(1);}buzzer=0;}void main(){uchar key;buzzer=0; //关闭蜂鸣器while(1){key=scan(); //得到按键号if(key!=-1) //有按键则显示,并且蜂鸣器发出声音{P0=dis[key];beep();delay(100);}}}Proteus仿真运行结果如下:3、4×4矩阵键盘在单片机的简单应用举例(二)如下图所示,运行程序时,按下的按键键值越大,点亮的LED灯越多,例如,按下1号键时,点亮一只LED灯,按下2号键时,点亮两只LED灯,按下16号键时,点亮全部LED 灯。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
(单片机原理和应用)
题目名称4x4矩阵式键盘
专业班级
学生姓名
学号
指导教师
4x4矩阵式键盘的设计与仿真
1、设计原理:
1.1 矩阵式键盘工作原理
矩阵式键盘使用于按键数量较多的场合,它由行线与列线组成,按键位于行、列的交叉点上,行、列线分别列接到按键开关的两端。
行线通过上拉电阻接到+5V上。
无键按下时,行线处于低电平状态,而当有按键按下时,行线电平状态将由与此行线相连的列线电平一样为高电平。
这是识别矩阵键盘按键是否被按下的关键所在。
一个4x4的行列可以构成一个16按键的键盘。
本次以扫描法来识别按键。
在扫描法中分两步处理按键,首先是判断有无键按下,让所有的列线置高电平,检查各行线电平是否有变化,如行线有一个为高,则有键按下。
当判断有键按下时,使列线依次变低,其余各列为高电平,读行线,进而判断出具体哪个键被按下。
下表为7段共阴极段码表:
显示字符共阴极段码显示字符共阴极段码
“0”3FH “8”7FH
“1”06H “9”6FH
“2”5BH “A”77H
“3”4FH “b”7CH
“4”66H “C”39H
“5”6DH “d”5EH
“6”7DH “E”79H
“7”07H “F”71H
“灭“00H
1.2 实验环境
Keil uVision3
proteus 7
1.3 功能设计描述
由4x4组成16个按钮矩阵式键盘
按键成功会在7段LED显示该按键的键号
1.4 主要知识点
Keil uVision3的使用及调试
proteus 7的使用及调试
键盘接口、LED 显示接口、模拟电路的相关知识
2、实现及编程
2.1
2.2电路原理图
2.3程序内容
4x4行列式键盘识别
7段数码管输出
2.4 汇编源程序
LINE EQU 30H
ROW EQU 31H
VAL EQU 32H
ORG 00H
START: MOV DPTR,#TABLE ;段码表首地址
MOV P2,#00H ;数码管显示初始化
LSCAN: MOV P3,#0F0H ;电平,行线置低电平
L1: JNB P3.0,L2 ;逐行扫描
LCALL DELAY50ms ;调用延时,消除抖动
JNB P3.0,L2
MOV LINE,#00H ;存行号
LJMP RSCAN
L2: JNB P3.1,L3
LCALL DELAY50ms
JNB P3.1,L3
MOV LINE,#01H
LJMP RSCAN
L3: JNB P3.2,L4
LCALL DELAY50ms
JNB P3.2,L4
MOV LINE,#02H
LJMP RSCAN
L4: JNB P3.3,L1
LCALL DELAY50ms
JNB P3.3,L1
MOV LINE,#03H
RSCAN: MOV P3,#0FH ; 列线置低电平,行线置高电平
C1: JNB P3.4,C2 ;逐列扫描
MOV ROW,#00H ;存列号
LJMP CALCU
C2: JNB P3.5,C3
MOV ROW,#01H
LJMP CALCU
C3: JNB P3.6,C4
MOV ROW,#02H
LJMP CALCU
C4: JNB P3.7,C1
MOV ROW,#03H
CALCU: MOV A,LINE ;根据行号和列号计算键值
MOV B,#04H
MUL AB ;A与B相乘后,高位赋给B,低位赋给A ADD A,ROW
MOV VAL,A ;存键值
MOVC A,@A+DPTR ;要据键值查段码
MOV P2,A ;输出段码显示
LJMP LSCAN
DELAY50ms: MOV R6,#3DH ;延时50ms子程序
Lop: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,Lop
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ; 共阴极LED段码表
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
3、调试及测试
3.1调试
通过按下4x4行列式键盘的按键,并在7段led显示所按下的键值,如按下F后显示如下图:
3.2出现的问题及解决
当在选7段显示数码管时,由于不知道哪个类型是共阴极的,所以就随便选了一个,以至于在运行的时候数码管没有显示,后给换了另一个类型的,即可。
还有就是在运行时,引脚处的蓝色点代表低电平,红色是高电平,那么我觉得灰色的点按解释应该也是高电平,后去网上查,说是灰色的点代表未接入信号或者为三态。
4、课程设计总结
4.0 设计中存在的问题及对策
设计中,由于对器件名称的不熟悉,以至于找到器件比较费时;在编写程序时,不知道如何计算键值,后去网上搜索一些程序来参考。
4.1 在此设计基础上还可以增加的功能及设计思路
可在此基础上,可增加简易电子琴的功能。
可加一个喇叭和一个音乐控制开关,并可加一个内部时钟电路和音乐输出电路。
也可用到调节时钟、抢答器、计算器等。
4.2通过本课程设计的收获及感想
通过本次课程设计,懂得了4x4矩阵式键盘接口的工作原理及其的按键识别方法(扫描法);通过自己动手操作,对于消除抖动和计算显示键值有了更深的理解;也对Keil uVision3的使用及调试和proteus 7的使用及调试有了进一步的了解,至少最基本的懂一些;了解了LED显示接口的原理等的相关知识。
觉得自己本次的课程设计过于简单,实现也不难;但观有些设计,电路图过于复杂,即使参考也不是看的很懂,所以就设计一个简单易懂的。