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

上传人:飞****2 文档编号:52739631 上传时间:2022-10-23 格式:DOC 页数:9 大小:62.50KB
返回 下载 相关 举报
单片机 矩阵键盘实验 实验报告.doc_第1页
第1页 / 共9页
单片机 矩阵键盘实验 实验报告.doc_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《单片机 矩阵键盘实验 实验报告.doc》由会员分享,可在线阅读,更多相关《单片机 矩阵键盘实验 实验报告.doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、实验五 矩阵键盘实验一、实验内容1、编写程序,做到在键盘上每按一个数字键(0F)用发光二极管将该代码显示出来。按其它键退出。2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能。可定义“A”键为“+”键,“B”键为“=”键。二、实验目的1、 学习独立式按键的查询识别方法。2、 非编码矩阵键盘的行反转法识别方法。三、实验说明1、MCS51系列单片机的P0P3口作为输入端口使用时必须先向端口写入“1”。2、用查询方式检测按键时,要加入延时(通常采用软件延时1020mS)以消除抖动。3、识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高

2、电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。由于51单片机的并口能够动态地改变输入输出方

3、式,因此,矩阵键盘采用行反转法识别最为简便。行反转法识别按键的过程是:首先,将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、建一个表,通过查表就可知道是哪个键被按下了。四、接线方法 键盘连接成44的矩阵形式,占用单片机P1口的8根线,行信号是P1.0-1.3,列信号是P1.4-1.7。 五、实验电路参考学习板说明书P14。六、参考程序程序一:/*功能:4*4矩阵键盘,LED显示所按的键作者:txl时间:2009-04版本:V1.0*/#include#define uint unsigned int#define uchar unsigned charsbit wei1=P20;uchar code table=0xC0,0xF9,0xA4,0xB0, 0x99,0x92,0x82,0xF8, 0x80,0x90,

5、0x88,0x83, 0xC6,0xA1,0x86,0x8E;/共阳数码管码表/全局变量uchar num,temp,num1;/函数声明void delay(uint z);uchar keyscan();void display(uchar aa);void main()num=1; wei1=0;P0=0xC0;while(1) display(keyscan();void display(uchar aa)P0=tableaa-1;uchar keyscan()P1=0xfe;temp=P1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=P

6、1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;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=P1;temp=temp&0xf0;P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)c

7、ase 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:n

8、um=11;break;case 0x7b:num=12;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;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

9、)temp=P1;temp=temp&0xf0;return num;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);程序二: #include #define U8 unsigned char#define key_port P1code U8 kcode=0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7;/反转码对应键值 0 1 2 3 4 5 6 7 8 9 A Bcode U8 disp=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0

10、x24,0xba,0x20,0x28,0xff;U8 buf4=0,0,0,0; U8 cnt=0;U8 scn=0x7f,0xbf,0xdf,0xef;/ 先点亮左边一个数码管void delay_ms(U8 ms)U8 i,j;for(i=0;i100;i+) for(j=0;jms;j+);U8 key(void)U8 a,r;delay_ms(20);/ 延时20毫秒,消除按键抖动if(key_port = 0xf0) goto rn;a = key_port;key_port = a | 0x0f;delay_ms(20);a = key_port;for (r = 0;r 11)

11、r = 0xff;/0xff表示无效rn:key_port = 0xf0;return r;void main(void) U8 k,i,pf;/ pf为按过加号键的标志int p,p1,p2,/ p1,p2为两个加数,p为和TMOD = 0x01; / 设定时器0为模式1(16位) TH0 = 0xee; / 晶振11.0592MHz,5mS TL0 = 0; TR0 = 1; / 开始计数 EA = 1; / 允许中断ET0 = 1; / 定时器0中断允许 key_port = 0xf0;pf = 0; / 清除加号标志p = 0;delay_ms(20); while(1) / 循环 i

12、f (key_port != 0xf0) k = key(); if (k 10) if(p1=0)&(p2=0)for(i=0;i=3;i+) bufi = 0;/清空显示缓冲区 else for(i=1;i=3;i+) bufi-1=bufi;/ 数字左移一位 buf3 = k;/ 在个位显示刚按的数字 if(pf=0) p1 = p1 * 10 + k;else p2 = p2 * 10 + k; else if(pf = 1) p = p1 + p2; p1 = 1000; for(i=0;i3;i+) bufi = p / p1; p = p - p1 * bufi; p1 = p1

13、 / 10; buf3 = p;p = 0;p1 = 0;p2 = 0;pf = 0; else pf = 1; p2 = 0; for(k=0;k=3;k+) bufk = 0; while(key_port != 0xf0);/ 等待按键抬起 delay_ms(20); while(key_port != 0xf0); void timeint(void) interrupt 1 / 定时器0中断服务程序unsigned char i,s;TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; i = cnt & 0x03; / 求应点亮的LED号(从左到右依次为 0,1,2,3)P0 = dispbufi; / 笔划代码送P0口P2 = scni;/ 控制扫描码送P2口cnt+;七、 实验小结

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁