矩阵键盘模块
verilog_矩阵键盘

二、矩阵键盘显示电路设计(显示键盘值的平方)矩阵键盘显示电路的设计一、实验目的1、了解普通4×4 键盘扫描的原理。
2、进一步加深七段码管显示过程的理解。
3、了解对输入/输出端口的定义方法。
二、实验原理实现键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;再就是用软件实现键盘扫描。
作为一个嵌入系统设计人员,总是会关心产品成本。
目前有很多芯片可以用来实现键盘扫描,但是键盘扫描的软件实现方法有助于缩减一个系统的重复开发成本,且只需要很少的CPU 开销。
嵌入式控制器的功能能强,可能充分利用这一资源,这里就介绍一下软键盘的实现方案。
图10-1 简单键盘电路通常在一个键盘中使用了一个瞬时接触开关,并且用如图10-1 所示的简单电路,微处理器可以容易地检测到闭合。
当开关打开时,通过处理器的 I/O 口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的/IO口的输入将被拉低得到逻辑0。
可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的 1或者 0。
尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。
当触点闭合时,其弹起就像一个球。
弹起效果将产生如图10-2所示的好几个脉冲。
弹起的持续时间通常将维持在 5ms∼30ms 之间。
如果需要多个键,则可以将每个开关连接到微处理器上它自己的输入端口。
然而,当开关的数目增加时,这种方法将很快使用完所有的输入端口。
图10-2 按键抖动键盘上阵列这些开关最有效的方法(当需要5个以上的键时)就形成了一个如图10-3 所示的二维矩阵。
当行和列的数目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式(I/O 端被连接的时候),一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。
矩阵所需的键的数目显然根据应用程序而不同。
每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。
图10-3 矩阵键盘键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的 4 行均为高电平,那么肯定没有按键按下,否则,如果读入的4 行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。
密码锁矩阵键盘设计文档

1.工程文件
2.程序文件
3.程序编译
4.RTL图
5.Testbench
6.仿真图整体仿真图
上图仿真过程为先输入1234开锁(默认密码1234),开锁后按下修改键进入修改模式,再输入2537,确认,将密码修改为2537,再关锁。
然后再输入1234,无法开锁,在输入2537,开锁。
矩阵键盘模块仿真
显示模块
上图仿真的是数码管显示模块,4个数码管显示输入的4位密码,每输入1位,密码左移一
次。
密码输入模块
上图为密码输入模块,按键0~9输入密码,每输入1位,密码左移一次。
密码锁控制模块
密码锁控制模块为状态机控制,state信号为当前状态指示,密码正确时led_open输出高电平。
Error_cnt信号为输入密码错误计数。
密码修改模块
在密码修改状态下,输入新的密码并按下确认键,修改密码。
上图为将密码1234修改为2537 报警模块
State为密码锁当前状态,当密码输入连续错误3次,报警,上图仿真输入错误只有1次,无报警。
矩阵键盘

4×4矩阵键盘1.原理说明一般的4*4矩阵键盘(如图1)一般要8个I/O口(如图1),对于按键较多的硬件系统来说是很浪费的I/O口,本方案仅采用4个I/O和4个普通二极管就可以轻松实现4×4矩阵键盘,方案原理与普通4*4矩阵键盘类似,下面先分析普通矩阵键盘原理,再进一步改进为本方案。
原理如下B4口为低电平,A1~A4,B1~B3为高电平,单片机不停的扫描,假若有键按下如A1与B4交叉处按下则对应的A1被拉低为低电平,可以定义此键号为1,同理以此类推B3口为低电平,其余口为高电平,交叉处按键按下可定义其按键号,将按键号存储在寄存器中,可用查表方法并通过数码管显示按键号。
对于下图(图2)用4个I/O和4个普通二极管初始化PA0.0~PA0.3 均为高电平,在这里二极管作用是当IO口为低电平时可以导通,高电平时截止。
程序流程图如下图1图22.程序介绍如下void RCC_Configuration(void);{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_PP _ OUT;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);}GPIOSetBits(){GPIO_SetBits(GPIOA,GPIO_Pin_0);GPIO_SetBits(GPIOA,GPIO_Pin_1);GPIO_SetBits(GPIOA,GPIO_Pin_2);GPIO_SetBits(GPIOA,GPIO_Pin_3);}单片机不停的扫描程序,(右侧四个键单独来写),由于扫描速度是很快(微妙级)的,所以有足够的时间去显示每个按键的。
单片机4×4矩阵键盘设计方案

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拨上去。
基于CPLD的矩阵键盘扫描模块设计

来源:21IC-应用发布时间:2010-12-21 10:26 评论:0条阅读:304次发给好友在基于PC104的便携式野外测试设备的设计中,键盘是常用的输入设备。
对于便携式设备野外工作时,一般使用小型(4x4)矩阵键盘就能满足设备的信息输入需要;室内调试时,使用标准PS2键盘更方便、灵活。
一般的做法是保留PC104的键盘接口用于接标准键盘,利用扩展I/O接口完成小矩阵键盘的扫描和输入。
这样做虽然可以实现设备双键盘同时工作的功能,却需耗费大量的CPU处理时间扫描矩阵键盘,造成CPU处理其他信息的能力下降。
而本文设计的基于CPLD的矩阵键盘扫描模块能够很好地解决上述问题。
1 矩阵键盘扫描原理图1给出了4x4矩阵键盘的电路图,在图1中KX[3..0]为扫描码输入,KY[3..0]为扫描码输出。
键盘扫描开始时,首先置KX[3..0]=“0000”;键盘扫描码寄存器和键盘扫描码缓存器Kreg[15..0]和Kscan[15..0]置成“1111111111111111”(全1为没有键按下,有键按下时至少有一位为O),一旦有键按下,KY[3..0]输出不全为“O”的扫描码触发键盘扫描功能开始键盘扫描,扫描开始后,依次将KX3、KX2、KX1、KX0置“0”,分别将对应的4组KY[3..0]输入值保存于Kscan[15..12]、Kscan[11..8]、Kscan[7..4]、Kscan[3..0]中,而后比较Kscan和Kreg的大小,如果Kscan小于Kreg,将Kscan保存于Kreg中,重复上述扫描过程直到Kscan[15..0]各位输出全为“1”时,说明按下的键全部抬起,Kreg[15..0]中的每一个为“0”的位对应一个按下的键,保留扫描过程中的Kreg最小值就可以处理组合键。
根据记录的Kreg值可以判断是哪个或哪几个键按下,据此编码按键值后输出。
将KX[3..0]置为“0000”,等待下一次按键发生。
矩阵式键盘设计实训报告

一、实验目的1. 掌握矩阵式键盘的工作原理及电路设计方法。
2. 熟悉单片机与矩阵键盘的接口连接及编程技巧。
3. 提高动手实践能力,培养创新意识。
二、实验设备1. 单片机实验平台2. 矩阵键盘模块3. 数字多用表4. 编译器(如Keil51)5. 连接线三、实验原理矩阵键盘是一种常用的键盘设计方式,通过行列交叉点连接按键,从而实现多个按键共用较少的I/O端口。
矩阵键盘通常采用逐行扫描的方式检测按键状态,当检测到按键按下时,根据行列线的电平状态确定按键位置。
四、实验内容1. 矩阵键盘电路设计2. 矩阵键盘编程3. 矩阵键盘测试与调试五、实验步骤1. 电路设计(1)根据矩阵键盘的规格,确定行线和列线的数量。
(2)将行线和列线分别连接到单片机的I/O端口。
(3)在行线上串联电阻,防止按键抖动。
(4)连接电源和地线。
2. 编程(1)初始化单片机的I/O端口,将行线设置为输出,列线设置为输入。
(2)编写逐行扫描程序,逐行拉低行线,读取列线状态。
(3)根据行列线状态判断按键位置,并执行相应的操作。
3. 测试与调试(1)将编写好的程序下载到单片机中。
(2)连接矩阵键盘,观察按键是否正常工作。
(3)使用数字多用表检测行列线电平,确保电路连接正确。
(4)根据测试结果,对程序进行调试,直到矩阵键盘正常工作。
六、实验结果与分析1. 电路连接正确,按键工作正常。
2. 逐行扫描程序能够正确检测按键位置。
3. 按键操作能够触发相应的程序功能。
七、实验总结1. 通过本次实训,掌握了矩阵式键盘的工作原理及电路设计方法。
2. 熟悉了单片机与矩阵键盘的接口连接及编程技巧。
3. 提高了动手实践能力,培养了创新意识。
八、心得体会1. 在实验过程中,遇到了电路连接错误和程序调试困难等问题,通过查阅资料、请教老师和同学,最终成功解决了问题。
2. 本次实训让我深刻体会到理论知识与实际操作相结合的重要性,同时也认识到团队合作的重要性。
九、改进建议1. 在电路设计过程中,可以考虑增加去抖动电路,提高按键稳定性。
矩阵键盘通用模块

通用模块#ifndef _KEY_H_#define _KEY_H_#include<reg52.h>//#include "public.h" 为了让模块变的跟独立这个也不需要//#define uchar unsigned char 外部不需要调用,放在函数内部就可以#define KEY_BUS P2 //这个根据开发板来变;加一个分号导致整个程序错误extern unsigned char key_scan(void); //返回一个无符号字符型变量(0~15),无按键按下返回一个'E'#endif/*********************************************************** 函数功能:** 键盘扫描函数**** 带入参数:** 无**** 带出参数:** 返回键1-15 若无返回'E' **** 其他备注:** 4*4矩阵键盘**** 作者:** 江锟**** 更新时间:** 2017.12.14 ***********************************************************/#include "key.h"#include<intrins.h>//---------------------------------------------------#define uchar unsigned char#define uint unsigned int//---------------------------------------------------/*********************************************************** 函数功能:** 软件延时函数0~65536ms **** 带入参数:** u nsigned int **** 带出参数:** 无**** 其他备注:** 延时0~unsigned int(带入参数)ms **** 作者:** 江锟**** 时间:** 2015.12.14 ***********************************************************/void delay_ms(unsigned int z){int x,y;for(x=0;x<z;x++)for(y=0;y<113;y++);}unsigned char key_scan(void){uchar i,k,key;//uint c;k='E';KEY_BUS=0x0f;if(KEY_BUS!=0x0f)// 这就算是进来了delay_ms(5);if(KEY_BUS!=0x0f)// 抖动检测{KEY_BUS=0xef;for(i=0;i<4;i++)//四次扫描{key=KEY_BUS&0x0f;//屏蔽掉低4位只保留检测回来的位switch(key){case 0x0e: k=i;break;//能记录0-3case 0x0d: k=i+4;break;//能记录4-7case 0x0b: k=i+8;break;//能记录8-11case 0x07: k=i+12;break;//能记录12-15default: ; break;}KEY_BUS=(KEY_BUS<<1)+1;//把P1口的0的位向左移动//_crol_(KEY_BUS,1); 可以用这个代替if(k!='E')break;//检测到按键后退出for循环}KEY_BUS=0xf0;//for(c=0;(c>200)||(P2!=0xf0);c++);// delay_ms(10);//for(c=0;(c>200)||(P2!=0xf0);c++); //这样写可以让单片机检测200次,不至于是一个死循环,有些时候用的到//if(P2==0xf0)//{// return k;//}// else return 20;//有按键按下但没松手,这种情况也可以定义笔记特殊while(P2!=0xf0);delay_ms(40);while(P2!=0xf0);// 一直不松手会进入一个死循环,这样做不好,只要他延时一段时间就好return k;}else return 'E';//没有键按下返回'E' }。
矩阵键盘显示,六位数码管滚动显示

南京邮电大学课程设计报告设计类别: EDA-VHDL专业名称: 通信工程班级学号: B09010504 学生姓名: 张嫣艳基本题 : 矩阵键盘按键的数码管显示综合题 : 数码管学号滚动显示同小组成员:学号:B09010502姓名:沈沁芳指导教师: 王奇、梅中辉、周晓燕、孔凡坤日期:2012年3月5日—3月30日目录一矩阵键盘按键的数码管显示1.实验目的--------------------------------------------------------------------- 3 2.实验所用仪器及元器件----------------------------------------------------3 3.实验任务要求----------------------------------------------------------------34. 设计思路-----------------------------------------------------------------------35. 模块分析-----------------------------------------------------------------------36. 逻辑仿真图及功能分析-----------------------------------------------------47. 调试过程与问题--------------------------------------------------------------88. 实验总结-----------------------------------------------------------------------89. 附录(VHDL源程序)-----------------------------------------------------8二数码管学号滚动显示1.实验目的----------------------------------------------------------------------12 2.实验所用仪器及元器件----------------------------------------------------12 3.实验任务要求----------------------------------------------------------------134. 设计思路----------------------------------------------------------------------135. 模块分析----------------------------------------------------------------------136. 逻辑仿真图及功能分析----------------------------------------------------167. 调试过程与问题-------------------------------------------------------------188. 实验总结----------------------------------------------------------------------189. 附录(VHDL源程序)----------------------------------------------------18一矩阵键盘按键的数码管显示1.实验目的(1).使学生全面了解如何应用该硬件描述语言进行高速集成电路设计;(2).通过软件设计环节与仿真环节使学生熟悉Quartus II设计与仿真环境;(3).通过对基本题、综合题的设计实践,使学生掌握硬件系统设计方法(自底向上或自顶向下),熟悉VHDL语言三种设计风格,熟悉其芯片硬件实现的过程。