单片机按键与显示实验报告
单片机原理及应用
随堂实验报告
学院 计算机与电子信息学院 专业 电子信息工程 班级 电信11 -1班 姓名 温石坚 学号 11034030132 指导教师 左 敬 龙
实验报告评分:_______
一、 实验原理及电路
实验原理:在电路图中,单片机AT89C51的P1口接有一按键矩阵,P0和P2口接15个灯,P3口接一个led数码显示管。刚开始时,电路处于扫描按键是否被按下的状态。当有某个按键被按下时,在键盘扫描函数的作用下,会有一小段消抖动的时间。当确定没抖动情况下,程序就会查找出是哪个按键被按下了。之后就会执行按键功能函数。
以下是按键扫描函数(包括消抖动程序)和按键功能函数: 按键扫描函数 按键功能函数 uchar rdkey() uchar i;
{ void k(uchar n) uchar scan1,scan2,keycode,j; {P3=tab[n]; P1=0x0f; if(n>=8) scan1=P1; {
if((scan1&0x0f)!=0x0f) for(i=0;i<=8;i++)
{ {P2=led[i]; P0=0x00; delayms(30); delayms(100); scan1=P1; }} if((scan1&0x0f)!=0x0f) else{
{ for(i=0;i<=n;i++) P1=0xf0; {
scan2=P1; P0=led[i];P2=0xff;delayms(100); keycode=scan1|scan2; } for(j=0;j<=15;j++) } { } if(keycode= = key_code[j]) {
key=j;
return(key); } } } }
else P1=0xff; return (16);}
按键扫描函数是通过首先检查行(给P1赋值为0x0f,再将P1赋给变量scan1,用0x0f与scan1相与,可检查出第几行的按键被按下),再检查列的方法(将P1赋值为0xf0,再将P1赋给scan2,此时被按下键的那一列的值会变为0),然后再将两次检查的数按位或,最后将按位或后的那个数与组合键编码对比组合键编码,找出被按下的按键数,返回按键值。
按键功能函数是当第n号按键按下时,连接在P3的显示器显示n,同时连接在P0,P2上的灯会从第0个开始,逐一亮到第n个。由于用到两个I/O口,所以当按键号数大于8时,程序应该将P0口赋值为0x00(共阳极)。
实验电路图如下(此时被按下的按键是六号按键,即第7个按键):
二、 实验程序框图
三、 功能说明
此实验实现的功能是当第n号按键被按下时,连接在P3的显示器显示n,同时连接在P0,P2上的灯会从第0个开始,逐一亮到第n个。实现了矩阵按键与显示的功能。
四、 实验代码
#include<reg51.h>
#define uchar unsigned char #define uint unsigned int uchar key;
unsigned char code
key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; uchar
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar led[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; void delayms(uint ms) {
uchar t; while(ms--) {
for(t=0;t<120;t++); } }
uchar i;
void k(uchar n) {
P3=tab[n]; if(n>=8) {
for(i=0;i<=8;i++) {
P0=led[i];P2=0xff;delayms(100);} for(i=0;i<n-7;i++) {
P2=led[i]; P0=0x00; delayms(100); } } else {
for(i=0;i<=n;i++) {
P0=led[i];P2=0xff;delayms(100); } } }
uchar rdkey()
{ uchar scan1,scan2,keycode,j;
P1=0x0f; scan1=P1; if((scan1&0x0f)!=0x0f) {
delayms(30); scan1=P1; if((scan1&0x0f)!=0x0f) {
P1=0xf0; scan2=P1; keycode=scan1|scan2; for(j=0;j<=15;j++) {
if(keycode== key_code[j]) {
key=j; return(key); } } } }
else P1=0xff; return (16); }
void main() {
while(1) {
P1=0x0f;
if((P1&0x0f)!=0x0f) {
rdkey(); switch(key) {
case 0: k(0); break;
case 1: k(1); break; case 2: k(2); break; case 3: k(3); break; case 4: k(4); break; case 5: k(5); break; case 6: k(6); break; case 7: k(7); break; case 8: k(8); break; case 9: k(9); break; case 10: k(10); break; case 11: k(11); break; case 12: k(12); break; case 13: k(13); break; case 14: k(14); break; case 15: k(15);
break; } } }}
五、 实验过程
这个实验做得比较急,因为当我做这个实验时,我的上一个实验串行口实验刚刚做完上传,而做完这个实验的第二天就要检查了。所以这次实验做得比较简单。
做这个实验,自己的程序出现的问题也不少。由于在实验中用到了两个I/O口,当显示i(i>8)时,本来预期的功能是第一个I/O口的8个灯会逐一亮,之后一直亮,此时第二个I/O口中的前(i-8)个灯会逐一亮。但是自己做的的却不是这样,自己做的实现的是当亮的个数大于8的时候,前面8个会暗下去,并不是全亮。当自己将代码改为以下时,问题就解决了:
if(n>=8) {
for(i=0;i<=8;i++) {
P0=led[i];P2=0xff;delayms(100);} for(i=0;i<n-7;i++) {
P2=led[i]; P0=0x00; delayms(100); } }
当亮的灯个数大于8时,亮到第九个时,将接在P0口的灯状态设为亮,大于8的部分会逐一亮。
六、 实验小结
这是我们单片机实验中的最后一个实验,想想,自己在做实验的过程遇到过许多不同的问题,有简单的,有难的,可是自己没有放弃过,遇到了问题会自主的去寻求解决问题的方法,我觉得这个是自己在做这些实验中最大的收获。每次当自己的仿真成功时,都有种自豪的感觉,这种感觉很美妙,自己也很享受。
当然,自己要做的并不只有这些,自己要做的还有很多很多,自己得不停的进取。
…… 此处隐藏:1237字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [实用文档]李践-有效提升销售的12大黄金法则8-大
- [实用文档]党支部换届工作方案
- [实用文档]2013年下期电子商务专业部宣传工作计划
- [实用文档]方庄一矿通风、钻探绩效工资考核管理办
- [实用文档]项目一 认识企业物流认识企业物流
- [实用文档]MBI_Display_产品蓝图规画
- [实用文档]北京市建筑业劳务作业人员普法维权培训
- [实用文档]锅炉燃烧调整与运行优化
- [实用文档]4支付结算业务的核算
- [实用文档]米什金_货币金融学_第9版各章学习指导
- [实用文档]水泥混凝土路面硬化工程施工组织设计
- [实用文档]钢筋工程安全技术交底书
- [实用文档]关于公布华中师范大学本科毕业论文
- [实用文档]太原市园林绿化施工合同范本 2
- [实用文档]周日辅导 初中英语分类复习单项选择题(
- [实用文档]第四章 文化经纪人的管理形式 第二节
- [实用文档]学宪法讲宪法竞赛题库
- [实用文档]《数值计算方法》期末考试模拟试题二
- [实用文档]爱词霸学英语:每日一句( 十月)
- [实用文档]2014年国家公务员面试:无领导小组讨论
- 新课程主要理念和教学案例分析汇编(24
- 英国人的快乐源于幸福的家庭生活
- 七年级上册第一次月考模拟数学试卷
- 真丝及仿真丝的种类有哪些?
- 【最新】华师大版八年级数学下册第十六
- 高中英语3500个必背单词
- 我可以接受失败,但我不能接受放弃!
- 最近更新沪科版八年级物理上册期末试卷
- 绿化工作先进乡镇事迹材料
- 鲁教版九年级上册思想品德教学计划
- 英语音标的分类
- 地下室底板无梁楼盖与普通梁板结构形式
- 美容师黄金销售话术
- 雅思写作满分作文备考方法
- 血清甲状腺激素测定与高频彩色多普勒超
- 1度浅析装修对室内空气品质的影响
- 2017-2022年中国汞矿行业深度分析与投
- 计算机二级VB公共基础知识
- (何勇)秸秆禁烧_重在寻找出路
- 内外墙抹灰工程分包施工合同1




