( 2014 — 2015 学年 第 2 学期)
课程名称:嵌入式技术 开课实验室:信自楼402 2015年5月19日
年级、专业、班 计科122 学号 201210405204 实验项目名称 实验三 键盘实验 该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□ 教 该同学的实验能力: A.强 □ B.中等 □ C.差 □ 该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□ 师 实验报告是否规范: A.规范□ B.基本规范□ C.不规范□ 评 实验过程是否详细记录: A.详细□ B.一般 □ C.没有 □ 语 教师签名: 姓名 邹华宇 指导教师 成绩 江虹 年 月 日 一、实验目的
掌握单片机系统中矩阵键盘的编程控制方法,学会实时程序的调试技巧。
二、实验原理
键盘是单片机应用中常用的输入设备,在应用系统中,操作人员可通过键盘向系统输入指令、地址和数据,实现简单的人机通信。
键盘实际上是一组按键开关的集合,平时总是处于断开状态,当按下键时它才闭合。按键在闭合和断开时,触点会存在抖动现象,抖动时间一般为5-10ms,如下图示:
键盘的处理主要涉及以下3个方面的内容: 按键的识别
所接I/O口线是高还是低电平(根据连接情况)
抖动的消除
硬件消抖
软件消抖(延时)
判断键值
独立式键盘 矩阵式键盘
实验板电路原理图如下:
三、实验内容
按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
四、实验步骤
1、按实验要求在KeilC中创建项目,编辑、编译程序。 源代码:
#include #define uint unsigned int #define uchar unsigned char void init();//初始化子程序 void delay(uint);//延时子程序 void display(uint);//显示子程序 uint keyscan();//按键扫描子程序 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar temp; uint num; sbit duan=P2^6; sbit wei=P2^7; void main() { init(); while(1) display(keyscan()); } void init() { num=0; P0=0xff; } void delay(uint ms) { uint x,y; for(x=ms;x>0;x--) for(y=110;y>0;y--); } void display(uint a) { uchar bai,ge,shi; if(a==0) { duan=1; P0=0x3f; duan=0; wei=1; P0=0xfe; wei=0; } else { if(a<10) { P0=0; duan=1; P0=table[a]; duan=0; P0=0xff ; wei=1; P0=0xfe; wei=0; P0=0x0 ; } else if(a<100) { shi=a/10; ge=a%10; duan=1; P0=table[shi]; duan=0; wei=1; P0=0xfe; wei=0; delay(1); P0=0xff; duan=1; P0=table[ge]; duan=0; wei=1; P0=0xfd; wei=0; delay(1); P0=0xff; } else if(a<1000) { bai=a/100; shi=a%100/10; ge=a%10; duan=1; P0=table[bai]; duan=0; wei=1; P0=0xfe; wei=0; delay(1); P0=0xff; duan=1; P0=table[shi]; duan=0; wei=1; P0=0xfd; wei=0; delay(1); P0=0xff; duan=1; P0=table[ge]; duan=0; wei=1; P0=0xfb; wei=0; delay(1); P0=0xff; } } } uint keyscan() { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(5); temp=P3; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:num=1;break; case 0xde:num=4;break; case 0xbe:num=9;break; case 0x7e:num=16;break; } } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed:num=25;break; case 0xdd:num=36;break; case 0xbd:num=49;break; case 0x7d:num=64;break; } } while(temp!=0xfd) temp=P3; } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb:num=81;break; case 0xdb:num=100;break; case 0xbb:num=121;break; case 0x7b:num=144;break; } } while(temp!=0xfb) temp=P3; } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7:num=169;break; case 0xd7:num=196;break; case 0xb7:num=225;break; case 0x77:num=256;break; } } while(temp!=0xf7) temp=P3; } return num; } 2、将编译生成的目标码文件(后缀为.Hex)下载到实验板电路中。 3、在实验板中运行程序,观察实验运行结果并记录。 五、实验总结 通过本次的实验充分了解了矩阵键盘的检测和数码管的显示。本次试验程序的基本思想为首先检测键盘的哪一行被按下,然后在检测此行的哪一列被按下。检测结束后根据被按下的键得到此键数值的平方。键盘检测函数将返回平方值。在显示函数中根据传进来的平方值进行判断位数,根据判断得到的位数进行个位,十位,百位的拆分显示。 因篇幅问题不能全部显示,请点此查看更多更全内容