任务四 键控流水灯和LED数码管显示.ppt_第1页
任务四 键控流水灯和LED数码管显示.ppt_第2页
任务四 键控流水灯和LED数码管显示.ppt_第3页
任务四 键控流水灯和LED数码管显示.ppt_第4页
任务四 键控流水灯和LED数码管显示.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、任务四 键控流水灯和LED数码管显示,LED显示的原理,数码管的每段笔画其实就是一个单独的发光二极管,内部有两种不同的连接方式,若将各二极管的阳极都连在一起引出个公共端称共阳数码管,如图(a);若将各二极管的阴极都连在一起引出个公共端称共阴数码管如图(b);使用时将共阴数码管公共端接低电平,若某笔画端接高电平则对应笔画点亮,共阳反之。所以购买和使用时必须高清是共阳还是共阴的。,4.1 LED显示,LED的显示可分静态和动态显示。静态显示是各只数码管单独用一只显示译码器,单片机与显示器的连接如下图如示:,当某只数码管要显示某一数或字符时单片机向该管的锁存端发允许写入电平,并向P1口发出显示的十六

2、进制数,其余管不允许写入,接着发锁存信号。,共阳数码管组成的动态扫描电路,LED显示动态显示的原理 静态显示的优点显示稳定,不存在闪烁。与CPU并行工作。但从静态显示的硬件可以看出,当选用的数码管越多,译码器的数量也随之增多,这样会增加硬件的开销。为此人们采用动态显示。如图所示,位选口,字型口,动态显示的原理 某一时刻位选先选通其中一位,如对图中的共阳数码管,要使最左边位能点亮,则令P2.0为0,其余位选位均为1;这时在字型口输出该位要显示的数字(或字符)的字型,亮1ms左右;接着位选选通另一位,其余位选关闭,字型口输出该位要显示的数字(或字符)的字型,虽然这时前一位位选已关闭,但基于眼睛的惰

3、性,前一位显示的数字或字型还留在眼中,依次一位位循环显示下去,直至最后一位显示完毕,一个动态扫描显示过程结束。 可见动态扫描显示是在执行动态扫描显示程序的。要连续显示必须反复的去执行动态扫描显示程序。一般可把动态扫描显示编成个子函数,主函数反复去调用它。人眼的惰性有一定时间,一般10ms左右, 超过这一时间再去执行显示程序,它就会闪烁,所以LED的位数不能太多。,动态扫描具体实现方法:,显示缓冲区,首先在内部数据存储器的若干连续单元中开辟一个显示缓冲区数组,每个单元顺序对应一个数码管,在调用动态扫描子函数以前,先在数组中写入各数码管要显示的数字和字符在字型表中离开表头位置的值,这样当动态扫描显

4、示程序要向字型口输出字型时,只要读得该对应缓冲区内的值,通过查字型表获得输出字型。注意不是把缓冲单元的值直接输出。,待显示信息数组,动态扫描子程序流程图:,P1TABa1,P3r,i0 r01,a1dti,r=0 x20?或i=6,ii+1 r r1,调用延时 1MS子函数,TAB =0 x3F ,0 x06 ,0 x5B,0 x4F, 0 x66, 0 x6D, 0 x7D,0 x07,0 x7F, 0 x67。 0 x71;,#include unsigned char code dt=0 x01,0 x02,0 x03,0 x04,0 x05,0 x06; /待显示的信息在显示缓冲区数组

5、; unsigned char code TAB_Font=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x83,0 xF8,0 x8 0,0 x90,0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E,0 x8C,0 xFF,0 x89;/共 阳字型表数组 unsigned r=1; /位输出口初值,选中最左位LED void delay1 (unsigned int); /延时1ms子函数原型说明 main() /主函数 unsigned chaar i=0,a; /定义变量i 显示缓冲区数组元素,指针,a某位待输出信息 while (1)

6、 P2=r; / 选中某一位 a=dti; /从显示缓冲区数组取出该位显示信息 P0=TAB_Fonta; / 查字型表,输出字型 delay1 (1); /延时1ms r=1; /扫描位左移(在实际图中即右移) i+; /指针加1 if(r=0 x40) r=1; /6 位扫描结束判断 i=0; / 结束后指针复位 ,/ 延时程序1 void delay1 (unsigned int ms) unsigned int i,j; for(i=0;ims;i+) for(j=0;j60;j+) ; ,动态显示作为子函数的程序设计 #include unsigned char code dt=0

7、x01,0 x02,0 x03,0 x04,0 x05,0 x06; unsigned char code TAB_Font=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x83,0 xF8,0 x80,0 x90,0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E,0 x8C,0 xFF,0 x89; unsigned r=1; unsigned i=0,a; void delay1 (unsigned int); display();,main() while (1) display( ); display( ) / LED动态扫描显示子函

8、数 r=1; /1位选通,要根据数码管类型和硬件电路决 定,若0选通应该为r=0 xfe; i=0; while (r!=0 x40) / 6个数码管没全扫完,继续扫描 P3=r; /选通某位 a=dti; /显示缓冲区去该位要显示的内容 P0=TAB_Fonta;/查字型表向字型口输出字型 delay1 (1); /延时1ms r=1; i+; /移位选中下一数码管,指针修正 P0=0 xff; /字型口送熄灭符 ,Proteus演示硬件图,4位数码管动态显示实例,笔画1点亮的LED字型TAB =0 x3FH,0 x06 ,0 x5B ,0 x4F, 0 x66. 0 x6D, (显示: 0

9、 1 2 3 4 5 0 x7D,0 x07,0 x7F, 0 x67,0 x77 ,0 x7C ,0 x39 ,0 x5E, 0 x79, 0X71, 6 7 8 9 A B C D E F 0X73, 0X76, 0X00,0X6E ; (显示: P H 熄灭 Y ),笔画0点亮的LED字型表 TAB =0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x83, (显示: 0 1 2 3 4 5 6 0 xF8,0 x80,0 x90,0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E, 7 8 9 A B C D E F 0 x8C,0 x8

10、9, 0 xFF,0 x91 ; (显示: P H 熄灭 Y ),Proteus演示硬件图,练习: 1、画出单片机控制6共阳LED数码管显示的电路图1,P0和P3口分别为字型口和位选口。 2、用主子函数结构调试6管LED动态扫描程序 3、在图1的基础上,将其改为6位共阴数码管,P2和P3分别为位选和字型口。编程调试。,练习2 将显示年月日“(140416)、”班级学号”(A3-05)、“P ”(P后面5个空格)和“H-”四种不同的显示方式,在同一程序中以2S轮流循环显示。 练习3 编程将unsigned char a=567892的值在6位LED中显示出来。,unsigned char cod

11、e dt=1,4,0,4,1,6, 10,3,0 x14,0 x14,0,2, 0 x10,0 x12,0 x12,0 x12,0 x12,0 x12, 0 x11,0 x14,0 x14,0 x14,0 x14,0 x14; unsigned char code TAB_Font=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D, 0 x07,0 x7F,0 x67,0 x77,0 x3D,0 x39,0 x5E,0 x79,0X71,0X73,0X76,0X00,0X6E,0 x40; void delay1 (unsigned int); display

12、(); unsigned char i; / unsigned char count=200;/,main() ET0=1; / T0允许中断 EA=1; /CPU允许中断 TMOD=0 x11; /T0定时方式1 TH0=-100008; /定时时间10ms TL0=-10000; TR0=1; /定时器启动开始定时 P0=0 x00; /字型熄灭 P3=0 xff; /位选关闭 i=0; /显示缓冲区取数指针复零 while (1) if (count=0) /如果定时2S时间到 count=200; /外部定时计数器置初值 i=i+6; /显示缓冲区调整到下一显示区,if(i=24) /

13、四种显示内容都显示完毕,指针重新调整到第 i=0; /一显视区 display( ); /调用显示子函数 display( ) / LED动态扫描显示子函数 unsigned char r=0 xfe; unsigned char a,j=0; r=0 xfe; /1位选通,要根据数码管类型和硬件电路决定,若0选通应该为 r=0 xfe; while (j6) / 6个数码管没全扫完,继续扫描 P3=r; /选通某位 a=dti+j; /显示缓冲区去该位要显示的内容 P0=TAB_Fonta;/查字型表向字型口输出字型 delay1 (1); /延时1ms r=1; r|=1; /移位选中下一

14、数码管,指针修正 j+; P0=0 x00; / 6个数码管没全完,输出熄灭字型。 ,/*延时程序*/ void delay1 (unsigned int ms) unsigned int i,j; for(i=0;i8; TL0=-10000; count-; ,42 查键程序 键盘作为单片机应用系统最常见的输入设备,在一般的应用系统中都是必须的。键个数比较少时,可采用独立式键盘,即每个键单独与单片机的一个I/O口相连,如图所示,当键的个数较多时,可采用非独立式键盘(行列矩阵式),如图所示。,键盘的抖动和消抖,独立式键盘键 判断和处理流程,案例1、 P1口分别接K0、K1、K2和K3四个按键

15、,P2.0、P2.1、P2.2和P2.3分别接着LDE0、LED1、LED2、LED3四个发光二极管,试编程 要求四个按键按下后使对应的LED点亮(其余不亮,按键释放后一直亮着)。,P1=0 xff;key=P1|0 xf0; if(key!=0 xff) delay1(10); key=P1|0 xf0; if(key!=0 xff) 根据不同键值转各自处理 while( (P1|0 xf0)!=0 xff) delay1(10); ,/输出接口用位输出编程 #include unsigned key; sbit p2_0=P20; sbit p2_1=P21; sbit p2_2=P22;

16、 sbit p2_3=P23; /定义各位输出接口 void delay1 (unsigned int); /延时子函数原型说明 display ( ); /动态扫描子函数原型说明 main( ) while(1) key=P1|0 xf0; /读入键状态 if(key!=0 xff) delay1(10);,key=P1|0 xf0; /再次读入键状态 if(key!=0 xff) /确有键输入 if (key=0 xfe) /K0键按下,处理 p2_0=0; p2_1=1; p2_2=1;p2_3=1; else if (key=0 xfd) /K1键按下,处理 p2_0=1; p2_1=

17、0; p2_2=1;p2_3=1; if (key=0 xfe) /K2键按下,处理 p2_0=1; p2_1=1; p2_2=0;p2_3=1; else if /K3键按下,处理 p2_0=1; p2_1=1; p2_2=1;p2_3=0; while(P1|0 xf0)!=0 xff); /等待按键释放 delay1(10); /延时10ms消抖 ,/输出接口用字节输出编程,分支语句用switch_case #include unsigned key_value; void delay1 (unsigned int); /延时子函数原型说明 display ( ); /动态扫描子函数原型

18、说明 main( ) while(1) key_value=P1|0 xf0; /读入键状态 if(key!=0 xff) delay1(10);,key=P1|0 xf0; /再次读入键状态 if(key!=0 xff) /确有键输入 swictch(key) case 0 xfe: P2=0 xfe; break;/K0键按下,处理 case 0 xfd: P2=0 xfd; break; /K1键按下,处理 case 0 xfb: P2=0 xfb; break;/K2键按下,处理 case 0 xf7: P2=0 xf7; break;/K3键按下,处理 default : P2=0

19、xff; while(P1|0 xf0)!=0 xff); /等待按键释放 delay1(10); /延时10ms消抖 本例中键值key与P2输出值刚好一致,不必判断可直接输出。,练习1、 P1口分别接K0、K1、K2和K3四个按键,P0口接着8盏流水灯。试编程要求四个按键按下后使对应: 1、使流水灯循环左移一位(只亮一盏灯) 2、使流水灯循环右移一位(只亮一盏灯) 3、使流水灯循环左移一位(逐点点亮) 4、使流水灯循环左移一位(逐点点亮),#include bit flage=0; void delay1 (unsigned int); display(); main( ) unsigned

20、 key; P0=0 x00; j1=0; P3=0 xff; while(1) P1=0 xff; /输入端口先写1 key=P1|0 xf0; /读入开关状态(使高4位为1) if(key!=0 xff) /有键按下,key=P1|0 xf0; if(key!=0 xff) / switch (key) case 0 xfe:P0=1;P0|=0 x80; if (P0=0 xff)P0=0 x7f;break; case 0 xfb:P0=1; if (P0=0 x00)flage=!flage;if(flage=1) P0=0 x7f;flage=1;break;,default: P

21、0=0 xff; while(P1|0 xf0)!=0 xff); /等待按键释放 delay1(10); /*- 延时程序1 - */ void delay1 (unsigned int ms) unsigned int i,j; for(i=0;ims;i+) for(j=0;j60;j+) ;,案例2、 P1口分别接K0、K1、K2和K3四个按键,P0口和P3口分别为6位数码管的字型和位选口,试编程 要求K0、K1、K2和K3四个按键按下后,分别显示年月日(14xxxx)、时间( xx:xx ,时和分) 、班级和学号(A3-06)、和(P ,最左边P其余熄灭符) ,键没按过显示(1234

22、56)。,案例2的源程序,#include unsigned char code dt=1,4,0,4,1,6, 10,3,0 x14,0,0,2, 0 x10,0 x12,0 x12,0 x12,0 x12,0 x12, 0 x11,0 x14,0 x14,0 x14,0 x14,0 x14; unsigned char code TAB_Font=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D, 0 x07,0 x7F,0 x67,0 x77,0 x3D,0 x39,0 x5E,0 x79,0X71,0X73,0X76,0X00,0X6E,0 x40;

23、unsigned char code TAB_bit=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf; unsigned char count=100; unsigned char j1; /四种显示形式的取数指针 bit flage=0; /为使没键按下过不显示任何信息设位标志,main( ) unsigned key; P0=0 x00; j1=0; P3=0 xff; while(1) P1=0 xff; /输入端口先写1 key=P1|0 xf0; /读入开关状态(使高4位为1) if(key!=0 xff) /有键按下 flage=1; display ( )

24、;display ( ); /用调用显示子函数来软件延时 key=P1|0 xf0; if(key!=0 xff) / 再次读入键值, switch (key) case 0 xfe:j1=0;break; case 0 xfd:j1=6;break; case 0 xfb:j1=12;break; case 0 xf7:j1=18;break; default:j1=0; while(P1|0 xf0)!=0 xff) display( ); /等待按键释放 display( ); display( ); void delay1 (unsigned int ms) unsigned int i,j; for(i=0;ims;i+) for(j=0;j60;j+) ;,display( ) / LED动态扫描显示子函数 unsigned i=0,a; while (i6) / 6个数码管没全扫完,继续扫描 P3=TAB_biti; /选通某位 a=dtj1+i; /显示缓冲区去该位要显示的内容 P0=TAB_Fonta;/查字型表向字型口输出字型

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论