单片机实验报告——矩阵键盘数码管显示
基于单片机的矩阵键盘操作实验
实验十二基于单片机的矩阵键盘操作实验12.1 实验目的1. 掌握单片机AT89C52与矩阵键盘的接口技术。
2. 用protues实现该接口的电路设计和程序设计,并进行实时交互仿真。
3. AT89C52单片机对4×4矩阵键盘进行动态扫描,当按完一次键盘时,可将相应按键值(0-F)实时显示在数码管上。
12.2 PROTUES电路设计单片机与矩阵键盘的接口电路原理图如图12-1所示。
图12-1 单片机与矩阵键盘的接口电路原理图12.3 实验内容键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。
在单片机组成的各种系统中,用的最多的是非编码键盘,也有用到编码键盘的。
1.从PROTUES库中选取元器件① AT89C52:单片机;② RES:电阻;③ 7SEG-MPX2-CC-BLUE:七段共阴绿色数码管;④ CAP/CAP-ELEC:电容、电解电容;⑤ CRYSTAL:晶振;⑥ BUTTON:按键。
2.放置元器件3.放置电源和地(终端)4.连线5.元器件属性设置6.电气检测12.4 程序设计1. 流程图矩阵键盘操作程序流程图如图12-2所示。
图12-2 矩阵键盘操作程序流程图2.源程序设计C程序设计:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit we1=P1^0;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};uchar num,temp,num1;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar keyscan();void display(uchar aa);void main(){num=17;while(1){display(keyscan());}}void display(uchar aa){P2=table[aa-1];we1=0;}uchar keyscan(){P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13;break;case 0xd7:num=14;break;case 0xb7:num=15;break;case 0x77:num=16;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return num;}12.5 PROTUES仿真矩阵键盘仿真图如图12-3所示。
单片机 矩阵键盘实验 实验报告
实验五矩阵键盘实验一、实验内容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个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
单片机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;}五、讨论和心得。
单片机入门-矩阵键盘控制数码管显示
} } }
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单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
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、把矩阵键盘上的按键输入的键码在静态数码管上显示出来。
数码管显示4×4键盘矩阵按键实验
5、4×4键盘矩阵按键实验一、实验目的及要求键盘实质上是一组按键开关的集合。
通常,键盘开关利用了机械触点的合、断作用。
键的闭合与否,反映在行线输出电压上就是呈高电平或低电平,如果高电平表示键断开,低电平则表示键闭合,反之也可。
通过对行线电平高低状态的检测,便可确认按键按下与否。
为了确保CPU对一次按键动作只确认一次按键有效,还必须消除抖动。
当按键较多时会占用更多的控制器端口,为减少对端口的占用,可以使用行列式键盘接口,本实验中采用的4×4键盘矩阵可以大大减少对单片机的端口占用,但识别按键的代码比独立按键的代码要复杂一些。
在识别按键时使用了不同的扫描程序代码,程序运行时LED灯组会显示相应按键的键值0~15的二进制数。
本实验中P2端口低4位连接是列线,高4位连接的是行线。
二、实验原理(图)三、实验设备(环境):1、电脑一台2、STC-ISP(V6.85I)烧写应用程序3、Keil应用程序四、实验内容(算法、程序、步骤和方法):#include<STC15F2K60S2.h> //此文件中定义了STC15系列的一些特殊功能寄存器#include"intrins.h"#define uint unsigned int#define uchar unsigned charuchar code dsy_code[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0 F,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;P2=0x0f;delayMS(5);tmp=P2^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;}P2=0xf0;delayMS(5);tmp=P2>>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=0x00;while(1){P2=0xf0;if(P2!=0xf0)keys_scan();if(Pre_keyno!=keyno){P0=~dsy_code[keyno];Pre_keyno=keyno;}delayMS(50);}}五、实验结论(结果):本实验实现了XXX功能,核心算法采用了XXX的方式,达到了预期目的。
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];//数码管显示键值}}。
实验五 矩阵式键盘按键值的数码管显示
实验五矩阵式键盘按键值的数码管显示一实验目的将矩阵键盘的键值采用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显示器动态显示被按下键盘号。
实验四键盘及显示设计实验报告
实验四键盘扫描及显示设计实验报告一、实验要求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. 从数码管显示方式看,数码管分为静态显示和动态显示两种方式。
实验四:矩阵按键与数码管显示
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 文件,然后下载到单片机中进行验证。
实验结果:
经过测试,实验结果良好,能够准确地输入按键的值,显示在液晶屏上。
实验感想:
通过这次实验,我深深地认识到了矩阵键盘技术的重要性以及应用价值,同时也更加深入了解单片机的工作原理和应用技术,这对我的学习和工作都有很好的帮助。
单片机实训报告键盘和数码管显示(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芯片各引脚名称及功能:引脚名称说明实用文档Zlg7289与微控制器的接口ZLG7289使用SPI串行总线与微控制器接口。
SPI接口SPI串行总线是Motorola公司推出的一种同步串行接口。
通常它需实用文档要四条线,就可与微控制器之间实现全双工的同步串行通讯。
SPI串行总线主要有如下的特性:1.采用主从模式(Master Slave)架构,支持多Slave模式,一般只支持单Master,Master控制时钟。
2.采用四线,实现全双工通信。
图1 SPI接口连线示意图示时钟极性选择和时钟相位选择。
CPOL控制位决定了设备激活后,而没有进行数据传输时,SCLK 的空闲(Idle)电平是高电平还是低电平。
数码管显示矩阵键盘实验
数码管显示矩阵键盘实验
数码管简介
数码管显示方法 键盘简介 单片机常用的键盘形式 键盘识别及键盘电路
数码管简介
数码管的分类: 按公共端分:共阴数码管、共阳数码管 共阴数码管:数码管七段的负极连在一起 共阳数码管:数码管七段的阳极连在一起
四位数码管
一位数码管
• 内部结构示意图:
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动态显示原理为使得输入控制电路简单且易于实现,采用动态扫描的方式实现设计要求。
单片机实验报告矩阵键盘控制点阵的显示
实验报告实验名称:矩阵键盘控制点阵的显示专业班级:控制科学与工程学号:s2******* 学生姓名:李佛垚指导教师:李晓林、李丽宏、牛昱光2013年1月18日目录一、实验目的 (1)二、实验内容 (1)(一)扫描矩阵键盘读出键值。
(1)(二)数码管显示键号。
(1)(三)点阵显示不同按键需要输出的信息。
(根据需要可以修改)。
(1)三、实验设备及配套软件 (1)四、实验原理 (2)五、实验电路及功能说明 (2)(一)STC89C52RC单片机主要性能 (2)(二)矩阵键盘 (4)1.连接线路图 (4)2.矩阵键盘说明: (4)(三)点阵 (5)1.连接线路图 (5)2.8x8点阵LED等效电路连接图: (5)3.显示原理说明: (6)(四)数码管 (6)1.数码管连接线路图 (6)2.动态显示原理 (6)(五)XT100最小系统原理图 (7)(六)实验结果分析 (8)1.实物图 (8)2.结果分析 (8)六、软件设计流程图 (8)(一)程序说明 (8)(二)流程图 (9)1.主程序流程图 (9)2.键盘扫描程序流程图 (10)(三)程序 (11)七、实验中的问题与心得 (16)一、实验目的一般任何一个适用的系统都少不了键盘和显示这两个部分,键盘为使用者设定功能提供操作平台;显示反映出使用者设定功能的状态。
在传统的设计中,一般都是把键盘模块和显示模块分开设计,这样结构清晰,软件设计简单,当I/O口不够用时,通常通过扩展I/O的方法来解决问题。
以上做法有优点但同时也暴露了一个问题,它们都需要通过增加芯片来扩展I/O口。
当硬件成本要求苛刻的情况下,这种设计理念就很难适应其要求,而本设计采用显示模块和键盘模块共用端口的方法,分时显示和按键扫描,很好的解决了这一矛盾。
二、实验内容利用XT100开发板中的STC89C52单片机的P0口和P2口的分时复用以及单片机执行速度快和人的视觉反应有限的原理,通过对同一I/O端口分时作为键盘电路的输入端口和数码管以及点阵显示电路的输出及控制端口来实现I/O端口的公用。
矩阵键盘扫描与数码管显示实验结果分析
矩阵键盘扫描与数码管显示实验结果分析
矩阵键盘扫描与数码管显示实验是一种常见的数字电路实验。
在这个实验中,我们可以通过按下矩阵键盘上的按键,控制数码管上的数字显示。
实验结果分析主要包括以下几个方面:
1. 矩阵键盘扫描:在实验中按下键盘上的某个按键,可以通过扫描算法检测到按键的位置,并将对应按键的行列信息送入微处理器或控制电路。
分析实验结果时,可以观察是否可以正常检测到按键的位置,并且是否能够正确传递给其他部分的电路或处理器。
2. 数码管显示:通过实验中的控制电路,可以将微处理器或其他控制器输出的数字信号转换成数码管上的对应数字显示。
在分析实验结果时,可以观察数码管是否能够正常显示所期望的数字,并且是否能够响应输入信号的变化。
3. 信号传递与处理:在整个实验电路中,信号的传递和处理是关键部分。
可以分析信号在各个部分的传递过程中是否出现错误或干扰,是否能够实现正确的数据传输和处理。
4. 稳定性和可靠性:实验结果的分析还需要考虑电路的稳定性和可靠性。
即在长时间使用或复杂环境条件下,电路能否保持正常工作,并且不出现意外错误或故障。
总结来说,矩阵键盘扫描与数码管显示实验结果的分析需要关注按键的检测和传递、数码管的正确显示、信号传递与处理等方面,同时也需要考虑电路的稳定性和可靠性。
矩阵键盘的键值用数码管显示
矩阵键盘的键值用数码管显示�矩阵按键项目:分别按下4*4 矩阵键盘,一共16 个按键,数码管会相应的显示1-16 不同的数字。
最终效果图:现象说明:效果图中我们看到:按 4 键,数码管上即显示04,同理按5 键数码管上即显示05。
上面显示的 2 个LED 灯是硬件上特意设计的,只要按键按下,相应的灯就亮了。
目前不用太在意。
此项目练习的目的:(1)认识矩阵键盘。
(2)了解矩阵键盘的原理。
(3)熟悉软件编程。
(4)熟悉软件的使用。
完整代码:(注意,代码中省略的部分是我们目前可以不关心的内容,在下一阶段将着重介绍,此代码已编译测试通过)#include <reg52.h> //头文件#include "digitron_drv.h" //调用数码管显示程序,现在可以把它当做一个主体#define uint unsigned int //宏定义#define uchar unsigned charuchar key_num; //矩阵键盘键值/*延时函数*/void delay(uchar x){uchar i,j;for(i = x;i > 0;i--)for(j = 100;j > 0;j--);}/*键盘键值显示*/void display(void){DigShowNumber(1,key_num%10,0); //个位除以10 取余DigShowNumber(2,key_num/10,0); //十位除以10 取整}/*键盘扫描*/void keyboard(void){uchar temp;P1=0xef; //将第1 列置位低电平,其余的为高电平temp=P1; //读取P1 口当前的状态,赋值给临时变量temp,用于后面的计算temp=temp&0x0f; //判断temp 的,低四位是否为0,if(temp!=0x0f) //如果temp 不等于0x0f,说明有按键按下{delay(10); //延时消抖temp=P1; //重新读一次P1 口数据temp=temp&0x0f;// 如果temp 仍然不等于0x0f,这次说明第1 列真的有按键按下if(temp!=0x0f){temp=P1;switch(temp) //判断按下的是该列的第几行{case 0xee: //如果读到P1 是0xee,说明是第1 列和第1 行的交叉键,即数字键7key_num=7;break;case 0xed: //如果读到P1 是0xed,说明是第1 列和第2 行的交叉键,即数字键4key_num=4;break;case 0xeb: //如果读到P1 是0xeb,说明是第1 列和第3 行的交叉键,即数字键1key_num=1;break;case 0xe7: //如果读到P1 是0xe7,说明是第1 列和第4 行的交叉键,即数字键0key_num=0;break;}}//在判断完按键序号后,还要等待按键被释放,检测释放语句如下:while(temp!=0x0f) //等待按键被释放{temp=P1;temp=temp&0x0f; //不断的读取P1 口数据,然后和0x0f“与”运算,只要结果不等于0x0f,说明按键没有被释放,直到按键被释放才退出whiledisplay();}}//以下程序意义同上,继续进行第2、3、4 列的检测P1=0xdf;temp=P1;temp=temp&0x0f;if(temp!=0x0f){delay(10);temp=P1;temp=temp&0x0f;if(temp!=0x0f){temp=P1;switch(temp){case 0xde:key_num=8;break;case 0xdd:key_num=5;break;case 0xdb:key_num=2;break;case 0xd7:key_num=10;break;}}while(temp!=0x0f){temp=P1;temp=temp&0x0f;display();}}P1=0xbf;temp=P1;temp=temp&0x0f; if(temp!=0x0f) {delay(10);temp=P1;temp=temp&0x0f; if(temp!=0x0f) {temp=P1;switch(temp){case 0xbe:key_num=9; break;case 0xbd:key_num=6; break;case 0xbb:key_num=3; break;case 0xb7:key_num=11; break;}}while(temp!=0x0f){ temp=P1;temp=temp&0x0f; display();}}P1=0x7f;temp=P1;temp=temp&0x0f; if(temp!=0x0f) {delay(10);temp=P1;temp=temp&0x0f; if(temp!=0x0f) {temp=P1;switch(temp){case 0x7e:key_num=12;break;case 0x7d:key_num=13;break;case 0x7b:key_num=14;break;case 0x77:key_num=15;break;}}while(temp!=0x0f){temp=P1;temp=temp&0x0f;display();}}}void main(void){while(1){keyboard();display();}}长见识:(1)按键实物:也称轻触开关按键之前也已经见过了,再回忆一下。
单片机 矩阵键盘实验 实验报告
实验五矩阵键盘实验一、实验内容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个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
矩阵键盘 数码管显示
/****************************************************************************** **** 【函数功能】:矩阵键盘数码管显示* 【晶振】: 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();}。
- 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 key;
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]) {
key=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 将实验程序烧进单片机后按键盘对应显示小组成员的名字如上。