单片机实验报告——矩阵键盘数码管显示
单片机 矩阵键盘实验 实验报告
单片机矩阵键盘实验实验报告一、实验目的本次实验的目的是掌握原理和方法,利用单片机识别矩阵键盘并编程实现键码转换功能,控制LED点亮显示。
二、实验原理矩阵键盘是一种由多路单向控制器输入行选择信号与列选择信号连接而形成的一一对应矩阵排列结构。
它广泛应用于电子游戏机、办公自动化设备、医疗仪器、家电控制及书籍检索机器等方面。
本次实验采用的矩阵键盘是一个4 x 4矩阵,用4段数码管显示按键编码,每个按键都可以输入一个代码,矩阵键盘连接单片机,实现一个软件算法来识别键码转化。
从而将键盘中的按键的按下信号转换成程序能够识别的代码,置于相应的输出结果中,控制LED点亮,从而可以实现矩阵键盘按键的转换功能。
三、实验方法1.硬件搭建:矩阵键盘(4行4列)与单片机(Atmel AT89C51)相连,选择引脚连接,并将数码管和LED与单片机相连以实现显示和点亮的功能。
2.程序设计:先建立控制体系,利用中断服务子程序识别和码值转换,利用中断服务子程序实现从按键的按下信号转换为程序能够识别的代码,然后将该代码段编写到单片机程序中,每次按下矩阵键盘按键后单片机给出相应的按键编码输出,用数码管显示,控制LED点亮。
四、实验结果经过实验,成功实现了矩阵键盘与单片机之间的连接,编写了中断服务子程序,完成了按键编码输出与LED点亮的功能。
实验完成后,数码管显示各种按键的编码,同时LED会点亮。
本次实验介绍了矩阵键盘的原理,论述了键码转换的程序设计步骤,并实验完成矩阵键盘与单片机的连接,实现用LED点亮以及数码管显示按键的编码。
通过本次实验,受益匪浅,使我对使用单片机编写算法与程序有了更深入的认识,同时丰富了课堂学习的内容,也使我更加热爱自己所学的专业。
键盘与数码管静态显示实验-单片机-程序
键盘与数码管静态显示实验实验内容:1、根据电路图图1和图2编写按键程序,左侧第一位数码管显示独立式按键编号“1”、“2”、“3”、“4”,哪一个按下,对应的编号显示在左侧第一位数码管(左侧第二个数码管为全灭状态),右侧二位数码管显示“00--15”的十进制键值,无键按下时数码管为全灭状态。
图1 动态显示电路图图2 键盘接口电路图评分表unsigned char code led_code[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09 ,0x11,0xc1,0x63,0x85,0x61,0x71,0xff}; unsigned char dis_buf[4];unsigned char i;unsigned char aa,bb,cc,lie;sbit key1=P2^0;sbit key2=P2^1;sbit key3=P2^2;sbit key4=P2^3;sbit led_clk= P1^6 ;sbit led_data = P1^7 ;void delay_ms(unsigned int i){unsigned char j;for(i;i>0;i--){for(j=110;j>0; j-- );}}void key_scan(void){P3=0Xf0;if((P3&0xf0)!=0xf0){aa=0xfe;for(lie=0;lie<4;lie++){P3=aa;aa=(aa<<1)|0x01;if((P3&0xf0)!=0xf0){bb=P3&0Xf0;switch(bb){case 0xe0:cc=lie;break;case 0xd0:cc=lie+4;break;case 0xb0:cc=lie+8;break;case 0x70:cc=lie+12;break;default :cc=16;break;}}}}else cc=16;}void led_display ( ){unsigned char t,i;unsigned char input_code;for(i=0;i<4;i++){input_code=led_code[dis_buf[i]];for (t=0;t<8;t++){if( input_code & 0x01 ){led_data=1;}else{led_data=0;}led_clk=0;input_code>>=1;led_clk=1;}}}void main (){unsigned char num;while(1){key_scan();if(key1==0){delay_ms(10);if(key1==0){num=1;}}else if(key2==0){delay_ms(10);if(key2==0){num=2;}}else if(key3==0){delay_ms(10);if(key3==0){num=3;}}else if(key4==0){delay_ms(10);if(key4==0){num=4;}}else {num=16;}dis_buf[2]=16;dis_buf[3]=num;if(cc!=16){dis_buf[1]=cc/10;dis_buf[0]=cc%10;}else{dis_buf[1]=16;dis_buf[0]=16;}led_display ();delay_ms(300);}}[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!]。
数码管动态显示与矩阵键盘的编程
数码管动态显示与矩阵键盘的编程实验四综合应用设计——数码管动态显示与矩阵键盘的编程一、实验目的:1、掌握单片机I/O技术和子程序设计等综合知识。
2、了解矩阵式键盘的内部结构和数码管显示的基本原理,掌握至少一种常用的按键识别方法。
3、熟练掌握数码管动态显示和矩阵键盘识别的综合应用。
二、实验内容:设计一个矩阵键盘的识别和动态显示综合的系统,控制8个8段数码管动态扫描显示4*4矩阵键盘上按下的按键所对应的值。
三、实验要求:给定一个4*4的矩阵键盘,16个按键对应显示0123456789ABCDE,第1次按下某按键在第一个8段数码管上显示对应的值,第2次在第二个数码管上显示,以此类推,第9次又在第一个数码管上显示,以此循环下去。
其中ABCDE在数码管上无法表达,可以用其它代替,例如:B用8表示,D用0表示,E用H表示等。
四、实验设备及实验耗材:计算机一台,W A VE6000软件模拟器,完成ISP下载的XLISP 软件,XL1000单片机综合仿真试验仪一台(8个8段数码管,4*4矩阵键盘一个,89S51一片,9针对9针的串口线一条,5V稳压电源线一条)五、实验基本原理与方法:查阅相关资料掌握矩阵式键盘的内部结构,8段数码管动态显示原理和常用的按键识别方法,建议使用按键识别方法中最常用的“行扫描法”编写程序。
结合动态显示技术和矩阵键盘识别技术。
六、实验方案设计:1、采用哪些I/O口完成通信,采用何种按键识别的方法,如何综合动态显示技术和矩阵键盘识别技术。
2、说明该程序的功能。
3、硬件连接原理图。
七、实验步骤:1.弄清实验内容和实验要求。
2.学习相关理论知识,提出实验方案,画出程序流程图。
软件流程图3.编写软件程序,作相关的程序注释,便于查看和调试。
4.编译和调试。
伟福软件:1.打开伟福W A VE V3.20软件,采用伟福默认的仿真器就可以了。
文件——新建文件,在弹出的窗口中输入实验程序,保存为“文件名.asm”文件,若窗口内的部分程序字体颜色发生改变,表示保存成功。
单片机c语言程序设计---矩阵式键盘实验报告
单片机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;}五、讨论和心得。
单片机实验报告——矩阵键盘数码管显示
单片机实验报告信息处理实验实验二矩阵键盘专业:电气工程及其自动化指导老师:***组员:明洪开张鸿伟张谦赵智奇学号: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();}。
5数码管显示4×4键盘矩阵按键实验
5数码管显示4×4键盘矩阵按键实验数码管显示4×4键盘矩阵按键实验一、实验目的、原理及方法键盘在单片机应用系统中能实现向单片机输入数据、传送命令等功能,是人工干预单片机的主要手段。
该实验的目的在于了解键盘的工作原理,键盘按键的识别过程及识别方法,键盘与单片机的接口技术和编程。
键盘实质上是一组按键开关的集合。
通常,键盘开关利用了机械触点的合、断作用。
键的闭合与否,反映在行线输出电压上就是呈高电平或低电平,如果高电平表示键断开,低电平则表示键闭合,反之也可。
通过对行线电平高低状态的检测,便可确认按键按下与否。
为了确保CPU对一次按键动作只确认一次按键有效,还必须消除抖动。
当按键较多时会占用更多的控制器端口,为减少对端口的占用,可以使用行列式键盘接口,本实验中采用的4×4键盘矩阵可以大大减少对单片机的端口占用,但识别按键的代码比独立按键的代码要复杂一些。
在识别按键时使用了不同的扫描程序代码,程序运行时数码管会显示相应按键的键值0~F。
本实验中P1端口低4位连接是列线,高4位连接的是行线。
二、实验步聚及注意事项1、使用Proteus IS 7 Professional应用程序,建立一个.DSN文件2、在“库”下拉菜单中,选中“拾取元件”(快捷键P),分别选择以下元件:AT89C51、RX8、7SEG-COM-ANGRN、BUTTON。
3、构建仿真电路4、创建一个Keil应用程序:新建一个工程项目文件;为工程选择目标器件(AT89C51);为工程项目创建源程序文件并输入程序代码;保存创建的源程序项目文件;把源程序文件添加到项目中。
5、把用户程序经过编译后生成的HEX文件添加到仿真电路中的处理器中(编辑元件→文件路径)三、实验仪器电脑一台,并装载软件:Proteus IS 7 Professional应用程序Keil应用程序四、数据记录及处理#include<reg< p="">51.h>#define uint unsigned int#define uchar unsigned charUchar code dsy_code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x 86,0x8e,0xFF};uchar Pre_keyno=16,keyno=16;void delayMS(char x){uchar i;while(x--)for(i=0;i<120;i++) ;}void keys_scan(){uchar tmp;P1=0x0f;delayMS(1);tmp=P1^0x0f;switch(tmp){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;delayMS(1);tmp=P1>>4^0x0f;switch(tmp){case 1:keyno+=0;break;case 2:keyno+=4;break;case 4:keyno+=8;break;case 8:keyno+=12;break;}}main(){P0=0xff;while(1){P1=0xf0;if(P1!=0xf0)keys_scan();if(Pre_keyno!=keyno){P0=dsy_code[keyno];Pre_keyno=keyno;}delayMS(50);}}五、结果分析(自行填写,如:功能是否实现;整个过程中存在哪些问题;如何解决的….)</reg<>。
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、掌握 4×4 矩阵键盘的工作原理和键盘的扫描方式。
2、掌握键盘的去抖方法和键盘应用程序的设计。
二、实验设备
1、PC 机一台;
2、开放式模块化单片机教学实验箱一台;
3、USB 下载线一根。
三、实验内容
自行编制程序,用 51 单片机实现 4×4 矩阵键盘扫描,采用线反转法;并实现当S11按下时在数码管上显值“0”,当S12按下时在数码管上显值“1”……,即依次将 S11 至S26按下,在数码管上依次显示十六进制数“0-F”,矩阵键盘原理图如图1-1 所示。
单片机与数码管接口电路原理图如图 1-2 所示。
图 1-1 矩阵键盘接口电路
图 1-2 数码管接口电路原理图
四、思考题
1.画出所编程序的流程图;
2.若要实现2×4 矩阵键盘,软硬件作如何修改。
答:将行线P2^3, P2^4接线去掉。
程序对应部分P2=0xfd; P2=0xfe;删掉。
3.实验中有何故障、问题出现,是否得到解决?如何解决的?问题:显示值对应出错。
原来是共阳段码和共阴段码弄相反了。
MSP430单片机 矩阵键盘与数码管实验(附原理图)
MSP430单片机矩阵键盘与数码管实验(附原理图)/************************************************************* *MSP430单片机矩阵键盘与数码管实验*功能:用共阳极数码管显示按键的键值*适用:MSP430各系列单片机*by:duyunfu1987*************************************************************/ #include "msp430x44x.h"#define ROW P2OUT //矩阵键盘的行宏定义#define COL P2IN //矩阵键盘的列宏定义#define DPYOUT P3OUT //数码管输出口宏定义unsigned char keyval; //键值//共“阳”极数码管的码表unsigned char LED7CA[] ={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D, ~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71,0xff};/********************************************************函数名称:keyscan()*功能:扫描4*3矩阵键盘,并返回键值*出口参数:若有按键则返回键值,若无按键返回15*4*3矩阵键盘:0 1 2 3* 4 5 6 7* 8 9 A b*******************************************************/ unsigned char keyscan(){int i=0;unsigned char key=0;ROW = 0x8f; //先置三行输出低电平if((COL & 0x0f)!= 0x0f) //是否有按键{do i++;while(i<3000); //消抖动延时ROW = 0xbf; //扫描第一行if((COL & 0x0f)== 0x0f){ ROW = 0xdf; //扫描第二行if((COL & 0x0f)== 0x0f){ ROW = 0xef; //扫描第三行if((COL & 0x0f)== 0x0f)key = 15;else key = ~((ROW & 0XF0)|(COL & 0X0F));}else key = ~((ROW & 0XF0)|(COL & 0X0F));}else key = ~((ROW & 0XF0)|(COL & 0X0F));if(key != 15)switch(key) //获取有效地键值{ case 0x48: key=0; break;case 0x44: key=1; break;case 0x42: key=2; break;case 0x41: key=3; break;case 0x28: key=4; break;case 0x24: key=5; break;case 0x22: key=6; break;case 0x21: key=7; break;case 0x18: key=8; break;case 0x14: key=9; break;case 0x12: key=10;break;case 0x11: key=11;break;default: key=15;}}else key = 15;keyval=key;return key;}void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P3DIR |= 0xff;P3OUT = 0xff; //共阳极数码管输出口初始化P2DIR |= BIT4 +BIT5+BIT6; //先配置矩阵键盘的行(输出)//P2.6 第一行,P2.5 第二行,P2.4 第三行//P2.3 第一列,P2.2 第二列,P2.1 第三列,P2.0 第四列keyval=16;while(1){ keyscan();if(keyval != 15 && keyval<17)DPYOUT = LED7CA[keyval];//数码管显示键值}}。
单片机矩阵键盘实验
单片机独立按键和矩阵键盘操作[实验要求]独立按键操作: 试操作P3.4~P3.7控制的四个独立按键中的某一个, 每按一次, 数码管上显示数字作一次加1或减1变化, 显示数字在0~9之间.矩阵键盘操作: 依次按下4*4 矩阵键盘上从第1 到第20 个键,同时在六位数码管上依次显示0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
[实验原理](1) 按键识别去抖动原理:我们在手动按键的时候, 由于机械抖动或是其它一些非人为的因素很有可能造成误识别, 一般手动按下一次键然后接着释放, 按键两片金属膜接触的时间大约为50ms 左右,在按下瞬间到稳定的时间为5-10ms,在松开的瞬间到稳定的时间也为5-10ms,如果我们在首次检测到键被按下后延时10ms 左右再去检测,这时如果是干扰信号将不会被检测到,如果确实是有键被按下,则可确认,以上为按键识别去抖动的原理。
(2) 独立按键识别: 判断是否按下键盘,当单片机上电时所有I/O 口为高电平,参照实验电路图, S2 键一端接地另一端接P3.4,所以当键被按下时P3.4 口直接接地,此时检测P3.4 肯定为低电平。
(3) 矩阵键盘识别: 参照实验电路图, 矩阵键盘的四行分别与P3.0-P3.3 连接,四列分别与P3.4-P3.7 连接。
如识别第1列按键, 可给P3.4送低电平,其余为高电平, 把P3口数据读回, 判断其第4位是否全为1, 如果全为1,则该列无键按下, 可继续判断下1列, 如有某位为0, 则有键按下,并可根据其位置识别按键所在行,从而确定该按键位置和键值. 其它各列按键识别类同.[实验目的](1)掌握独立按键的识别方法.(2)掌握按键去抖动的基本原理。
(3)了解矩阵键盘检测的操作方法。
(4)进一步巩固掌握数码管的显示操作方法.[硬件电路]图1 独立键盘和矩阵键盘电路图图2 矩阵键盘接口图。
实验五 矩阵式键盘按键值的数码管显示
实验五矩阵式键盘按键值的数码管显示一实验目的将矩阵键盘的键值采用LED数码管显示出来(分别考虑用动态显示、静态显示)二实验内容与具体任务描述任务1:行列式键盘接口,扫描实现LED动态显示键盘被按下。
将图中的动态显示改成静态显示。
:修改代码及图,2任务三设计的电路图与描述P1口控制键盘,P0口控制LED显示器。
四程序清单任务1:#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字的段码0~9.unsigned char keyval; //定义变量储存按键值/**************************************************************函数功能:数码管动态扫描延时**************************************************************/ void led_delay(void){unsigned char j;for(j=0;j<200;j++);}/************************************************************** 函数功能:按键值的数码管显示子程序**************************************************************/ void display(unsigned char k){P2=0xbf; //点亮数码管DS6P0=Tab[k/10]; //显示十位led_delay(); //动态扫描延时P2=0x7f; //点亮数码管DS7P0=Tab[k_x0010_]; //显示个位led_delay(); //动态扫描延时}/************************************************************** 函数功能:软件延时子程序**************************************************************/ void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值TR0=1; //启动定时器T0按键值初始化为// keyval=0x00;while(1) //无限循环{display(keyval); //调用按键值的数码管显示子程序}}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1{TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平“0”(P1.1出低电平“0”)if(P14==0) keyval=1; //可判断是S1键被按下if(P15==0) keyval=2; //可判断是S2键被按下if(P16==0) keyval=3; //可判断是S3键被按下if(P17==0) keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平“0”(P1.1出低电平“0”)if(P14==0) keyval=5; //可判断是S5键被按下if(P15==0) keyval=6; //可判断是S6键被按下if(P16==0) keyval=7; //可判断是S7键被按下if(P17==0) keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)if(P14==0) keyval=9; //可判断是S9键被按下if(P15==0) keyval=10; //可判断是S10键被按下if(P16==0) keyval=11; //可判断是S11键被按下if(P17==0) keyval=12; //可判断是S12键被按下P1=0xf7;if(P14==0) keyval=13; //可判断是S13键被按下if(P15==0) keyval=14; //可判断是S14键被按下if(P16==0) keyval=15; //可判断是S15键被按下if(P17==0) keyval=16; //可判断是S16键被按下}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值}任务2:#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 数字// 0~9的段码//定义变量储存按键值unsigned char keyval;/**************************************************************函数功能:数码管动态扫描延时**************************************************************//*void led_delay(void){unsigned char j;for(j=0;j<20;j++);}/**************************************************************函数功能:按键值的数码管显示子程序**************************************************************/void display(unsigned char k){DS6 点亮数码管// P2=0x3f;P0=Tab[k/10]; //显示十位//动态扫描延时//led_delay();DS7 //点亮数码管//P2=0x7f;显示个位// P3=Tab[k_x0010_];//led_delay(); //动态扫描延时}/**************************************************************函数功能:软件延时子程序**************************************************************/void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0 的高8位赋初值TR0=1; //启动定时器T0keyval=0x00; //按键值初始化为0while(1) //无限循环{display(keyval); //调用按键值的数码管显示子程序}}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1{TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平ぜ,所有列线置为高电平if((P1&0xf0)!=0xf0) //列线中有一位为低电平ぜ,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平ぜ(P1.1 出低电平ぜ)if(P14==0) keyval=1; //可判断是S1键被按下if(P15==0) keyval=2; //可判断是S2键被按下if(P16==0) keyval=3; //可判断是S3键被按下if(P17==0) keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平ぜ(P1.1出低电平ぜ)if(P14==0)keyval=5; //可判断是S5键被按下if(P15==0) keyval=6; //可判断是S6键被按下if(P16==0) keyval=7; //可判断是S7键被按下if(P17==0) keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平ぜ(P1.2输出低电平ぜ)if(P14==0) keyval=9; //可判断是S9键被按下if(P15==0) keyval=10; //可判断是S10键被按下if(P16==0) keyval=11; //可判断是S11键被按下if(P17==0) keyval=12; //可判断是S12键被按下P1=0xf7;键被按下S13可判断是// keyval=13; if(P14==0)if(P15==0) keyval=14; //可判断是S14键被按下if(P16==0) keyval=15; //可判断是S15键被按下if(P17==0) keyval=16; //可判断是S16键被按下}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值}五运行结果任务1:两个LED显示器动态显示被按下键盘号。
实验四:矩阵按键与数码管显示
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
单片机 矩阵键盘实验 实验报告
单片机矩阵键盘实验实验报告
实验名称:单片机矩阵键盘实验
实验目的:掌握单片机矩阵键盘的原理和应用,能够使用单片机按键输入
实验内容:利用Keil C51软件,采用AT89C51单片机实现一个4x4的矩阵键盘,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。
实验步骤:
1、搭建实验电路,将矩阵键盘与单片机相连,连接好电源正负极,然后将电路焊接成一个完整的矩阵键盘输入电路。
2、打开Keil C51软件,新建一个单片机应用工程,然后编写代码。
3、通过代码实现对矩阵键盘输入的扫描功能,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。
4、编译代码,生成HEX文件,下载HEX文件到单片机中,将单片机与电源相连,然后就可以测试了。
5、测试完成后,根据测试结果修改代码,重新编译生成HEX 文件,然后下载到单片机中进行验证。
实验结果:
经过测试,实验结果良好,能够准确地输入按键的值,显示在液晶屏上。
实验感想:
通过这次实验,我深深地认识到了矩阵键盘技术的重要性以及应用价值,同时也更加深入了解单片机的工作原理和应用技术,这对我的学习和工作都有很好的帮助。
数码管显示矩阵键盘实验
数码管显示矩阵键盘实验
数码管简介
数码管显示方法 键盘简介 单片机常用的键盘形式 键盘识别及键盘电路
数码管简介
数码管的分类: 按公共端分:共阴数码管、共阳数码管 共阴数码管:数码管七段的负极连在一起 共阳数码管:数码管七段的阳极连在一起
四位数码管
一位数码管
• 内部结构示意图:
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利用率不高。 键盘多时,适宜用矩阵盘,识别须进行行列 扫描
矩阵键盘按键的数码管显示矩阵键盘按键的数码管显示
一、矩阵键盘按键的数码管显示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的状态。
扫描信号由r o w进入键盘,变化的顺序依次为1110-1101-1011-0111-1110。
每一次扫描一排,依次地周而复始。
例如现在的扫描信号为1011,代表目前正在扫描9,10,11,12这一排的按键,如果这排当中没有按键被按下的话,则由column读出的值为1111;反之当9这个按键被按下的话,则由colu mn读出的值为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 0111column1110 1101 1011 0111 1110 1101 1011 0111键值9 10 11 12 13 14 15 16动态显示原理为使得输入控制电路简单且易于实现,采用动态扫描的方式实现设计要求。
矩阵键盘扫描与数码管显示实验结果分析
矩阵键盘扫描与数码管显示实验结果分析
矩阵键盘扫描与数码管显示实验是一种常见的数字电路实验。
在这个实验中,我们可以通过按下矩阵键盘上的按键,控制数码管上的数字显示。
实验结果分析主要包括以下几个方面:
1. 矩阵键盘扫描:在实验中按下键盘上的某个按键,可以通过扫描算法检测到按键的位置,并将对应按键的行列信息送入微处理器或控制电路。
分析实验结果时,可以观察是否可以正常检测到按键的位置,并且是否能够正确传递给其他部分的电路或处理器。
2. 数码管显示:通过实验中的控制电路,可以将微处理器或其他控制器输出的数字信号转换成数码管上的对应数字显示。
在分析实验结果时,可以观察数码管是否能够正常显示所期望的数字,并且是否能够响应输入信号的变化。
3. 信号传递与处理:在整个实验电路中,信号的传递和处理是关键部分。
可以分析信号在各个部分的传递过程中是否出现错误或干扰,是否能够实现正确的数据传输和处理。
4. 稳定性和可靠性:实验结果的分析还需要考虑电路的稳定性和可靠性。
即在长时间使用或复杂环境条件下,电路能否保持正常工作,并且不出现意外错误或故障。
总结来说,矩阵键盘扫描与数码管显示实验结果的分析需要关注按键的检测和传递、数码管的正确显示、信号传递与处理等方面,同时也需要考虑电路的稳定性和可靠性。
单片机课程设计——数码管显示4×4矩阵键盘
《单片机原理及应用课程设计》报告——数码管显示4*4矩阵键盘的键盘号设计专业:班级:姓名:学号:2013年1月1.课程设计目的1.1巩固和加深对单片机原理和接口技术知识的理解;1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。
2.课程设计要求单片机的P1口的P1.0~P1.7连接4×4矩阵键盘,P0口控制一只数码管,当4×4矩阵键盘中的某一按键按下时,数码管上显示对应的键号。
例如,1号键按下时,数码管显示“1”, 14号键按下时,数码管显示“E”等等。
3.硬件设计3.1 设计思想分析本任务的要求,使设计能够完成当4*4矩阵键盘中的某一按键按下时,数码管上显示对应的键盘号。
则本系统主要由以下几大模块构成:显示模块,共阴极LED数码管;输入模块,4*4矩阵键盘;3.2主要元器件介绍矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4×4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O 口的利用率。
数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。
数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。
若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。
所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮度,又要数码管显示时不产生闪烁现象。
4.1 设计思想按键采用线反转法先把列线置成低电平,行线置成输入状态,读行线;再把行线置成低电平,列线输入状态,读列线。
单片机实训报告键盘和数码管显示(WORD档)
单片机实训报告(一)班级:测控 9 0 1学号:姓名实验名称:键盘和数码管显示实验目的:熟悉掌握ZLG7289的功能和特性,ZLG7289芯片各引脚名称及功能和ZLG7289与微控制器的接口,ZLG7289的SPI接口和控制指令。
同时进一步熟悉掌握keil软件的操作和编程。
实验原理:ZLG7289是一款数码显示驱动和键盘扫描管理的芯片。
主要有如下的特性:1.直接驱动8位共阴式数码管或64只独立的LED;2.管理多达64只按键,自动消除抖动;3.段电流可达15mA以上,位电流可达100mA;4.具有左移、右移、闪烁、消隐、段点亮等多种功能;5.与微控制器之间采用三线SPI总线接口,占用I/O资源少。
电路主要由芯片ZLG7289、8位共阴极数码管、64键的键盘矩阵以及单片机构成。
ZLG7289的控制电路图:电路的工作原理:当ZLG7289接收到单片机发出的指令(包括纯指令)后,经过读取、分析和处理,将会在数码管上显示相对应的操作指令。
当ZLG7289检测到有效的按键时,KEY脚将从高电平变为低电平,并一直保持到按键结束。
在此期间,如果ZLG7289接收到“读键盘数据指令”,则输出当前按键的键盘代码。
ZLG7289芯片各引脚名称及功能:引脚名称说明1、2 RTCC、Vcc 接电源3、5 NC 悬空4 Vss 接地6 /CS 片选输入端,低电平时,可向其发指令或读键盘。
ZLG7289使用SPI串行总线与微控制器接口。
SPI接口SPI串行总线是Motorola公司推出的一种同步串行接口。
通常它需要四条线,就可与微控制器之间实现全双工的同步串行通讯。
SPI串行总线主要有如下的特性:1.采用主从模式(Master Slave)架构,支持多Slave模式,一般只支持单Master,Master 控制时钟。
2.采用四线,实现全双工通信。
图1 SPI接口连线示意图SPI的数据传输时序模式SPI接口定义了四种数据传输的时序模式。
实验四键盘及显示设计实验报告
实验四键盘扫描及显示设计实验报告一、实验要求1. 复习行列矩阵式键盘的工作原理及编程方法。
2. 复习七段数码管的显示原理。
3. 复习单片机控制数码管显示的方法。
二、实验设备1.PC 机一台2.TD-NMC+教学实验系统三、实验目的1. 进一步熟悉单片机仿真实验软件 Keil C51 调试硬件的方法。
2. 了解行列矩阵式键盘扫描与数码管显示的基本原理。
3. 熟悉获取行列矩阵式键盘按键值的算法。
4. 掌握数码管显示的编码方法。
5. 掌握数码管动态显示的编程方法。
四、实验内容根据TD-NMC+实验平台的单元电路,构建一个硬件系统,并编写实验程序实现如下功能:1.扫描键盘输入,并将扫描结果送数码管显示。
2.键盘采用 4×4 键盘,每个数码管显示值可为 0~F 共 16 个数。
实验具体内容如下:将键盘进行编号,记作 0~F,当按下其中一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近 4 次按下的按键编号。
五、实验单元电路及连线矩阵键盘及数码管显示单元图1 键盘及数码管单元电路实验连线图2实验连线图六、实验说明1. 由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动。
抖动时间的长短由按键的机械特性决定,一般为 5~10ms。
这是一个很重要的时间参数,在很多场合都要用到。
键抖动会引起一次按键被误读多次。
为了确保 CPU 对键的一次闭合仅做一次处理,必须去除键抖动。
在键闭合稳定时,读取键的状态,并且必须判别;在键释放稳定后,再作处理。
按键的抖动,可用硬件或软件两种方法消除。
2. 为了减少键盘与单片机接口时所占用 I/O 线的数目,在键数较多时,通常都将键盘排列成行列矩阵形式。
3. 从数码管显示方式看,数码管分为静态显示和动态显示两种方式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验报告
信息处理实验
实验二矩阵键盘
专业:电气工程及其自动化
指导老师:高哲
组员:明洪开张鸿伟张谦赵智奇学号: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单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6
为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
四、接线方法
键盘连接成4×4的矩阵形式,占用单片机P1口的8根线,行信号是P1.0-1.3,列信号是P1.4-1.7
单片机与矩阵键盘连接如下图:
此图用P1 口P1.0---P1.3 接4行P1.4--P1.7 接4列矩阵键盘工作原理:由于按键没有接地,4行4列正好占用8个I/O
如果4行我们送P3.0到P3.3送入0 1 1 1 然后去读取4列的值,如果P3.0的按键按下那么P3.4---P3.7的值等于0 1 1 1,假如是第2个键按下的话那么读回来的值是1 0 1 1 ,如果第3个键按下去读回来的值是1 1 0 1 ,如果第4个键按下去读回来的值是1 1 1 0 ,如果没有键按下去读回来就是1 1 1 1。
所以我们就根据读回来的值来判断按下去的是那个键。
当然这是对P3.0这一行,因为矩阵键盘是扫描的,所以下次把P3.0 给1 P3.1 给0对第2行,陆续的第3 行第4行,0111 1011 1101 1110 而每次都去从新扫描一遍列值列有4个值,以确定是那个键按下。
无论何时任何一个时间有一个按键被按下就跳出循环。
当然不可能有2个键刚好一起按下你的手没有这么好的力度,就算有2个键一起按键,程序也有先后检测的顺序,只能检测一个后面的检测不到。
P3 = 0XFE; //第一行给0
temp ;定义个变量
temp = P3 ;读回来由于读需要先写1 因为P3= FE 已经把高4位给1了所以能读了
temp & oxf0 如果没有按键按下结果还是0xf0 .如果有键按下结果就不是0xf0了。
num 然后我们再定义一个变量让它赋值给这个按下去的按键值。
一次类推把第一行赋值0 扫描一遍然后把第2行赋值0扫描一遍..............共扫描16遍。
只要有键按下就会得到一个值num 就从1排到16. 共16个按键
4*4 的矩阵键盘。
我再总结下思路:
首先低4位是行共4行分别把每行给0 低电平就4次0 1 1 1 、1 0 1 1 、1 1 0 1 、1 1 1 0 对吧
然后去检测高4位4列啊先不考虑极端情况,4列就4个按键只要按下一个P3口的高4位就会有一个值。
根据这个值就能判断是那个键了。
如:P3= 1111 1110 低四位是行先把第一行给0
有按键下的话temp = P3 读回来1101 1110 然后temp & 0xf0 与运算下就判断下还等于oxf0吗?如还等于就没有按下,如果不等于就肯定有按键按下。
定义个变量让它等于这个不是0XF0的值,做个标记。
依次类推。
五、流程图
六、实验电路
七、实验程序
#include <reg52.h>
#include<intrins.h>
# define uchar unsigned char
# define uint unsigned int
uchar flag;
uchar code keycodez[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77} ; uchar code dispcode[16][5]={{0xa4,0x89,0xc0,0x91,0xff},
{0xc7,0xf9,0xc8,0xff,0xff},
{0xff,0xff,0xff,0xff,0xff},
{0xff,0xff,0xff,0xff,0xff},
{0xa4,0x89,0x40,0xc8,0x90},
{0x91,0xf9,0xc8,0x90,0xff},
{0xa4,0x89,0xc1,0xff,0xff},
{0xff,0xff,0xff,0xff,0xff} ,
{0xf1,0xf9,0x40,0xc8,0x90},
{0x91,0xf9,0xff,0xff,0xff} ,
{0xff,0xff,0xff,0xff,0xff},
{0xff,0xff,0xff,0xff,0xff,},
{0xc8,0xf9,0x91,0xff,0xff},
{0xc1,0xc8,0xff,0xff,0xff} ,
{0xf1,0xf9,0x40,0xc8,0xff},
{0xff,0xff,0xff,0xff,0xff}, } ; uchar code w[5]={0xfe,0xfd,0xfb,0xf7,0xef};
void delay1ms(uint i)
{ uchar j;
while(i--)
{ for(j=0;j<115;j++) ;
}}
uchar keyscan()
{ uchar scan1,scan2,keycode,j;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0)
{
delay1ms(15);
scan1=P1;
if ((scan1&0xf0)!=0xf0)
P1=0x0f;
scan2=P1;
keycode=scan1|scan2;
for(j=0;j<16;j++)
{
if(keycode==keycodez[j])
{
return(key);
}
}
}
else
P1=0xff;
return(16);
}
main()
{
uchar t;
P1=0xff;
while(1)
{
P1=0xf0;
if((P1&0xf0)!=0xf0)
keyscan();
for(t=0;t<5;t++)
{
P2=w[t];
P0=dispcode[key][t];
delay1ms(1); }}}
七、实验结果
ming
.
. hong
kai
zhang hong
wei
zhao
zhi
qi
zhang
qian 将实验程序烧进单片机后按键盘对应显示小组成员的名字如上。