数码管按键综合应用.docx

上传人:b****1 文档编号:1806750 上传时间:2023-05-01 格式:DOCX 页数:27 大小:7.21MB
下载 相关 举报
数码管按键综合应用.docx_第1页
第1页 / 共27页
数码管按键综合应用.docx_第2页
第2页 / 共27页
数码管按键综合应用.docx_第3页
第3页 / 共27页
数码管按键综合应用.docx_第4页
第4页 / 共27页
数码管按键综合应用.docx_第5页
第5页 / 共27页
数码管按键综合应用.docx_第6页
第6页 / 共27页
数码管按键综合应用.docx_第7页
第7页 / 共27页
数码管按键综合应用.docx_第8页
第8页 / 共27页
数码管按键综合应用.docx_第9页
第9页 / 共27页
数码管按键综合应用.docx_第10页
第10页 / 共27页
数码管按键综合应用.docx_第11页
第11页 / 共27页
数码管按键综合应用.docx_第12页
第12页 / 共27页
数码管按键综合应用.docx_第13页
第13页 / 共27页
数码管按键综合应用.docx_第14页
第14页 / 共27页
数码管按键综合应用.docx_第15页
第15页 / 共27页
数码管按键综合应用.docx_第16页
第16页 / 共27页
数码管按键综合应用.docx_第17页
第17页 / 共27页
数码管按键综合应用.docx_第18页
第18页 / 共27页
数码管按键综合应用.docx_第19页
第19页 / 共27页
数码管按键综合应用.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数码管按键综合应用.docx

《数码管按键综合应用.docx》由会员分享,可在线阅读,更多相关《数码管按键综合应用.docx(27页珍藏版)》请在冰点文库上搜索。

数码管按键综合应用.docx

数码管按键综合应用

重庆邮电大学

微处理器与嵌入式系统设计

课程实验报告

实验名称:

数码管、按键综合应用

学期:

2014-2015学年第2学期

班级:

学号:

学生姓名:

任课教师:

实验教室:

YF311

二〇一五年〇五月九日

【实验名称】数码管、按键综合应用

实验要求:

1、按下K0键,LED灯D0亮,数码管12位开始计数(00-FF);

2、按下K1键,LED灯D1亮,数码管34位开始计数(00-FF);

3、按下K2键,LED灯D2亮,数码管56位开始计数(00-FF);

4、按下K3键,LED灯D3亮,数码管78位开始计数(00-FF);

5、按下K4键,D0-D7中奇数位亮(D0、D2、D4、D6);

6、按下K5键,D0-D7中偶数位亮(D1、D3、D5、D7);

7、按下K6键,D0-D7左移流水灯;

8、按下K7键,D0-D7右移流水灯;

9、拓展项目:

按下K8键,停止计数器计数且计数器数值清零,数码管全灭。

实验目的:

1、熟悉4位共阴数码管的基本原理,熟悉4位共阴数码管的显示和编程方法;

2、熟悉非编码键盘的工作原理和键盘的扫描方式,熟悉键盘的去抖方法和键盘应用程序的应用;

3、熟悉51单片机中断功能的基本使用方法,熟悉定时器引发中断的方法和中断应用程序的应用;

实验方法:

1、通过keil软件编写控制单片机并实现相应功能的程序,并生成相应的hex文件;

2、将keil生成的hex文件通过STC-ISP软件导入到单片机中;

3、观察相应的实验现象;

4、根据实现现象优化相应代码。

实验步骤:

1、通过keil软件建立工程并添加文件;

2、编写控制单片机并实现相应功能的程序;

3、编译生成相应的hex文件;

4、将生成的hex文件通过STC-ISP软件导入到单片机中;

5、观察相应的实验现象;

6、根据实现现象优化相应代码。

实验效果:

因数码管图片过多,故截取相应几张呈现实验效果

温馨推荐

您可前往XX文库小程序

享受更优阅读体验

不去了

立即体验

实验代码:

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitSLock=P1^3;

voidlflash();//流水灯左移

voidrflash();//流水灯右移

voiddisplay0(uchar,uchar);//1、2位数码管显示

voiddisplay1(uchar,uchar);//3、4位数码管显示

voiddisplay2(uchar,uchar);//5、6位数码管显示

voiddisplay3(uchar,uchar);//7、8位数码管显示

voidclear();//数码管不显示且显示的数字清零

Ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucharnum=0,shi,ge,num0,key;

uchardox1,dox2;//左移、右移端口初始值

voidmatrixkeyscan();

//延时

voiddelayms(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//1、2位数码管显示

voiddisplay0(ucharshi,ucharge)

{

SLock=1;

P2=table[shi];

SLock=0;

P0=0xfe;

delayms(5);

SLock=1;

P2=table[ge];

SLock=0;

P0=0xfd;

delayms(5);

}

//3、4位数码管显示

voiddisplay1(ucharshi,ucharge){

SLock=1;

P2=table[shi];

SLock=0;

P0=0xfb;

delayms(5);

SLock=1;

P2=table[ge];

SLock=0;

P0=0xf7;

delayms(5);

}

//5、6位数码管显示

voiddisplay2(ucharshi,ucharge){

SLock=1;

P2=table[shi];

SLock=0;

P0=0xef;

delayms(5);

SLock=1;

P2=table[ge];

SLock=0;

P0=0xdf;

delayms(5);

}

//7、8位数码管显示

voiddisplay3(ucharshi,ucharge){

SLock=1;

P2=table[shi];

SLock=0;

P0=0xbf;

delayms(5);

SLock=1;

P2=table[ge];

SLock=0;

P0=0x7f;

}

voidclear()

{

P0=0xff;

P2=0xff;

num=0;

}

voidinit()

{

TMOD=0x01;

TH0=(65535-50000)/256;

TH0=(65535-50000)%256;

EA=1;

ET0=1;

}

voidT0_time(void)interrupt1{

TH0=(65535-50000)/256;

TH0=(65535-50000)%256;

num0++;

if(num0==5)

{

num0=0;

num++;

if(num==255)

num=0;

shi=num/16;

ge=num%16;

}

}

voidmatrixkeyscan()

{

uchartemp;

P3=0xfe;

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xee:

key=0;

break;

case0xde:

key=1;

break;

case0xbe:

key=2;

break;

case0x7e:

key=3;

break;

}

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

TR0=1;

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

delayms(10);

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xed:

key=4;

break;

case0xdd:

key=5;

break;

case0xbd:

key=6;

break;

case0x7d:

key=7;

break;

}

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

delayms(10);

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xeb:

key=8;

break;

}

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

}

voidmain()

{

init();

dox1=0x7f;

dox2=0x7f;

while

(1)

{

matrixkeyscan();

switch(key)

{

case0:

display0(shi,ge);

break;

case1:

display1(shi,ge);

break;

case2:

display2(shi,ge);

break;

case3:

display3(shi,ge);

break;

case4:

P2=0xaa;

break;

case5:

P2=0x55;

break;

case6:

lflash();

break;

case7:

rflash();

break;

case8:

TR0=0;

clear();

break;

}

}

}

//流水灯左移8位

voidlflash()

{

P2=dox1;

delayms(500);

dox1=_crol_(dox1,1);

}

//流水灯右移8位

voidrflash()

{

P2=dox2;

delayms(500);

dox2=_cror_(dox2,1);

}

心得体会:

在实现实验要求时原本打算在矩阵键盘扫描查询使用switch语句的时候,在case里面完成各功能子函数的调用以完成相应功能。

但在观察现象的时候明白无论是实现数码管的动态扫描还是led的循环移位,都需要放在while语句中反复执行。

后来通过扫描按键设置标志变量,主函数中反复检测标志变量的方法实现了对数码管和LED的控制,且这样编写的矩阵扫描子函数移植性更高。

数码管、按键综合应用的实验并不困难,但在实现过程中的思考是从未有过的。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2