矩阵键盘显示,六位数码管滚动显示

合集下载

在数码管上动态显示矩阵键盘数字

在数码管上动态显示矩阵键盘数字

/**********************************************程序功能:在数码管上动态显示矩阵键盘数字***********************************************/#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define LED_IN_USE 8//共阴极数码管7位段码:0--fuchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar led_Buf[LED_IN_USE]; // LED显示缓冲区,// 存放要显示数据uchar led_Ctrl;//记录显示位数的全局变量uchar key_Pressed; //按键是否被按下:1--是,0--否uchar key_val; //存放键值uchar key_Flag; //按键是否已放开:1--是,0--否//设置键盘逻辑键值与程序计算键值的映射uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};uchar Dispbuf[2];/******************************************************* * 模块初始化*******************************************************/ void init_LED(void){//uchar tmpv;P5DIR = 0xff; //设置P5的IO方向为输出P3DIR |= 0x18; //设置P3.3 P3.4的IO方向为输出P3OUT &= 0xe7;//设置P3.3 P3.4为0,关闭两锁存器P5OUT = 0x00;//设置P5的输出初值led_Ctrl = 0; // led_Ctrl用于控制哪个LED可显示//for(tmpv=0;tmpv<LED_IN_USE;tmpv++)//{ // 初始化缓冲区,可放入主函数//led_Buf[tmpv] = 0;// }}void led_Display(){//P5DIR = 0xff; //设置P5的IO方向为输出//P3DIR |= 0x18; //设置P3.3 P3.4的IO方向为输出//P3OUT &= 0xe7;//设置P3.3 P3.4为0,关闭两锁存器//P5OUT = 0x00;//设置P5的输出初值P5OUT = scandata[Dispbuf[led_Ctrl]]; // 设置显示值P3OUT |= 0x10; // 打开数据锁存器P3OUT &= 0xef; // 关闭数据锁存P5OUT = ~(1 << (led_Ctrl)); // 设置哪只LED显示P3OUT |= 0x08; // 打开控制锁存P3OUT &= 0xf7; // 关闭控制锁存led_Ctrl++;if(led_Ctrl == 2) led_Ctrl = 0; // 设置下一个要显示的LED}/*******************************************函数名称:Init_Keypad功能:初始化扫描键盘的IO端口参数:无返回值:无********************************************/void Init_Keypad(void){P1DIR = 0xf0; //P1.0~P1.3设置为输入状态, P1.4~P1.7设置为输出状态P1OUT |= 0xf0; // P1.4~P1.7输出高电平key_Flag = 0;key_Pressed = 0;key_val = 0;}/********************************************** Check_Key(),检查按键,确认键值*********************************************//*******************************************函数名称:Check_Key功能:扫描键盘的IO端口,获得键值参数:无返回值:无********************************************/void Check_Key(void){uchar row ,col,tmp1,tmp2;tmp1 = 0x80;for(row = 0;row < 4;row++) //行扫描{P1OUT = 0xf0; //P1.4~P1.7输出全1P1OUT -= tmp1; //P1.4~p1.7输出四位中有一个为0tmp1 >>=1;if ((P1IN & 0x0f) < 0x0f) //是否P1IN的P1.0~P1.3中有一位为0{tmp2 = 0x01; // tmp2用于检测出那一位为0for(col = 0;col < 4;col++) // 列检测{if((P1IN & tmp2) == 0x00) // 是否是该列,等于0为是{key_val = key_Map[row * 4 + col]; // 获取键值return; // 退出循环}tmp2 <<= 1; // tmp2左移1位}}}}/*******************************************函数名称:delay功能:延时约15ms,完成消抖功能参数:无返回值:无********************************************/void delay(){uint tmp;for(tmp = 12000;tmp > 0;tmp--);}/*******************************************函数名称:Key_Event功能:检测按键,并获取键值参数:无返回值:无********************************************/void Key_Event(void){uchar tmp;P1OUT &= 0x00; // 设置P1OUT全为0,等待按键输入tmp = P1IN; // 获取p1INif ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下{key_Pressed = 1; // 如果有按键按下,设置key_Pressed标识delay(); //消除抖动Check_Key(); // 调用check_Key(),获取键值}else if ((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放{key_Pressed = 0; // 清除key_Pressed标识key_Flag = 1; // 设置key_Flag标识}else{_NOP();}}/********************主函数********************/void main(void){WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次IE1 |= WDTIE; // 使能看门狗中断init_LED();_EINT(); //打开全局中断Init_Keypad();while(1){Key_Event();if(key_Flag == 1){key_Flag = 0;Dispbuf[0] = key_val / 10;Dispbuf[1] = key_val % 10;}}// _BIS_SR(GIE);//_BIS_SR(LPM3_bits + GIE); //CPU进入LPM3低功耗模式,同时打开全局中断//_BIS_SR(CPUOFF+ GIE); //进入LPM0//_BIS_SR(LPM0_bits + GIE); //进入LPM0 }/*******************************************函数名称:watchdog_timer功能:看门狗中断服务函数,在这里输出数码管的段选和位选信号参数:无返回值:无********************************************/#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){led_Display();}。

G2一体化实验板:矩阵键盘和数码管显示

G2一体化实验板:矩阵键盘和数码管显示

G2一体化实验板:矩阵键盘和数码管显示一、实验目的(1)掌握如何用数码管显示数值或者某些字符;(2)掌握矩阵键盘的使用方法。

二、实验设备G2一体化实验板。

三、实验内容及步骤1、基础实验—检测程序功能:按下某个按键,则数码管会显示对应的数值,即若按下按键Ki(i取值为0~15),在数码管上显示数值i,如若K0按下,则在数码管上显示数字0,若K15按下,则在数码管上显示数字15等。

各个按键的具体定义见下图1:图步骤:(1)将msp430LaunchPad(芯片型号为G2433)插到实验板主板上;(2)将矩阵键盘和数码管部分的四个跳线帽连上,这四个跳线帽对应的IO口分别是P2.3、P2.5、P2.6和P2.7;(3)确保P2.3、P2.5、P2.6和P2.7这4个IO口不被其他部分的电路使用,即是断开这几个IO口与其他部分电路连接的跳线帽;(4)按下主板上的电源开关;(5)用USB线连接msp430LaunchPad和电脑;(6)打开下载软件并添加所给例程,并下载该程序(在下载之前先进行相关设置);(7)下载完毕后,退出软件下载模式,即可在矩阵键盘和数码管模块上实现上述功能(注意:在此之前一定先按几下msp430LaunchPad上的复位键RESET)。

2、拓展实验——简易计算器功能:实现4位(由于数码管只有4位)非负整数的四则运算,即加、减、乘和除法。

各个按键的具体定义见下图2:图2 计算器键盘盘面说明:(1)由于数码管的显示能力有限,所以当按下加号键“+”时,在数码管上并非显示“+”,而是在第0位的数码管上显示“”以表示加号;当按下乘号键“×”时,在数码管上并非显示“×”,而是在第0位数码管上显示以“”表示乘号;当按下除号键“÷”时,在数码管上并非显示“÷”,而是在第0位数码管上显示以“”表示除号;按下减号键“-”时,在第0位数码管上显示“-”以表示减号。

(2)若除数为0,则数码管显示E1;若被减数小于减数,则数码管显示E2;若计算结果超出显示范围(由于是4位数码管,故可显示的最大数值为9999),数码管显示E3。

4X4矩阵键盘控制数码管显示按键值

4X4矩阵键盘控制数码管显示按键值

4X4矩阵键盘控制数码管显示按键值4X4矩阵键盘控制数码管显示按键值一、设计内容与要求用80C51单片机控制系统显示按键值0~F。

二、设计目的意义2.1 设计目的1、了解单片机系统中实现LED动态显示的原理及方法;2、详细了解8051芯片的性能及编程方法;3、了解单片机系统基本原理,了解单片机控制原理;4、掌握AT89C51输入/输出接口电路设计方法;5、掌握AT89C51程序控制方法;6、掌握单片机汇编编程技术中的设计和分析方法;7、掌握使用PROTEUS软件进行仿真的方法。

8、学会使用并熟练掌握电路绘制软件Protel99SE;9、掌握电路图绘制及PCB图布线技巧。

2.2 设计意义1、在系统掌握单片机相应基础知识的前提下,熟悉单片机应用系统的设计方法及系统设计的基本步骤。

2、完成所需单片机应用系统原理图设计绘制的基础上完成系统的电路图设计。

3、完成系统所需的硬件设计制作,在提高实际动手能力的基础上进一步巩固所学知识。

4、进行题目要求功能基础上的软件程序编程,会用相应软件进行程序调试和测试工作。

5、用AT89C51设计出题目所要求的数码管动态循环显示,并针对实际设计过程中软、硬件设计方面出现的问题提出相应解决办法。

6、通过单片机应用系统的设计将所学的知识融会贯通,锻炼独立设计、制作和调试单片机应用系统的能力;领会单片机应用系统的软、硬件调试方法和系统的研制开发过程,为进一步的科研实践活动打下坚实的基础。

三、系统硬件电路图3.1 Proteus软件简介以及仿真电路图Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、1ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。

单片机入门-矩阵键盘控制数码管显示

单片机入门-矩阵键盘控制数码管显示

} } }
t=P2; t=t&0xf0;
单片机晶振复位电路:
锁存器、上拉电阻:
4x4矩阵键盘:
代码实现:
void key44scan(void)//键盘扫描函数 {
uint t; P2=0xfe; t=P2; t=t&0xf0; if(t!=0xf0) {
delay(); t=P2;
switch(t) {
case 0xee:keynum=1; break; case 0xde:keynum=5; break; case 0xbe:keynum=9; break; case 0x7e:keynum=13; break; } P0=table[keynum]; while(t!=0xf0) { t=P2; t=t&0xf0; } }
t=P2; t=t&0xf0; } }
P2=0xf7; t=P2; t=t&0xf0; if(t!=0xf0) {
delay(); t=P2;
switch(t) {
case 0xe7:keynum=4; break; case 0xd7:keynum=8; break; case 0xb7:keynum=12; break; case 0x77:keynum=0; break; } P0=table[keynum]; while(t!=0xf0) {
} P0=table[keynum]; while(t!=0xf0) {
t=P2; t=t&0xf0; } }
P2=0xfb; t=P2; t=t&0xf0; if(t!=0xf0) {
delay(); t=P2;
switch(t) {
case 0xeb:keynum=3; break; case 0xdb:keynum=7; break; case 0xbb:keynum=11; break; case 0x7b:keynum=15; break; } P0=table[keynum]; while(t!=0xf0) {

单片机实验报告——矩阵键盘数码管显示

单片机实验报告——矩阵键盘数码管显示

单片机实验报告信息处理实验实验二矩阵键盘专业:电气工程及其自动化指导老师:***组员:明洪开张鸿伟张谦赵智奇学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日矩阵键盘一、实验内容1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。

按其它键没有结果。

二、实验目的1、学习独立式按键的查询识别方法。

2、非编码矩阵键盘的行反转法识别方法。

3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。

4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。

5、掌握利用Keil51软件对程序进行编译。

6、会根据实际功能,正确选择单片机功能接线,编制正确程序。

对实验结果能做出分析和解释,能写出符合规格的实验报告。

三、实验原理1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。

2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。

3、识别键的闭合,通常采用行扫描法和行反转法。

行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。

行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。

然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。

这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。

由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。

矩阵键盘 数码管显示

矩阵键盘 数码管显示

/****************************************************************************** **** 【函数功能】:矩阵键盘数码管显示* 【晶振】: 11.0592M* 【使用说明】:依次按下矩阵键盘的16个按键数码管上会显示1-16数字使用usb下载时,矩阵键盘B2按键会受到影响解决办法:取下下载选择2个红色短路帽即可******************************************************************************* ***//*预处理命令*/#include<reg52.h> //包含单片机寄存器的头文件#define uchar unsigned char#define uint unsigned int/* 函数申明-----------------------------------------------*/void delay(uint z);uint scan(void);void send595(uchar dat);void out595(void);void disp(uchar w,uchar d);void dispoff(void);/* 变量定义-----------------------------------------------*/sbit MOSIO=P2^2;sbit R_CLKa=P2^3;sbit S_CLKa=P2^4;uchar code duan[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};//此表为LED数码管段选字模uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //此表为LED数码管位选字模uchar num_key; //扫描按键计数uint num;/******************************************************************************** *** 函数名称:main(void)** 函数功能:主函数******************************************************************************* **/void main(){uint shi,ge;uint numb;while(1){ dispoff();numb=scan(); //调用键盘扫描if(numb<10){disp(6,0);delay(8);disp(7,numb);delay(8);}else{shi=numb/10;ge=numb%10;disp(6,shi);delay(8);disp(7,ge);delay(8);}}}/******************************************************************************** *** 函数名称:delay(uint z)** 函数功能:延时函数******************************************************************************* **/void delay(uint z){uint i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}/*********************************************************************************** 函数名称:scan(void)** 函数功能:按键扫描******************************************************************************* **/uint scan(void){uint num;P3=0xf7; //扫描第四排num_key=P3;num_key=num_key&0xf0;if(num_key!=0xf0){delay(5);P3=0xf7; //去抖动num_key=P3;num_key=num_key&0xf0;if(num_key!=0xf0)num_key=num_key|0x07;while(P3 !=0xf7){}}else{P3=0xfb; //扫描第三排num_key=P3;num_key=num_key&0xf0;if(num_key!=0xf0){delay(5);P3=0xfb; //去抖动num_key=P3;num_key=num_key&0xf0;if(num_key!=0xf0)num_key=num_key|0x0b;// while(P3 !=0xfb){}}else{P3=0xfd; //扫描第二排num_key=P3;num_key=num_key&0xf0;if(num_key!=0xf0){delay(5);P3=0xfd; //去抖动num_key=P3;num_key=num_key&0xf0;if(num_key!=0xf0)num_key=num_key|0x0d;// while(P3 !=0xfd){}}else{P3=0xfe; //扫描第一排num_key=P3;num_key=num_key&0xf0;if(num_key!=0xf0){delay(5);P3=0xfe; //去抖动num_key=P3;num_key=num_key&0xf0;if(num_key!=0xf0)num_key=num_key|0x0e;// while(P3 !=0xfe){}}}}}switch(num_key) //键盘扫描值num_key判断,即几号按键被按下{case 0xee :num=1;break; //B1按键case 0xde :num=2;break; //B2按键case 0xbe :num=3;break; //B3按键case 0x7e :num=4;break; //B4按键case 0xed :num=5;break; //B5按键case 0xdd :num=6;break; //B6按键case 0xbd :num=7;break; //B7按键case 0x7d :num=8;break; //B8按键case 0xeb :num=9;break; //B9按键case 0xdb :num=10;break; //B10按键case 0xbb :num=11;break; //B11按键case 0x7b :num=12;break; //B12按键case 0xe7 :num=13;break; //B13按键case 0xd7 :num=14;break; //B14按键case 0xb7 :num=15;break; //B15按键case 0x77 :num=16;break; //B16按键}return num;}/******************************************************************************** *** 函数名称:send595(uchar dat)** 函数功能:数据输入******************************************************************************* **/void send595(uchar dat) //数据输入{uchar i;for(i=0;i<8;i++){if((dat<<i)&0x80)MOSIO=1;else MOSIO=0;S_CLKa=0;S_CLKa=1;}}/******************************************************************************** *** 函数名称:out595** 函数功能:数据输出******************************************************************************* **/void out595(void) // 数据输出{R_CLKa=0;R_CLKa=1; //上升沿}/******************************************************************************** *** 函数名称:disp(uchar w,uchar d)** 函数功能:数码管显示函数******************************************************************************* **/void disp(uchar w,uchar d) //数码管显示函数:w-位码,d-段码{send595(wei[w]);send595(duan[d]);out595();}/******************************************************************************** *** 函数名称:dispoff(void)** 函数功能:关闭共阳数码管******************************************************************************* **/void dispoff(void) //关闭共阳数码管{send595(0);send595(0);out595();send595(0xff);out595();}。

矩阵式键盘与LED显示示例

矩阵式键盘与LED显示示例

开关闭合与断开时的抖动及去抖电路
按键较少时:去抖电路
+5V 理想波形 A 实际波形
按下抖动 无抖动
B 稳定闭合
释放抖动 有抖动
按下时 未按时
+5V
按键较多时:软件延时,通常为10ms
10ms 延时子程序
D_1S: MOV R6,#100 ;1S D10mS: MOV R5,#40 1T+(1T+1T+2*124T)*40 DL:MOV R4,#124 ; 1T / 1T+1T+2*124T NOP ; 1T DJNZ R4,$ ; 2T DJNZ R5,DL ;2T DJNZ R6,D10MS RET 总时间t = 40*(1+(1+1+2*124)*40)T = 10001us =10.001ms
行首号
判断哪行有按键按下子程序
;判断哪行有键按下子程序, ;如果有键按下,则键号F0=1,A为行首号值。否则F0=0; scanrow: CLR F0 MOV P1,#0FH ;置高4位全0,低四位输入 MOV A,P1 ROW0: jb acc.0,ROW1 ;判断第0行是否有按键按下 setb F0 ROW1: jb acc.1,ROW2 ;判断第 mov a,#0 1行是否有按键按下 sjmp RRET setb F0 mov a,#4 sjmp RRET ROW2: jn acc.2,ROW3; 第2行 setb F0 mov a,#8 sjmp RRET ROW3: jb acc.3,RRET ;第3行 setb F0 mov a,#0CH RRET: ret
b
a
com
dp
e d com c dp
com

51单片机数码管显示及矩阵键盘扫描程序

51单片机数码管显示及矩阵键盘扫描程序

51单片机数码管显示及矩阵键盘扫描程序硬件实验十一八段数码管实验一、实验任务1、在静态数码管上轮流显示数字0-9。

2、在两个4位数码管上动态显示数字0-9二、流程图及程序静态显示:流程图:程序代码:#include#define uchar unsigned chucharcodevalue[10]={0xC0,0xF9,0xA4,0xB0,0X99,0x92,0x82,0xF8,0 x80,0x90};//0 -9数码管显示段码void delay(char x) //延时子程序{uchar i;for(i=0;i<200;i++);}main() //主函数{int i;while(1){for(i=0;i<10;i++) //显示0-9{P0=codevalue[i];delay(500); //延时1秒}}}动态显示:#include#includetab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,0x7f,0x6f}; //数码管显示数字字段unsigned char tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//片选字段unsigned char i,k,j,x;void delay(x); //声明延时子函数void main() //主函数{while(1){for(i=0;i<8;i++) //显示0-7{ P1=tab1[i];P0=tab2[i];delay(5); //延时}P1=tab1[8]; P0=tab2[0]; delay(5); //显示8-9P1=tab1[9]; P0=tab2[1]; delay(5);}}void delay(x) //延时函数定义{do{for(j=0;j<250;j++)for(k=0;k<250;k++);}}硬件实验十二矩阵键盘扫描显示一、实验任务1、把矩阵键盘上的按键输入的键码在静态数码管上显示出来。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南京邮电大学课程设计报告设计类别: 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语言三种设计风格,熟悉其芯片硬件实现的过程。

2.实验所用仪器及元器件(1)PC机(2)ALtera CPLD硬件实验开发系统(3)设计软件(Quartus II )3.实验任务要求要求学生设计出4*4矩阵键盘对某一按键按下就在数码管显示一个数字。

按键从左上角到右下角依次为1,2, (16)4. 设计思路首先一个4*4矩阵键盘中有四行四列,先假设键盘自上至下的第一行的四个键分别代表01,02,03,04;第二行四个键分别代表05,06,07,08;第三行四个键分别代表09,10,11,12;第四行分别代表13,14,15,16。

题目的意思是任意按下一个键,输出端会输出相应的数字,而每个键被选中的条件是它的行数和列数被选中,也就是在仿真中可以假设选中的行数和列数是0电平,而其他的行数和列数都是1电平。

所以输入端应是行数与列数,而输出端是两个数码管的显示。

5. 模块分析(1)输入输出解释输入: clk ------时钟信号rst ------清零row ------行线column ------列线输出: dataout1 ------数码管显示数据,个位dataout2 ------数码管显示数据,十位en ------数码管显示使能(2)模块解释PROCESS(clk,rst)BEGINIF (NOT rst = '1') THENkey_code <= "0000";ELSIF(clk'EVENT AND clk='1')THEN --上升沿有效CASE row IS --检测何处有键按下WHEN "1110" =>CASE column ISWHEN "1110" =>key_code <= "0000";WHEN "1101" =>key_code <= "0001";WHEN "1011" =>key_code <= "0010";WHEN "0111" =>key_code <= "0011";WHEN OTHERS =>NULL;END CASE;(……中间省略相同步骤……)WHEN OTHERS =>key_code <= "1111";END CASE;END IF;END PROCESS;(这部分用key_code 这个四位寄存器来代表16个键)PROCESS(key_code)BEGINCASE key_code ISWHEN "0000" =>dataout_tmp1 <= "10011111";dataout_tmp2 <= "00000011";WHEN "0001" =>dataout_tmp1 <= "00100101";dataout_tmp2 <= "00000011";(……中间省略相同部分……)END CASE;END PROCESS;(这部分中,对于相应的key_code值输出相应的数值)6. 逻辑仿真图及功能分析当选中第一行第一列时,输出端的两个数码管显示是01(00000011 10011111)当选中第一行第二列时,输出端的两个数码管显示是02(00000011 00100101)当选中第一行第三列时,输出端的两个数码管显示是03(00000011 00001101)当选中第一行第四列时,输出端的两个数码管显示是04(00000011 10011001)当选中第二行第一列时,输出端的两个数码管显示是05(00000011 01001001)当选中第二行第二列时,输出端的两个数码管显示是06(00000011 01000001)当选中第二行第三列时,输出端的两个数码管显示是07(00000011 00011111)当选中第二行第四列时,输出端的两个数码管显示是08(00000011 00000001)当选中第三行第一列时,输出端的两个数码管显示是09(00000011 00001001)当选中第三行第二列时,输出端的两个数码管显示是10(00000011 00000011)当选中第三行第三列时,输出端的两个数码管显示是11(00000011 00000011)当选中第三行第四列时,输出端的两个数码管显示是12(00000011 00100101)当选中第四行第一列时,输出端的两个数码管显示是13(00000011 00001101)当选中第四行第二列时,输出端的两个数码管显示是14(00000011 10011001)当选中第四行第三列时,输出端的两个数码管显示是15(00000011 01001001)当选中第四行第四列时,输出端的两个数码管显示是16(00000011 01000001)7. 调试过程与问题(1)操作问题:由于我是第一次接触这个软件,在操作时会忘了一些必要的步骤,从而导致系统出现error,不能运行下去,但是多操作几次以后这种问题就可以被解决了。

(2)设计问题:联系实际,矩阵键盘中的row一般设计成输出,然后采用扫描的方法进行数码管的输出。

但在功能仿真的时候出现了只能扫描出1,2,3,4的情况,仔细分析问题后发现,在确定column了以后,扫描都会从第一列开始,所以采用这种方法就只能出现1,2,3,4四个数字,为了使其他的数字也可以在功能仿真的出现,所以我在仿真的时候将row 设计成了输入,以确保每一个数字都有出现的机会。

(3)时延问题:在功能仿真的时候,在除了01这个数字的显示外,每个数字的显示都会出现一小段的时延。

一开始我留意到这个问题时我没有理解,后来我去查看了源代码,然后发现在键盘上的按键按下之前,两个数码管分别默认输出数字是01,如果是按下的是别的键,那么输出的时候会有一定的时延,而它们在真正跳变之前,第一个数码管会显示0,第二个数码管会显示1。

8. 实验总结通过这个设计实验,我学习到了很多知识。

在做这个矩阵键盘的实验设计的过程中,我通过查阅资料和搜集有关的文献,培养了自学能力。

并且由原先的被动的接受知识转化为主动的寻求知识,这可以说是学习方法上的一个很大的突破。

虽然我之前从来没有用过这个软件,也没有接触过VHDL语言,但是我依然可以通过自学,查阅资料和与同学之间讨论交流来做出这个课题,我想将来不管遇到什么样的题目,只要我采用同样的方法和态度,总会可以找到解决的方案的。

相关文档
最新文档