课程设计-制作单片机的4X4矩阵键盘
- 格式:docx
- 大小:1.88 MB
- 文档页数:27
“电子创新设计与实践”课程期中课题设计报告姓名:张思源,学:20102121026,年级:2010,专业:电信报告内容设计一个4*4矩阵键盘,并编写相关程序摘要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 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIRETIORG 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 SW1ANL 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 DELAY10MSMOV 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,KDMOV COUNT,#3LJMP DKKD: CJNE A,#0DH,KEMOV COUNT,#7LJMP DKKE: CJNE A,#0BH,KFMOV COUNT,#11LJMP 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,#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,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;;;;;;;;;;结束标志;;;;;;;;;;END八、C语言源程序#include<AT89X51.H>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];}}}}参考文献:百度百科。
《单片机原理及应用》课程设计题目:4×4矩阵式键盘与单片机连接与编程专业:测控技术与仪器班级:机电082-1 姓名:学号:指导老师:组员:( 2011.7 .13)目录第1节引言 (2)1.1 4*4矩阵式键盘系统概述 (2)1.2 本设计任务和主要内容 (3)第2节系统主要硬件电路设计 (4)2.1 单片机控制系统原理 (4)2.2 单片机主机系统电路 (5)2.2.1 时钟电路 (8)2.2.2 复位电路 (8)2.2.3 矩阵式键盘电路 (8)2.3 译码显示电路 (9)第3节系统软件设计 (13)3.1 软件流程图 (13)3.2 系统程序设计 (14)第4节结束语 (17)参考文献 (18)第一节引言矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,即时在LED数码管上。
单片机控制的据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。
1.1 4*4矩阵式键盘识别显示系统概述矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。
显示按键信息,既降低了成本,又提高了精确度,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。
并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键,在这种情况下如果用独立式按键的话,显然太浪费I/O端口资源,为了解决这一问题,我们使用矩阵式键盘。
矩阵式键盘简介:矩阵式键盘又称行列键盘,它是用N条I/O线作为行线,N条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为N*N个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
单片机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;}五、讨论和心得。
课程设计报告书设计名称:单片机原理与应用题目:数码管显示4X4矩阵键盘按键号专业:计算机科学与技术日期:2012 年6月 11日一.设计目的:1) 了解单片机系统实现LED动态显示的原理及方法;2) 较为详细了解8051芯片的性能;3) 能够了解到单片机系统的基本原理,了解单片机控制原理;4) 掌握AT89C51程序控制方法;5) 掌握AT89C51 C语言中的设计和学会分析程序,进而能够根据自己的需要编写代码;6) 掌握4X4矩阵式键盘程序识别原理;7) 掌握4X4矩阵式键盘的设计方法;8) 学习键盘的扫描方式和应用程序设计;9) 培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;10) 能够按课程设计的要求编写课程设计报告,能够正确反映设计和实验成果。
二.设计要求与主要内容:设计要求:单片机的P1口P1.0~P1.7连接4X4矩阵键盘,P0口控制一只P0口控制一只数码管,当4×4矩阵键盘中的某一按键按下时,数码管上显示对应的键号。
例如,1号键按下时,数码管显示“1”,二号按下的时候,数码管显示“2”,14号键按下时,数码管显示“E”等等。
主要内容:1)4×4矩阵键盘程序识别原理。
2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线都连接到AT89C51中,通过按键K0~K16,来在数码管显示不同的值。
实验步骤:1) 启动keiuvision3 2)新建工程命名为单片机的C语言设计与应用3)新建文件并另存为C51c.c 4)在SourceGroop1导入文件 5)编写代码,并生成C语言设计与应用.hex文件。
6)在Proteus中设计电路图7) 将keil与Proteus联机调试,记下实验记录,得出实验结果。
三.设计程序原理:(包含仿真图和流程图)1)主程序流程图2)程序流程图 若无按键按下若无按键按下若无按键按下若无按键按下结束,返回3)仿真图四.程序代码#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};sbit BEEP=P3^7;//上次按键和当前按键的序号,该矩阵中序号范围 0~15,16 表示无按键uchar Pre_KeyNo=16,KeyNo=16;//延时void DelayMS(uint x){ uchar i;while(x--) for(i=0;i<120;i++);}//矩阵键盘扫描void Keys_Scan(){ uchar Tmp;P1=0x0f; //高 4 位置 0,放入 4 行DelayMS(1);Tmp=P1^0x0f; //按键后 0f 变成 0000XXXX,X 中一个为 0,3 个仍为1,通过异或把3个1变为 0,唯一的0变为1switch(Tmp) //判断按键发生于 0~3 列的哪一列{ case 1: KeyNo=0;break;case 2: KeyNo=1;break;case 4: KeyNo=2;break;case 8: KeyNo=3;break;default:KeyNo=16; //无键按下}P1=0xf0; //低 4 位置 0,放入 4 列DelayMS(1);Tmp=P1>>4^0x0f; //按键后 f0 变成 XXXX0000,X 中有 1 个为 0,三个仍为 1;高4位转移到低 4 位并异或得到改变的值switch(Tmp) //对 0~3 行分别附加起始值 0,4,8,12{case 1: KeyNo+=0;break;case 2: KeyNo+=4;break;case 4: KeyNo+=8;break;case 8: KeyNo+=12;}}//蜂鸣器void Beep(){uchar i;for(i=0;i<100;i++){ DelayMS(1);BEEP=~BEEP;}BEEP=0; }//主程序void main(){ P0=0x00;BEEP=0;while(1){ P1=0xf0;if(P1!=0xf0) Keys_Scan(); //获取键序号if(Pre_KeyNo!=KeyNo){ P0=~ DSY_CODE[KeyNo];Beep();Pre_KeyNo=KeyNo;}DelayMS(100);} }五.实验结果:当按键按下k0,显示管显示0,当按键按下k1时显示1,显示管可以显示1,2,3,4,5,6,7,8,9,A,B,C,D,F.六.实验体会:这次的实验提高了我的设计能力与对电路的分析能力。
西华大学课程设计说明书题目4×4 矩阵键盘计算器设计系(部) 电气信息学院专业(班级) 自动化3班姓名学号指导教师胡红平起止日期2012.6.10-2012.6.30计算机接口及应用课程设计任务书系(部):电气信息学院专业:09自动化指导教师:日期:2012-6-20西华大学课程设计鉴定表摘要近几年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面的知识是不够的,还应根据具体硬件结合,加以完善。
本任务是个简易得三位数的减法运算,用4×4 矩阵键盘及计算器设计,利用数码管实现255内的减法运算。
程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不完善,限制也较多。
本任务重在设计构思与团队合作,使得我们用专业知识,专业技能分析和解决问题全面系统的锻炼。
关键词:单片机,AT89C51,矩阵键盘,数码管ABSTRACTIn recent years, along with the rapid development of science and technology, the application of SCM is unceasingly thorough, it causes the traditional control test technology increasingly updates. In real-time detection and automatic control of single-chip microcomputer application system, often as a core component to use, only microcontroller aspects of knowledge is not enough, should according to specific hardware combined, and perfects.This task is a simple three digits, subtract with 4 * 4 matrix keyboard and a calculator design, use digital tube realization within the 255 subtract. Program is according to the teaching material and within the network reference and compiled program, on the function is not perfect, restrictions also more. This task focuses on design conception and team cooperation, make us with professional knowledge, professional skills to analyze and solve problems of full system exercise.Keywords:Single-chip,AT89C51,Matrix keyboard,digital tube目录摘要 (I)ABSTRACT (II)第1章课题概述 (1)1.1 课题概述 (1)1.2 课题要求 (2)第2章系统设计 (3)2.1 设计思路 (3)2.2 框图设计 (3)2.3 知识点 (3)2.4 硬件设计 (4)2.4.1 电路原理图 (4)2.4.2 元件选择 (5)2.4.3 PCB制版及效果 (9)2.5 软件设计 (10)2.5.1 程序流程图 (10)2.6 系统仿真及调试 (11)2.6.1 硬件调试 (11)2.6.2 软件调试 (11)2.6.3 软硬件调试 (11)结论 (11)参考文献 (14)附录 (15)第1章课题概述1.1 课题概述随着当今时代的电子领域的发展,尤其是自动化的控制领域,传统的分立元件或数字逻辑电路构成的控制系统正被智能化的单片机所取代。
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拨上去。
目录1 引言 (2)2 4×4矩阵键盘控制LED工作原理及软硬件设计、仿真调试 (2)2.1 4×4矩阵式键盘识别显示系统概述 (2)2.2 4×4矩阵式键盘原理 (3)2.3 4×4矩阵式键盘控制LED显示方法 (3)2.4 电路设计及电路图 (3)2.5 4×4矩阵式键盘软件编程 (6)2.6 4×4矩阵式键盘软件仿真调试分析 (9)3 结论 (10)4参考文献 (10)1 引言随着现代科技日新月异的发展,作为新兴产业,单片机的应用越来越广。
单片机以其体积小、重量轻、功能强大、功耗低等特点而备受青睐。
键盘作为一种最为普遍的输入工具在单片机项目应用上显得尤为重要。
用MCS51系列的单片机并行口P1接4×4矩阵键盘,以P1.0-P1.3 作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的0-F序号。
2 4×4矩阵键盘控制LED工作原理及软硬件设计、仿真调试2.1 4×4矩阵式键盘识别显示系统概述矩阵式键盘模式以4个端口连接控制4*4个按键,实时在LED数码管上显示按键信息。
显示按键信息,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。
矩阵式键盘简介:矩阵式键盘又称行列键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4*4个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
最常见的键盘布局如图1所示。
一般由16个按键组成,在单片机中正好可以用一个P 口实现16个按键功能,这也是在单片机系统中最常用的形式,本设计就采用这个键盘模式。
2.2 4×4矩阵式键盘原理在占用相同的I/O端口的情况下,行列式键盘的接法会比独立式接法允许的按键数量多。
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拨上去。
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矩阵式键盘识别显示电路的设计专业:电子信息工程班级:电信061班*名:***学号:********指导老师:***成绩:( 2008.12 )目录第1节引言 (2)1.1 4*4矩阵式键盘系统概述 (2)1.2 本设计任务和主要内容 (3)第2节系统主要硬件电路设计 (4)2.1 单片机控制系统原理 (4)2.2 单片机主机系统电路 (5)2.2.1 时钟电路 (4)2.2.2 复位电路 (5)2.2.3 矩阵式键盘电路 (5)2.3 译码显示电路 (6)第3节系统软件设计 (11)3.1 软件流程图 (8)3.2 系统程序设计 (9)第4节结束语 (12)参考文献 (13)4*4矩阵式键盘识别显示电路的设计数理与信息工程学院电信061 姜铮铮指导教师:余水宝第一节引言矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,即时在LED数码管上。
单片机控制的据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。
4*4矩阵式键盘采用AT89S51单片机为核心,主要由矩阵式键盘电路、译码电路、显示电路等组成,软件选用汇编语言编程。
单片机将检测到的按键信号转换成数字量,显示于LED显示器上。
该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。
1.1 4*4矩阵式键盘识别显示系统概述矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。
显示按键信息,既降低了成本,又提高了精确度,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。
并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键,在这种情况下如果用独立式按键的话,显然太浪费I/O端口资源,为了解决这一问题,我们使用矩阵式键盘。