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

合集下载

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

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

/**********************************************程序功能:在数码管上动态显示矩阵键盘数字***********************************************/#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、把矩阵键盘上的按键输入的键码在静态数码管上显示出来。

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

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

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

矩阵式键盘控制数码管显示

矩阵式键盘控制数码管显示
完成实训报告十
7
谢谢观赏!
二、工作原理
当扫描开始时, 首先将P1.7列初始值设置为低电平, 即P
3
三、程序流程图 ——主程序
开始
初始化
按键查询
YES
A=FFH?
NO
调用消除抖动子程序转Leabharlann 功能处理程序AAAA 1234
结束
4
四、程序清单
独立式键盘控制灯移动程序.doc
5
五、实验板上测试
观察实验结果并记录: 按下不同按键开关,可以看到P0端口的
实训十一: 矩阵式键盘控制数码管显示
功能说明: 使用4*4矩阵式键盘控制第一个数码
管显示0~F。
1
一、电路图
4条列线的一端分别与单片机P1口中的P1.4、 P1.5、 P1.6. P1.7 相接,另一端通过上拉电阻接到+5V电源上,平时使 列线处于高电平状态;而4条行线的一端分别与P1口中的 P1.0、 P1.1、 P1.2、 P1.3相接。16个按键设置在行、列 2 线交点上。
灯作不同方向的移动或闪烁,说明是在执 行不同功能键的处理程序。 按DL1键,亮灯从右向左移动 按DL2键,亮灯从左向右移动 按DL3键,左边4只灯与右边4只灯交替闪亮 按DL4键,8个灯闪烁
6
码管显示0; 作业布置按下DL2,第二个数
码管显示1; 按下DL3,第三个数 码管显示2; 按下DL4,第四个数 码管显示3 。

矩阵键盘和动态数码管显示

矩阵键盘和动态数码管显示


ONE: 转TWO MOV LJMP TWO: JB MOV LJMP SHR: JB MOV LKP: ADD PUSH
MOV LJMP
A,#0 ;装第0行行值 LKP ;转计算键码 JB ACC.6, TWO ;ACC.6=1,第0行无键闭合,
A,#04H ;装第1行行值 LKP ;转计算键码 ACC.5, THR ;ACC.5=1,第0行无键闭合,转THR A,#08H ;装第2行行值 LKP ;转计算键码 ACC.4,NEXT ;ACC.4=1,第0行无键闭合,转NEXT A,#0CH ;装第3行行值 A,R3 ;计算键码 ACC ;把键码推入堆栈保存
;键仍然闭合,继续延时 ;按键起,键码回送A ;列号加1 ;第0位为0,已经扫描完毕,转KND ;未扫描完,循环右移一位 ;转去扫描下一列

KND:
KS1:
MOV RET
A,#0FFH ;无按键返回码 ;返回
MOV P1, #0FH ;所有列置低电平 MOV A, P1 ;读取P1口状态 CPL A ANL A,#0FH ;屏蔽高4位,保留低4位信息 RET DELAY: MOV R7,#50 ;延时子程序 D1: MOV R6,#100 DJNZ R6,$ DJNZ R7,D1 RET 键盘扫描子程序运行的结果是把键码存放在累加器A中,在主程 序中根据键码进行相应处理。
图13-2 扫描法键盘识别程序流程图

下面是4×4矩阵键盘的扫描法程序清单。如果有键按下,则在累加器A中 返回键码,如果没有键按
KEY: LCALL KS1


;调用判断按键闭合子程序,检查是否有按键 闭合 JNZ LK1 ;A非0,说明有键按下 LJMP KND ;无按键返回 LK1: LCALL DELAY ;有键闭合时延时10ms,去抖动 JNZ LK2 ;延时10ms以后,再次检查是否有按键闭合 AJMP KND ;无按键返回 LK2: MOV R2,# 0F7H ;扫描初值送R2 MOV R3,#00H ;回送初值送R3 LK3: MOV A,R2 MOV P1,A ;扫描初值送P1口 MOV A,P1 ;取回送线状态 JB ACC.7, ONE ;ACC.7=1,第0行无键闭合,转ONE

矩阵键盘按键的数码管显示矩阵,键盘按键的数码管显示

矩阵键盘按键的数码管显示矩阵,键盘按键的数码管显示

一、矩阵键盘按键的数码管显示1.实验目的(1)掌握VHDL语言的语法规范,掌握时序电路描述方法(2)掌握多个数码管动态扫描显示的原理及设计方法2.实验所用仪器及元器件计算机一台实验板一块电源线一根扁平线一根下载线一根3.实验任务要求设计出4*4矩阵键盘对某一按键按下就在数码管显示一个数字。

按键从左上角到右下角依次为1,2, (16)4.实验原理按键模块原理键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的4行均为高电平,那么肯定没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。

同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。

键盘键值的获取:键盘上的每一个按键其实就是一个开关电路,当某键被按下时,该按键的接点会呈现0的状态,反之,未被按下时则呈现逻辑1的状态。

扫描信号由row进入键盘,变化的顺序依次为1110-1101-1011-0111-1110。

每一次扫描一排,依次地周而复始。

例如现在的扫描信号为1011,代表目前正在扫描9,10,11,12这一排的按键,如果这排当中没有按键被按下的话,则由column 读出的值为1111;反之当9这个按键被按下的话,则由column读出的值为1110。

根据上面所述原理,我们可得到各按键的位置与数码关系如表所示:1110 1110 1110 1110 1101 1101 1101 1101row1110 1101 1011 0111 1110 1101 1011 0111 column1 2 3 4 5 6 7 8键值row 1011 1011 1011 1011 0111 0111 0111 0111 column 1110 1101 1011 0111 1110 1101 1011 0111键值9 10 11 12 13 14 15 16动态显示原理为使得输入控制电路简单且易于实现,采用动态扫描的方式实现设计要求。

实验四:矩阵按键与数码管显示

实验四:矩阵按键与数码管显示

switch(P2) { case(0X70): KeyValue=3;break; case(0XB0): KeyValue=2;break; case(0XD0): KeyValue=1;break; case(0XE0): KeyValue=0;break; } //测试行 P2=0X0F; switch(P2) { case(0X07): KeyValue=KeyValue+12;break; case(0X0B): KeyValue=KeyValue+8;break; case(0X0D): KeyValue=KeyValue+4;break; case(0X0E): KeyValue=KeyValue;break; } //此处是流程图中所缺少的部分请尝试理解与运用 while((a<50)&&(P2!=0x0F)) { Delay(1000); a++; } } } return KeyValue; }
图 4 数码管动态显示
实例:
B C D E F G H
RP1
RESPACK-8 P0.0 P0.1 P0.2 P0.3 P0.7 P0.6 P0.5 P0.4 P1.3 P1.2 P1.1 P1.0
C2
100pF
1 1
U1 X1
19 XTAL1 CRYSTAL 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 28 10 11 12 13 14 15 16 17

数码管显示矩阵键盘实验

数码管显示矩阵键盘实验
七段数码管实验实验五七段数码管数码管显示数码管动态显示原理七段数码管显示原理数码管显示电路数码管动态显示单片机数码管显示led数码管显示原理七段数码管动态显示
数码管显示矩阵键盘实验
数码管简介
数码管显示方法 键盘简介 单片机常用的键盘形式 键盘识别及键盘电路
数码管简介
数码管的分类: 按公共端分:共阴数码管、共阳数码管 共阴数码管:数码管七段的负极连在一起 共阳数码管:数码管七段的阳极连在一起
四位数码管
一位数码管
• 内部结构示意图:
g f GND a b a a f e d g b c dp b c d e f g dp a b c d e f g dp +5V
·
e d GND c dp
(a)
(b)
数码管的显示
静态显示方式: 静态显示方式 LED显示器工作方式有两种: 静态显示方式和动态显示方式。静态显示的特 点是每个数码管的段选必须接一个8位数据线 来保持显示的字形码。当送入一次字形码后, 显示字形可一直保持,直到送入新字形码为止。 这种方法的优点是占用CPU时间少,显示便于 监测和控制。缺点是硬件电路比较复杂,成本 较高。
ห้องสมุดไป่ตู้
键盘简介
键盘的分类: 键盘分编码键盘和非编码键盘。键盘上闭 合键的识别由专用的硬件编码器实现,并产生 键编码号或键值的称为编码键盘,如计算机键 盘。 而靠软件编程来识别的称为非编码键盘; 在单片机组成的各种系统中,用的最多的是非 编码键盘。也有用到编码键盘的。
常用键盘的形式
独立键盘: 每一个按键单独占用一个I/O口。 矩阵键盘: 通过行列扫描构成的键盘。 比较: 在按键比较少时,可以选择独立键盘。这种 方法识别简单,但I/O利用率不高。 键盘多时,适宜用矩阵盘,识别须进行行列 扫描

矩阵键盘资料(在实验五十中)

矩阵键盘资料(在实验五十中)

TECHISHINE
有了表 50-2,要写出键盘译码电路的 VHDL 程序就非常容易了,尤其针对有表可以对照
的电路设计,只要使用 CASE-WHEN 或 WHNE-ELSE 语句,便可轻松完成设计。
表 50-2 键盘参数表
SEL2~SEL0 KIN3~KIN0
对应的 键盘译 按键功 按键 码输出 能
010
1101
REG 10010 功能键
1011
C
01100 字母 C
表 50-1 按键位置与数码关系
122
Beijing Techshine Technology Co.
TECHISHINE
SEL2~SEL0 000
KIN3~KIN0 1110 1101 1011
对应的按键 0 6
LAST
0111
CTRL
1110
1
1101
7
001
1011
STEP
0111
EMPTY1
5
1101
B
111
1011
ENTER
0111
NONE
光靠矩阵键盘是无法正确地完成输入工作的,另外还需搭配以下几个电路模块: 1、 时钟产生电路
当一个系统中使用不同操作频率的脉冲波形时,最方便的方法就是利用一个自由计数器 来产生各种频率。本电路中就使用三种不同频率的工作脉冲波形。它们分别是:系统时钟(它 是系统内部所有时钟的提供者,频率最高)、弹跳消除取样信号、键盘扫描信号和七段显示器 扫描信号。在很多的电路设计中,键盘扫描信号和七段显示器扫描信号可以使用相同的时钟 信号,本设计也采用此方法。
Beijing Techshine Technology Co.

矩阵键盘扫描与数码管显示实验结果分析

矩阵键盘扫描与数码管显示实验结果分析

矩阵键盘扫描与数码管显示实验结果分析
矩阵键盘扫描与数码管显示实验是一种常见的数字电路实验。

在这个实验中,我们可以通过按下矩阵键盘上的按键,控制数码管上的数字显示。

实验结果分析主要包括以下几个方面:
1. 矩阵键盘扫描:在实验中按下键盘上的某个按键,可以通过扫描算法检测到按键的位置,并将对应按键的行列信息送入微处理器或控制电路。

分析实验结果时,可以观察是否可以正常检测到按键的位置,并且是否能够正确传递给其他部分的电路或处理器。

2. 数码管显示:通过实验中的控制电路,可以将微处理器或其他控制器输出的数字信号转换成数码管上的对应数字显示。

在分析实验结果时,可以观察数码管是否能够正常显示所期望的数字,并且是否能够响应输入信号的变化。

3. 信号传递与处理:在整个实验电路中,信号的传递和处理是关键部分。

可以分析信号在各个部分的传递过程中是否出现错误或干扰,是否能够实现正确的数据传输和处理。

4. 稳定性和可靠性:实验结果的分析还需要考虑电路的稳定性和可靠性。

即在长时间使用或复杂环境条件下,电路能否保持正常工作,并且不出现意外错误或故障。

总结来说,矩阵键盘扫描与数码管显示实验结果的分析需要关注按键的检测和传递、数码管的正确显示、信号传递与处理等方面,同时也需要考虑电路的稳定性和可靠性。

矩阵按键控制数码管显示

矩阵按键控制数码管显示

定时消抖 Case 0xee; P0口送0 段码 Case 0xed; P0口送1 段码 Case 0x77; …… P0口送F 段码
有键按下?


存储当前P2的状态1 Break P2=0X0F 结束 存储当前P2的状态2
返回(状态1|状态2)
返回0XFF
程序编写
//========================================== //函数名称: keyscan() //函数功能: 检测按键 //入口参数:无 //出口参数:cord_h|cord_1 //备注: //========================================== UINT8 keyscan(void) { INT8 cord_h=0; INT8 cord_1=0; P2=0xf0; if(P2!=0xf0) { delay_ms(10); if(P2!=0xf0) { cord_h=P2; P2=0x0f; cord_1=P2; return(cord_h|cord_1); } } return(0xff); }
在没有按键按下时,即DS2450 的输入量时0,当有丌 同的按键按下时,DS2450 的输入量丌同,微处理器就会 得到丌同的数字量,微处理器根据采集到的数字量可判断 按键情况。
单片机控制的“机电一体化产品”中按键的接口设计 科技咨询,李迚波
键盘扫描子程序一般包括以下内容:
1.判别有无键按下;
2.消除键盘机械抖动;
出线输出为全低电平,则列线中电平由高变低所在列为按
键所在列。
两步即可确定按键所在的行和列,从而识别出所按的键。
采用线反转法的矩阵式键盘
假设键3被按下。
第一步,P1.0~P1.3输出全为“0”,然后,读入 P1.4~P1.7线的状态,结果P1.4=0,而P1.5~P1.7均为 1,因此,第1行出现电平的变化,说明第1行有键按下; 第二步,让P1.4~P1.7输出全为“0”,然后,读入 P1.0~P1.3位,结果P1.0=0,而P1.1~P1.3均为1,因 此第4列出现电平的变化,说明第4列有键按下。

矩阵式键盘控制数码管显示

矩阵式键盘控制数码管显示
矩阵式键盘控制数码 管显示
目录
CONTENTS
• 矩阵式键盘工作原理 • 数码管显示原理 • 矩阵式键盘控制数码管显示方案 • 矩阵式键盘控制数码管显示应用 • 矩阵式键盘控制数码管显示常见问题及
解决方案
01 矩阵式键盘工作原理
按键检测方式
直接检测法
通过直接检测按键是否按下,判断按键状态。
间接检测法
按键与数码管显示不匹配
01
总结词
按键与数码管显示不匹配是矩阵式键盘控制数码管显示中 常见的问题之一,表现为按下某个按键后数码管显示的内 容与预期不符。
02
详细描述
这可能是由于键盘编码与数码管显示编码不匹配导致的问题。 例如,按下数字键“1”,数码管却显示字母“A”。
03
解决方案
可以通过调整键盘编码与数码管显示编码的对应关系来解 决这个问题。具体来说,需要检查键盘编码与数码管显示 编码的映射关系,确保它们一一对应。同时,也需要检查 键盘扫描程序和数码管显示驱动程序的实现是否正确。
静态驱动
每个数码管的每个段都由一个独立的 I/O口控制,适用于数码管数量较少 的情况。
动态驱动
通过扫描方式逐个点亮数码管的各个 段,可以节省I/O口资源,适用于数码 管数量较多的情况。
03 矩阵式键盘控制数码管显 示方案
硬件连接方案
矩阵式键盘与微控制器连接
将矩阵式键盘的行和列连接到微控制器的输入/输出端口,以便读取按键状态。
优化显示逻辑
优化数码管显示的逻辑,例如使用动态扫描技术,减少数码管的亮灭时间,提高显示效果。
04 矩阵式键盘控制数码管显 示应用
电子密码锁
总结词
矩阵式键盘控制数码管显示在电子密码锁中应用广泛,能够实现密码输入、显示和安全 验证等功能。
  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语言,但是我依然可以通过自学,查阅资料和与同学之间讨论交流来做出这个课题,我想将来不管遇到什么样的题目,只要我采用同样的方法和态度,总会可以找到解决的方案的。

相关文档
最新文档