51单片机矩阵键盘线反转法体会

合集下载

单片机 矩阵键盘实验 实验报告

单片机 矩阵键盘实验 实验报告

单片机矩阵键盘实验实验报告一、实验目的本次实验的目的是掌握原理和方法,利用单片机识别矩阵键盘并编程实现键码转换功能,控制LED点亮显示。

二、实验原理矩阵键盘是一种由多路单向控制器输入行选择信号与列选择信号连接而形成的一一对应矩阵排列结构。

它广泛应用于电子游戏机、办公自动化设备、医疗仪器、家电控制及书籍检索机器等方面。

本次实验采用的矩阵键盘是一个4 x 4矩阵,用4段数码管显示按键编码,每个按键都可以输入一个代码,矩阵键盘连接单片机,实现一个软件算法来识别键码转化。

从而将键盘中的按键的按下信号转换成程序能够识别的代码,置于相应的输出结果中,控制LED点亮,从而可以实现矩阵键盘按键的转换功能。

三、实验方法1.硬件搭建:矩阵键盘(4行4列)与单片机(Atmel AT89C51)相连,选择引脚连接,并将数码管和LED与单片机相连以实现显示和点亮的功能。

2.程序设计:先建立控制体系,利用中断服务子程序识别和码值转换,利用中断服务子程序实现从按键的按下信号转换为程序能够识别的代码,然后将该代码段编写到单片机程序中,每次按下矩阵键盘按键后单片机给出相应的按键编码输出,用数码管显示,控制LED点亮。

四、实验结果经过实验,成功实现了矩阵键盘与单片机之间的连接,编写了中断服务子程序,完成了按键编码输出与LED点亮的功能。

实验完成后,数码管显示各种按键的编码,同时LED会点亮。

本次实验介绍了矩阵键盘的原理,论述了键码转换的程序设计步骤,并实验完成矩阵键盘与单片机的连接,实现用LED点亮以及数码管显示按键的编码。

通过本次实验,受益匪浅,使我对使用单片机编写算法与程序有了更深入的认识,同时丰富了课堂学习的内容,也使我更加热爱自己所学的专业。

单片机c语言程序设计---矩阵式键盘实验报告

单片机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;}五、讨论和心得。

4×4矩阵键盘51单片机识别实验及程序

4×4矩阵键盘51单片机识别实验及程序

4×4矩阵键盘51单片机识别实验与程序1.实验任务如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F〞序号。

对应的按键的序号排列如图4.14.1所示图4.14.12.硬件电路原理图图4.14.23.系统板上硬件连线〔1.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4*4行列式键盘〞区域中的C1-C4 R1-R4端口上;〔2.把“单片机系统〞区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块〞区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。

4.程序设计容〔1.4×4矩阵键盘识别处理(2.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

每个按键的状态同样需变成数字量“0〞和“1〞,开关的一端〔列线〕通过电阻接VCC,而接地是通过程序输出数字“0〞实现的。

键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

5.程序框图图4.14.3C语言源程序*include <AT89*51.H>unsigned char code table[]={0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f,0*77,0*7c,0*39,0*5e,0*79,0*71};unsigned char temp;unsigned char key;unsigned char i,j;void main(void) {while(1){P3=0*ff;P3_4=0;temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {temp=P3;temp=temp & 0*0f; switch(temp){case 0*0e:key=7;break;case 0*0d:key=8;break;case 0*0b:key=9;break;case 0*07:key=10;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0*0f; while(temp!=0*0f) {temp=P3;temp=temp & 0*0f; }}}P3=0*ff;P3_5=0;temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {temp=P3;temp=temp & 0*0f; switch(temp){case 0*0e:key=4;break;case 0*0d:break;case 0*0b:key=6;break;case 0*07:key=11;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0*0f; while(temp!=0*0f) {temp=P3;temp=temp & 0*0f; }}}P3=0*ff;temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {temp=P3;temp=temp & 0*0f; switch(temp){case 0*0e:key=1;break;case 0*0d:key=2;break;case 0*0b:break;case 0*07:key=12;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0*0f; while(temp!=0*0f) {temp=P3;temp=temp & 0*0f; }}}P3=0*ff;P3_7=0;temp=P3;temp=temp & 0*0f;if (temp!=0*0f) {for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {temp=P3;temp=temp & 0*0f; switch(temp){case 0*0e:key=0;break;case 0*0d:key=13;break;case 0*0b:key=14;break;case 0*07:key=15;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0*0f; while(temp!=0*0f) {temp=P3;temp=temp & 0*0f; }}}}}。

Proteus使用笔记之51单片机4x4矩阵按键

Proteus使用笔记之51单片机4x4矩阵按键
程序如下: #include; #define uchar unsigigned int void delayMS(unsigned int z); uchar keyscan(void); void main(void) {
uchar key; while(1) { key=keyscan(); delayMS(50); } } void delayMS(unsigned int z) { unsigned i,j; for(i=z;i>;0;i--) for(j=122;j>;0;j--); } uchar keyscan(void) { uchar scode,scode1,scode2,k; P1=0xf0;
Proteus 使用笔记之 51 单片机 4x4 矩阵按 键
采用反转法判断按键坐标,即行号与列号获得按键码。 写完后发现 Proteus 一个问题:直接使用这样的 if(P1&0xf0!=0xf0)语句时,调不出来,当用了一个中间 变量过渡时,就调出来了,害我花了一个上午的时间,现 在暂时不知道 Proteus 为什么要这样,实际中是不需要的。
case 0x42: k=10;break; case 0x44: k=11;break; case 0x48: k=12;break; case 0x81: k=13;break; case 0x82: k=14;break; case 0x84: k=15;break; case 0x88: k=16;break; default: k=0;break; }
scode1=P1&0xf0; if(scode1!=0xf0) { delayMS(10); scode1=P1&0xf0; if(scode1!=0xf0) { scode1=P1^0xf0; //行号 P1=0x0f; scode2=P1^0x0f; //列号 scode=scode1+scode2; switch(scode) { case 0x11: k=1;break; case 0x12: k=2;break; case 0x14: k=3;break; case 0x18: k=4;break; case 0x21: k=5;break; case 0x22: k=6;break; case 0x24: k=7;break; case 0x28: k=8;break; case 0x41: k=9;break;

PIC单片机矩阵键盘+线反转法

PIC单片机矩阵键盘+线反转法

PIC单片机矩阵键盘+线反转法/*采用行扫描线反转法RAM 占用空间较多,因为用到的变量比较多,但是程序变得简洁。

pic 单片机当采用线反转法时端口寄存器要设置成输出*/#include pic.h__CONFIG(0x3F32); //芯片配置字#define uchar unsigned char #define uint unsigned intvoid delay10ms(uchar x);void beep();void init();uchar j;ucharLED_CODE[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};ucharKEY_CODE[]={0x36,0x2e,0x1e,0x35,0x2d,0x1d,0x33,0x2b,0x1b};ucharkeyscan(){uchar temp1;PORTB=0x07;//将列线置0,行线作为输入状态检测。

temp1=PORTB;//读回B 端口状态值if((temp10x07)!=0x07)//不等于0x07 表示有按键按下{delay10ms(5);//调用延时PORTB=0x07;temp1=PORTB;//读取行值,并保存PORTB=0x38;//线反转,行列反转检测for(j=0;j=9;j++)//循环查表9 次{if((temp1|PORTB)==KEY_CODE[j])//判断行列值相加后是否等于查表值{return(j);//返回j}} }}void main(){init();//系统初始化PORTD=LED_CODE[9];//上电数码管显示“—”while(1){PORTB=0x07;if(PORTB!=0x07)//判断有无按键按下有则执行按键处理程序{keyscan();//调用扫描子程序PORTD=LED_CODE[j];//显示对应键号PORTB=0x07;//重新赋值if(PORTB!=0x07)//再次判断有无按键按下按下蜂鸣器响一声{beep(); //调用蜂鸣器子函数}while(PORTB!=0x07)//按键松手检测,如果按键一直按下关闭蜂鸣器{RE1=0;delay10ms(1);}}}}void init()//系统初始化程序{TRISB=0;//pic 单片机当采用线反转法时端口寄存器要设置成输出TRISD=0;//D 端口设置为输出TRISA=0;//A 端口设置为输出TRISE=0;//E端口设置为输出PORTA=0;//A 端口全部设置为低电平,位选开放PORTD=0xFF;//D 端口全部设置为高电平,段选关闭数码管不亮。

线反转法矩阵键盘程序设计

线反转法矩阵键盘程序设计

龙源期刊网
线反转法矩阵键盘程序设计
作者:曾晓春
来源:《科技创新与应用》2013年第23期
摘要:文章详细介绍分别采用C51进行线反转法矩阵键盘程序设计,此法不需扫描,键盘响应速度快。

代码已优化,作为子程序及函数可供直接调用。

关键词:键值;扫描;线反转法;子程序
1 概述
键盘是由一组规则排列的按键组成,一个按键实际上是一个开关元件。

也就是说,键盘是一组规则排列的开关。

单片机系统中所用的键盘有独立式键盘和矩阵键盘两种。

在单片机系统中,若按键较多时,通常采用矩阵式(也称行列式)键盘。

矩阵式键盘由行线和列线组成,按键位于行线、列线的交叉点上。

一个4×4的行、列结构可以构成一个含有16个按键的键盘。

识别某个按键是否按下,可采用:扫描法、反转法、定位法等。

反转法不但程序简单,代码精简,更重要的是执行效率高。

本文着重介绍利用线反转法设计矩阵键盘的扫描程序。

2 矩阵键盘原理图
参考文献
[1]雷林均.单片机控制装置安装与调试[M].北京:电子工业出版社,2011(4).
[2]李文华.单片机应用技术[M].北京:人民邮电出版社,2011(7).
[3]谷秀荣.单片机原理与应用[M].北京:北京交通大学出版社,2009(6).。

[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得

[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得

[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得实验五矩阵键盘实验一、实验内容1、编写程序,做到在键盘上每按一个数字键(0-F)用发光二极管将该代码显示出来。

按其它键退出。

2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能。

可定义“A”键为“+”键,“B”键为“=”键。

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

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

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

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

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

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

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

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

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

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

行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0某F0;假如此时没有人按键,从P1口读出的值应仍为0某F0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0某B0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0某BF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0某BE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。

行列反转扫描法在矩阵键盘中的应用及编程思想

行列反转扫描法在矩阵键盘中的应用及编程思想

行列反转扫描法在矩阵键盘中的应用及编程思想我现在正在学习51单片机,学到矩阵键盘时,遇到了一些小问题,感觉行列扫描法原理简单,但编程较啰嗦,而且没有固定的编程模式,一个人一个编法,代码复杂,一会儿就能把人绕晕。

于是我就想寻找有没有一种编程思想灵巧,代码简便的程序,通过苦苦在网上寻觅,终于找到了反转法。

行列反转扫描法法可能有些教材资料里都有,但是介绍都不够详细,我找到一个资料,代码非常简单,但是并不好理解,我苦苦思索了一个晚上才弄明白。

于是根据反转法的思想,我写了一个代码不是最少,但却是非常容易理解的程序,在此拿来与大家共享。

此程序已在开发板及Proteus软件中仿真成功。

电路原理图:P1口接矩阵键盘,其中P1.0~P1.3接行线,P1.4~P.7接列线,P0口接共阴极7段数码管。

反转法的原理:反转法就是通过给单片机的端口赋值两次,最后得出所按键的值的一种算法。

for example:如图1所示,取P1口的低四位为行线,高四位为列线。

1.我们给P1口赋值0x0f,即00001111,假设0键按下了,则这时P1口的实际值为00001110;2.我们给P1口再赋值0xf0,即11110000,如果0键按下了,则这时P1口的实际值为11100000;3.我们把两次P1口的实际值相加得11101110,即0xee。

由此我们便得到了按下0键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,矩阵键盘编程问题也就解决了,也就是程序的算法已经有了。

对应关系见图2.以下为程序:/*反转法矩阵键盘的应用,我认为这是一个编程简便又容易理解的矩阵键盘编程应用*/#include<reg52.h> //头文件#define uchar unsigned char //宏定义#define uint unsigned intuchar key,n; //定义变量uchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7 ,0xb7,0x77}; //反转法矩阵键盘的各个按键的计算值uchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管显示0~Fvoid delay(uint i) //延时函数{while(i--);}void keyscan(){uchar l,h,i; //定义局部变量,用l得出低4位的值,用h得出高4位的值P1=0x0f; //给P1赋值00001111l=P1&0x0f;if(l!=0x0f){delay(100);if(l!=0x0f)l=P1&0x0f; //若有键按下,得出低四位的值}P1=0xf0; //给P1赋值11110000h=P1&0xf0;if(h!=0xf0){delay(100);if(h!=0xf0)h=P1&0xf0; //若有键按下,得出高4位的值}key=l+h; //高4位的值与低4位的值相加for(i=0;i<16;i++){if(key==table[i]) //通过查表得出n的值n=i;}}void main(){while(1){keyscan();P0=yin[n]; //在数码管上显示相应的键值}}temp_key=P2; //0键按下时P2=0000 1110;temp1=temp_key|0xf0;//确定了在哪一行temp1=1111 1110 P2=temp1;//temp_key=P2;确定了在哪一列//temp_key=1110 1110 P3=0xf0;temp=P3;if(temp!=0xf0){delay(5);P3=0xf0;temp=P3;if(temp!=0xf0){P3=0x0f;temp2=P3;if(temp2!=0x0f){temp3=temp|temp2; }。

单片机 矩阵键盘实验 实验报告

单片机 矩阵键盘实验 实验报告

单片机矩阵键盘实验实验报告
实验名称:单片机矩阵键盘实验
实验目的:掌握单片机矩阵键盘的原理和应用,能够使用单片机按键输入
实验内容:利用Keil C51软件,采用AT89C51单片机实现一个4x4的矩阵键盘,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。

实验步骤:
1、搭建实验电路,将矩阵键盘与单片机相连,连接好电源正负极,然后将电路焊接成一个完整的矩阵键盘输入电路。

2、打开Keil C51软件,新建一个单片机应用工程,然后编写代码。

3、通过代码实现对矩阵键盘输入的扫描功能,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。

4、编译代码,生成HEX文件,下载HEX文件到单片机中,将单片机与电源相连,然后就可以测试了。

5、测试完成后,根据测试结果修改代码,重新编译生成HEX 文件,然后下载到单片机中进行验证。

实验结果:
经过测试,实验结果良好,能够准确地输入按键的值,显示在液晶屏上。

实验感想:
通过这次实验,我深深地认识到了矩阵键盘技术的重要性以及应用价值,同时也更加深入了解单片机的工作原理和应用技术,这对我的学习和工作都有很好的帮助。

(word完整版)基于51单片机状态机矩阵键盘扫描数码管动态显示的时钟系统

(word完整版)基于51单片机状态机矩阵键盘扫描数码管动态显示的时钟系统

/******************************************************************************程序功能:基于状态机的线性反转扫描方法实现按键扫描数码管动态显示开发环境:KeiL4硬件环境:STC12C5A60S2,11.0592接线说明:单片机P1口接底板JP29,具体接法为:P10—L1,P11—L2,P12—L3,P13-L4,P14-L5,P15-L6,P16-L7,P17-L8单片机P20~P21接底板JP26,具体接法:P20—DS,P21—SHCP,P22-STCP跳线说明:J70实验现象:数码管动态显示时钟时间同时显示当前被按下的键值可通过矩阵键盘对时钟进行开关已经参数调试******************************************************************************/#include <REG52。

h>typedef unsigned char uint8;typedef unsigned int uint16;#define KEY_PORT P1 //定义4x4键盘使用的单片机端口sbit SEG_DS = P2^0;//74HC595芯片的数据引脚sbit SEG_SHCP = P2^1;//74HC595芯片的控制引脚,上升沿移入数据sbit SEG_STCP = P2^2; //74HC595芯片的控制引脚,上升沿更新数据//*****************************************************************************//全局变量//*****************************************************************************char hour,min,sec; // 秒分时uint8 Clock_flag; //时钟开关标志位uint8 ct_flag;//按键长按标志位 //*****************************************************************************//反转法矩阵键盘的各个按键的计算值unsigned char tabLe[]={0xee,//00xed,//10xeb,//20xe7,//30xde,//40xdd,//50xdb,//60xd7,//70xbe,//80xbd,//90xbb,//100xb7,//110x7e,//120x7d,//130x7b,//140x77 //15};//共阳数码管的编码,并将数据定义在CODE区unsigned char code Seg_Data[]={0xc0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/0x88,/*A*/0x83,/*b*/0xC6,/*C*/0xA1,/*d*/0x86,/*E*/0x8E,/*F*/};//数码管位选编码,控制显示8位中的第几位unsigned char code Seg_Addr[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xFF,//ALL ON0x00 //OFF};//*****************************************************************************//函数声明//*****************************************************************************void SEG_Send595OneByte(unsigned char ucData); //向74HC595写入一个8位的数据//指定数码管显示定数字void DispLayOneCharOnAddr(unsigned char Data,unsigned char Addr);unsigned char Key_Scan(void); //基于状态机的按键扫描void Parameter_Setting(uint8 key_value_get); //按键参数设置void Timer0Configuration(); //定时器初始化void CLOCK(void); //时钟运行函数//*****************************************************************************//*****************************************************************************//*****************************************************************************//定时器0中断服务函数//*****************************************************************************void Timer0() interrupt 1{uint8 key_get,j;static uint8 i=0,key_value;static uint16 count=0;TH0 = (65536-922)/256;TL0 = (65536-922)%256;/***********************用户代码************************************/count++;if(962==count) //一秒运行一次时钟{if(Clock_flag)CLOCK(); //时钟走一次count=0; //定时计数清零}switch(i){case 0:i++;DispLayOneCharOnAddr(hour/10,0) ; //数码管动态显示第一位break;case 1:i++;DispLayOneCharOnAddr(hour%10,1) ; //数码管动态显示第二位break;case 2:i++;DispLayOneCharOnAddr(min/10,2);//数码管动态显示第三位break;case 3:i++;DispLayOneCharOnAddr(min%10,3) ; //数码管动态显示第四位break;case 4:i++;DispLayOneCharOnAddr(sec/10,4); //数码管动态显示第五位break;case 5:i++;DispLayOneCharOnAddr(sec%10,5) ; //数码管动态显示第六位break;case 6:i++;DispLayOneCharOnAddr(key_value,6); //数码管动态显示第七位break;case 7:i++; //数码管动态显示第八位break;case 8: i=0;key_get=Key_Scan(); //状态机按键扫描每9ms进行一次扫描(word完整版)基于51单片机状态机矩阵键盘扫描数码管动态显示的时钟系统 if(key_get) //按键没按下返回零{for(j=0;j<16;j++){if(key_get==tabLe[j]) //通过查表得出按键的号{key_value=j;break;}}Parameter_Setting(key_value); //按键参数调试函数输入按键号}break;default:break;}}//*****************************************************************************//主函数//*****************************************************************************void main(void){EA=0; //关总中断Timer0Configuration(); //定时器0初始化 1ms中断EA=1; //开总中断while(1) //循环等待中断到来{}}//***************************************************************************** //*****************************************************************************//向HC595发送一个字节void SEG_Send595OneByte(unsigned char ucData){unsigned char i;for(i = 0;i < 8;i++) //8位数据依次写入,先写最低位{SEG_DS = (ucData & 0x80);//先读入高位 x&0x80;SEG_SHCP = 0;SEG_SHCP = 1;SEG_SHCP = 0; //SHCP引脚的上升沿移入数据ucData <〈=1; //数据左移}}(word完整版)基于51单片机状态机矩阵键盘扫描数码管动态显示的时钟系统/*******************************************************函数功能:在指定位置显示一个数据参数说明:Data是要显示的数据,Addr是在第几位显示.Addr取值范围是0~9。

实验4 矩阵键盘的使用

实验4  矩阵键盘的使用
*函数名: main
*函数功能:主函数
*输入:无
*输出:无
*******************************************************************************/
void main(void)
{
while(1)
{
KeyDown();
GPIO_DIG = ~DIG_CODE[KeyValue];
ORG 0000H
MOV SP,#6FH
MOV R0,#5;延时0.5秒
LOOP1:MOV R1,#200
LOOP2:MOV R2,#250
DJNZ R2,$
DJNZ R1,LOOP2
DJNZ R0,LOOP1
MOV DPTR,#4003H ;8255初始化
MOV A,#10000001B; A口、B口方式0输出,C口高4位输出,低4位输入
MOVX @DPTR,A
LOOP3:LCALL DISP;调用显示子程序DIS,设显示子程序入口为DISP
LCALL KEY;调用键盘扫描子程序,设键盘扫描子程序入口为KEY
CJNE A,#0FFH,LOOP4;如果有键按下转
SJMP LOOP3
LOOP4:MOV 20H,21H
MOV 21H,22H
入口:行列关键值码放在累加器A中,高4位是列驱动码(被扫描列的对应位为0,其余位均为1),低4位是行状态(按下键的对应位为0,其余位均为1)。
出口:键码放在A中带出。
占用:R1、A、PSW、DPTR。
程序清单如下:
;查键值子程序,起始地址为KEY20
KEY20:PUSH ACC;暂存关键值
MOV R1,#00H;查键值自变量清0

线反转法的应用

线反转法的应用

行列键盘的学习是单片机学习的必经之路,可是对于初学者来说学习起来并不容易。

书上的资料不多,或是说明不细,亦或太复杂不易理解。

而线反转法行列键盘扫描简单易懂,非常适合初学者学习,也可作为程序开发之用。

了解行列键盘扫描得从硬件开始学习,我们得知道行列扫描是什么意思。

在单片机系统中为了扩大同一个 I/O 口的键盘个数,则采用了行列式键盘接法,就是交叉相接。

所谓的“行”、“列”是我们人为规定的,如果试着把列看成行,将行看成列是一样的。

这里我们规定 P1.0~P1.3为列,P1.7~P1.4 为行。

如图所示:1、51例子举一个例子吧。

第一步:行线IO P1.7~P1.4置低电平,列线IO P1.0~P1.3置高电平假设K1按下,那么P1.0=0 读P1口 P1=00001110第二步:行线IO P1.7~P1.4置高电平,列线IO P1.0~P1.3置低电平假设K1按下,那么P1.7=0 读P1口 P1=01110000两个字节相加,得到新数据:01111110(第一行第一列)每按一个键我们都得到不同的字节,比对我们的字节是什么就可以知道键值是什么了。

2、MSP430例子前面我们已经讲述了51的例子,51有其特性,IO口送出去的数据,如果不改变的话,还可以读回来,类似于一个锁存器。

但是MSP430或AVR之类的单片机,是不行的。

因此,对于IO内部无上拉电阻的MSP430单片机,比如MSP430F149,不仅行线需要加上拉电阻,列线也需要加上拉电阻,以便维持高电平。

而MSP430F21X1等系列则不必了,因为其IO可以通过配置寄存器得到上拉电阻或下拉电阻。

除了这些不同外,按键扫描流程也略有不同。

同样行列线的定义如上图。

第一步:设置行线为输入态,列线为输出态第二步:列线输出低电平第三步:读行线P1.7~P1.4的电平,读回来的数据抛弃低四位第四步:设置列线为输入态,行线为输出态第五步:行线输出低电平第六步:读列线P1.0~P1.3的电平,读回来的数据抛弃高四位两个字节相加,得到一个新数据。

AT89C51单片机对4×4矩阵键盘进行动态扫描报告

AT89C51单片机对4×4矩阵键盘进行动态扫描报告

北京联合大学信息学院姓名:刘浩学号: 2010080403228 系别:电子工程系专业:电子信息工程同组人:徐笑、冯亚静、吴宾祝姗姗、孙迪指导教师:吴晶晶协助指导教师:训练任务:1、熟练掌握PROTEUS软件的使用;2、按照设计要求绘制电路原理图;3、能够按要求对所设计的电路进行仿真;基本要求及说明:1、按照设计要求自行定义电路图纸尺寸;2、设计任务如下:AT89C51单片机对4×4矩阵键盘进行动态扫描,当按键盘的键时,可将相应按键值(0~F)实时显示在数码管上;3、按照设计任务在Proteus 7Professional中绘制电路原理图;4、根据设计任务的要求编写程序,画出程序流程图,并在Proteus下进行仿真,实现相应功能。

目录1.任务说明................................................................... 错误!未定义书签。

2.原理图绘制说明 (1)3.流程图绘制以及说明 (2)4.PROTEUS仿真说明 (4)5.体会及合理化建议 (7)附录电路原理图 (8)参考文献 (9)一.任务说明AT89C51单片机对4×4矩阵键盘进行动态扫描,当按键盘的键时,可将相应按键值(0~F)实时显示在数码管上;按照设计任务在Proteus 7 Professional中绘制电路原理图;根据设计任务的要求编写程序,画出程序流程图,并在Proteus下进行仿真,实现相应功能。

二.原理图绘制说明1.原理图说明本实验是AT89C51单片机对4×4矩阵键盘进行动态扫描,当按键盘的键时,可将相应按键值(0~F)实时显示在数码管上。

4×4矩阵键盘是用4条I/O线作为行线,4条I/O线作为列线,在行线和列线的交叉点上设置一个按键,每个按键有它的行值和列值,用4条行线和列线分别接P1.0-P1.7,要进行数码管动态扫描,就要将数码管的七段a~f相应的与P0.0-P0.6相连接,即把输入端口P1.0-P1.7连接到4×4行列式按键上作为输入,P0.0-P0.6作为输出端口控制共阳级数码管a-g,对应的a-g 通过程序进行点亮或者熄灭来显示数值(0~F)。

51单片机综合学习系统之矩阵键盘篇

51单片机综合学习系统之矩阵键盘篇

10-5 软件流程图 51 单片机综合学习系统资源丰富,可做实验有:8 位 LED 数码管、32 路 LED、4x4 矩阵键盘、4 个直控 键盘、蜂鸣器喇叭、继电器试验、I2C 总线接口、SPI 总线接口、160X 液晶、128X64 液晶、红外接收头接 口、支持 PS/2 接口的 104 键标准键盘、步进电机驱动接口、ADC0832 模/数转换接口、PC817 光电耦合器、 串行时钟芯片 DS1302、温度传感器 DS18B20 接口、RS232 串口通讯、外扩展接口以便外接更多的实验资源。 软件代码 /***************************************************************************/ /*杭州晶控电子有限公司*/ /**/
图 1 矩阵键盘布局图
图 2 矩阵键盘内部电路图 当无按键闭合时,P10~P13 与 P14~P17 之间开路。当有键闭合时,与闭合键相连的两条 I/O 口线之间 短路。判断有无按键按下的方法是:第一步,置列线 P14~P17 为输入状态,从行线 P10~P13 输出低电平, 读入列线数据, 若某一列线为低电平, 则该列线上有键闭合。 第二步, 行线轮流输出低电平, 从列线 P14~P17 读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是 键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可 能会连续多次进行同样的键操作。 矩阵键盘软硬件设计实例 本期以 51 单片机综合学习系统为硬件平台,介绍矩阵式键盘的编程方法。实验通过按下相应键后在一 位数码管上显示出键值。0 到 16 个键分别对应显示 0 到 F。
switch(n) { case(0xe0):display(7);break; case(0xd0):display(6);break; case(0xb0):display(5);break; case(0x70):display(4);break; } } } //扫描第三行 P1=0xfb; n=P1; n&=0xf0; if(n!=0xf0) { delay(); P1=0xfb; n=P1; n&=0xf0; if(n!=0xf0) { switch(n) { case(0xe0):display(11);break;

线反转法识别矩阵键盘的原理

线反转法识别矩阵键盘的原理

线反转法识别矩阵键盘的原理线反转法识别矩阵键盘的原理一、引言随着科技的不断发展,矩阵键盘已经成为了人们日常生活中不可或缺的一部分。

在现代社会中,矩阵键盘被广泛应用于各种设备中,如电脑、手机、ATM机等。

然而,在使用矩阵键盘时,我们往往需要对其进行输入操作。

如何对矩阵键盘进行输入操作以及如何识别用户的输入操作就成为了一个重要的问题。

二、矩阵键盘的基本结构矩阵键盘是由多个按键组成的,每个按键都有一个唯一的编号。

这些按键通常被排列成一个矩形网格,并被连接到一个控制器上。

控制器通过扫描每个按键来检测用户输入。

三、线反转法识别矩阵键盘原理1. 线反转法简介线反转法是一种常用于检测电路中是否有故障的方法。

它利用了电路中两条线之间相互影响的特性。

2. 线反转法在识别矩阵键盘中的应用在使用线反转法识别矩阵键盘时,我们需要将每个按键与一个独立的输入线连接起来。

这些输入线被分成两组:行线和列线。

行线连接到矩阵键盘的行端口,列线连接到矩阵键盘的列端口。

当用户按下某个按键时,该按键所在的行和列之间会形成一条电路。

此时,电路中的电流会通过该按键并流回控制器。

控制器会检测到这条电路并确定用户按下了哪个按键。

3. 矩阵键盘的扫描过程在使用线反转法识别矩阵键盘时,控制器会通过扫描每个按键来检测用户输入。

具体流程如下:(1)将所有列设置为输出模式,并将它们置为高电平;(2)将所有行设置为输入模式,并启动一个循环;(3)在循环中,逐一扫描每一行;(4)当扫描到某一行时,将该行置为低电平,并读取每一列的状态;(5)如果有某一列被检测到有低电平,则说明该列与当前扫描的行之间形成了一条电路,即有某个按键被按下了;(6)记录下被按下的按键的编号,并将该行恢复为高电平状态;(7)继续扫描下一行,直到所有行都被扫描完毕。

四、总结线反转法识别矩阵键盘的原理是基于电路中两条线之间相互影响的特性。

在使用线反转法识别矩阵键盘时,我们需要将每个按键与一个独立的输入线连接起来,并将这些输入线分成两组:行线和列线。

单片机 矩阵键盘实验 实验报告

单片机 矩阵键盘实验 实验报告

实验五矩阵键盘实验一、实验内容1、编写程序,做到在键盘上每按一个数字键(0-F)用发光二极管将该代码显示出来。

按其它键退出。

2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能。

可定义“A”键为“+”键,“B”键为“=”键。

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

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

三、实验说明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个键的反转码建一个表,通过查表就可知道是哪个键被按下了。

单片机矩阵按键实训报告

单片机矩阵按键实训报告

一、实训目的1. 理解矩阵键盘的工作原理和电路设计。

2. 掌握矩阵键盘的编程方法,实现按键的检测和响应。

3. 培养实际动手能力和团队协作能力。

二、实训内容1. 矩阵键盘电路设计2. 矩阵键盘编程3. 矩阵键盘应用实例三、实训环境1. 单片机开发板:51单片机开发板2. 矩阵键盘:4x4矩阵键盘3. 编程软件:Keil uVision54. 仿真软件:Proteus四、实训过程1. 矩阵键盘电路设计矩阵键盘由行线和列线组成,通过行列交叉连接的按键阵列实现按键功能。

在4x4矩阵键盘设计中,共有4条行线和4条列线,共16个按键。

电路设计如下:(1)行线连接:将单片机的P1.0至P1.3端口作为行线输出,用于控制行线电平。

(2)列线连接:将单片机的P2.0至P2.3端口作为列线输入,用于检测按键状态。

(3)按键连接:将16个按键分别连接到行线和列线交叉处。

2. 矩阵键盘编程(1)初始化:设置P1端口为输出模式,P2端口为输入模式。

(2)按键检测:通过逐行扫描的方式检测按键状态。

首先将P1端口的所有行线设置为低电平,然后逐行检查P2端口列线的状态,如果某列线为低电平,则表示该行对应列的按键被按下。

(3)消抖处理:为了避免按键抖动引起的误读,需要进行消抖处理。

通常采用软件消抖方法,即在检测到按键按下后,延时一段时间(如10ms)再次检测按键状态,如果按键仍然被按下,则确认按键操作有效。

(4)按键处理:根据检测到的按键,执行相应的操作。

例如,当按键按下时,在LCD1602显示屏上显示对应的按键值。

3. 矩阵键盘应用实例以LCD1602显示屏为例,实现按键与显示内容的关联。

(1)LCD1602显示屏初始化:设置LCD1602的显示模式、光标位置等。

(2)按键扫描:按照上述方法检测按键状态。

(3)按键处理:根据按键值,在LCD1602显示屏上显示对应的字符。

五、实训结果1. 成功设计并实现了4x4矩阵键盘电路。

2. 编写了矩阵键盘的检测和响应程序,实现了按键的检测和消抖处理。

4×4矩阵键盘原理及其在单片机中的简单应用(基Proteus仿真)

4×4矩阵键盘原理及其在单片机中的简单应用(基Proteus仿真)

4×4矩阵键盘原理及其在单片机中的简单应用基于Proteus仿真1、4×4矩阵键盘的工作原理如下图所示,4×4矩阵键盘由4条行线和4条列线组成,行线接P3.0-P3.3,列线接P3.4-P3.7,按键位于每条行线和列线的交叉点上。

按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。

第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。

当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。

第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。

第三步,将第一步得到的列码和第二步得到的行码拼合成被按键的位置码,即Y0Y1Y2Y3X0X1X2X3(因为行线和列线各有一条为低电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。

也就是说,当某个键按下时,该键两端所对应的行线和列线为低电平,其余行线和列线为高电平。

比如,当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y0Y1Y2Y3X0X1X2X3为01110111,即0X77。

当5键按下时,行线X1和列线Y1为低电平,其余行列线为高电平,于是可得到5键的位置码Y0Y1Y2Y3X0X1X2X3为10111011,即0XBB。

全部矩阵键盘的位置码如下:2、4×4矩阵键盘在单片机的简单应用举例(一)如下图所示,运行程序时,按下任一按键,数码管会显示它在矩阵键盘上的序号0~F,并且蜂鸣器发出声音,模拟按键的声音。

此处采用线反转法识别按键。

C程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit buzzer=P1^0;uchar code dis[]= //0~9,A~F的共阳显示代码{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E};uchar code tab[]= //矩阵键盘按键位置码{0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};void delay(uint x) //延时函数{uchar i;while(x--)for(i=0;i<120;i++);}uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;P3=0XF0; //P3口输出11110000a=P3; //读取列码delay(10); //防抖延时10msP3=0X0F; //P3口输出00001111b=P3; //读取行码c=a+b; //得到位置码for(i=0;i<16;i++)if(c==tab[i])return i; //查表得到按键序号并返回return -1; //无按键,则返回-1}void beep() //蜂鸣器发出声音,模拟按键的声音{ uchar i;for(i=0;i<100;i++){buzzer=~buzzer;delay(1);}buzzer=0;}void main(){uchar key;buzzer=0; //关闭蜂鸣器while(1){key=scan(); //得到按键号if(key!=-1) //有按键则显示,并且蜂鸣器发出声音{P0=dis[key];beep();delay(100);}}}Proteus仿真运行结果如下:3、4×4矩阵键盘在单片机的简单应用举例(二)如下图所示,运行程序时,按下的按键键值越大,点亮的LED灯越多,例如,按下1号键时,点亮一只LED灯,按下2号键时,点亮两只LED灯,按下16号键时,点亮全部LED 灯。

51单片机 矩阵式键盘 行列翻转 0-16

51单片机 矩阵式键盘 行列翻转 0-16
//51单片机控制四个数码管,由P2口读取矩阵式键盘每个按键对应的数值(0-16),采用静态显示的办法在数码管上显示
//矩阵式键盘采用行列翻转翻转法的原理
#include<reg52.h>
#define uchar unsigned char
uchar row,col,k=0xff;//定义行、列、返回值、循环控制变量
col=P2&0xf0;//行输出全0,读取列值
P2=col|0x0f;
k=P2;
for(i=0;i<16;i++)//查找行列组合值在键盘表中位置
{
if(k==keycode[i])
{//否则,返回0xff
k=i;//对重复键,该方法
break;//处理为无键按下
}
}
P2=0xf0;
while((P2&0xf0)!=0xf0);//等待键释放
}
}
return k;//有键按下返回的是i的值
}
void main()
{
P0=0xff;//关数码管显示
while(1)
{
SMG_q=0;//打开千位的位码
SMG_b=0;//打开百位的位码
SMg=0;//打开个位的位码
P0=table[key()];//显示0-16
void delay20ms()
{
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<10;j++);
}
uchar key()
{
uchar i;
char code keycode[]= {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51 单片机矩阵键盘线反转法体会
独立式键盘扫描只需读取10 口状态,而矩阵式键盘描通常有两种实现方法: 逐行扫描法和线反转法。

(1) 逐行扫描法
依次从第一至最末行线上发出低电平信号,如果该行线所连接的键没有按下的话,则列线所接的端口得到的是全“1信”号,如果有键按下的话,则得到非全“1信” 号。

(2) 线反转法
线反转法比行扫描速度快,原理是先将行线作为输出线,列线作为输入线,行线输出全“0信”号,读入列线的值,那么在闭合键所在的列线上的值必为0;然后从列
线输出全“0信”号,再读取行线的输入值,闭合键所在的行线值必为0。

这样,当一个键被按下时,必定可读到一对唯一的行列值。

再由这一对行列值可以求出闭合键所在的位置。

/*在TX-1C实验板上实现如下描述:
实验板上电时,数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示
0~F, 6个数码管同时显示。

这里用线反转”的方法写,可以代替郭天祥书上例【
4.2.1 】该书上使用逐
行扫描的方式。

*/
#include<reg
52.h>
#define uchar unsigned char
#define uintunsigned int
sbit dua n=P2八6;//打开位选和段选
sbit wei=P2八7;
uchar code table[]={// 数码管显示数值表0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
void delay(uint x){uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);}void xianshi(uchar num){P0=table[num]; duan=1; duan=0;}uchar keyscan(void){uchar h,l;
P3=0x0f;
h=P3&0x0f;
if(h!=0x0f)
{delay
(10);
if(h!=0x0f){h=P3&0x0f;
P3=0xf0;
l=P3&0xf0;
return (h+l);}}
return 0xff;}void main(){uchar key;
P0=0示duan=1;
duan=0;// 毫秒级延时函数
// 段选显示函数
// 矩阵键盘扫描函数
// 定义行、列值中间变量
// 列线输出全为0
// 读入行线
// 检测有无按键按下
// 延时去抖
// 如果确实按下
// 再次读入行线
// 输出当前列线值,行线反转
// 读入列线值
// 键盘最后组合编码值,也就是键值
// 其余情况返回该值
// 关闭所有数码管段选,实验板上电数码管不显
PO=OxcO;〃选中6位数码管
wei=1;
wei=0;
while
(1){key二keyscan();〃用key 读取keyscan(的值switch(key){case 0xee: key=0;while(keyscan()!=0xff); xianshi(key); break;
//while(keyscan()!=0xff) 是松手检测语句,松手时检测case0xde:
key=1;while(keysca n()!=Oxff);xia nshi(key);//keysca n(函数会得到返回值0xff,!=oxff 时表示按下去了
case 0xbe: key=2;while(keyscan()!=0xff); xianshi(key); break;
case 0x7e: key=3;while(keyscan()!=0xff); xianshi(key); break;
case 0xed: key=4;while(keyscan()!=0xff); xianshi(key); break;
case 0xdd: key=5;while(keyscan()!=0xff); xianshi(key); break;
case 0xbd: key=6;while(keyscan()!=0xff); xianshi(key); break;
case 0x7d: key=7;while(keyscan()!=0xff); xianshi(key); break;
case 0xeb: key=8;while(keyscan()!=0xff); xianshi(key); break;
case 0xdb: key=9;while(keyscan()!=0xff); xianshi(key); break;
case 0xbb:
key=10; while(keyscan()!=0xff); xianshi(key); break; case 0x7b:
key=11; while(keyscan()!=0xff); xianshi(key); break;
case 0xe7: key=12; while(keyscan()!=0xff); xianshi(key); break;
case 0xd7: key=13; while(keyscan()!=0xff); xianshi(key); break;
case 0xb7: key=14; while(keyscan()!=0xff); xianshi(key); break;
case 0x77: key=15; while(keyscan()!=0xff); xianshi(key); break; default: break;}}}/* 后记*/
/*刚开始写这个程序时我把主函数里面的switch —case语句这样写的, while
(1){key二keyscan();〃用key 读取keyscan()的值switch(key){case 0xee: key=0;break;
case 0xde:
key=1;break;
case 0xbe:
key=2;break;break;}case 0x7e: key=3;break;
case 0xed:
key=4;break;
case 0xdd:
key=5;break;
case 0xbd: key=6;break;
case 0x7d: key=7;break;
case 0xeb: key=8;break;
case 0xdb: key=9;break;
case 0xbb: key=10; break;
case 0x7b:
key=11; break;
case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break;
case 0x77: key=15; break; default:
break;}xianshi(key);
运行程序后发现当手按下按键时会有数码的显示,但是一旦放开按键数码管就什么都不显示了。

而运行刚才上面的程序
时,当手放开以后数码管是会保留刚才按下去时应该显示的值的。

这个问题起初困扰我,后来发现原来是xianshi(key没有放在case里面执行
的原因。

1、在上面那个程序里面,按下按键程序跳到case里面得到相应的key并且
执行xianshi()函数,当松开按键,在while
(1)循
环里不断检测keyscan(),松开按键后跳到keyscan(函数里面后会得到返回
值0xff 这样switch 会执行default:
break;然
后再不断地进出keyscan(,而这对数码管的显示值没有影响,故松手以后保留刚才的显示值。

2、在下面的这个程序里面,松开手以后,程序再次进入keysca n(函数时得到key=0xff 后,程序跳到switch 由于不满足case
条件,执行default,break跳出,然后按程序顺序执行xianshi(key),这里key 的值已经变为Oxff,所以为xianshi(Oxff),
没有相应的显示,于是松手后数码管没有任何显示。

*/
/*这里关于switch-case语句还有几个重要的注意点:
1、case后可以允许有多个语句(复合语句),可以不用{}括起来,程序进入某个case后会自动顺序执行后面语句知道遇到
break 为止。

2、c ase后各常量表达式不能相同,否则会出现错误。

3、如果可能最好在每句case后面使用break。

*/
/*
2013年4月21日星期日晚*/。

相关文档
最新文档