51单片机学习之陆 —— 1.5 数码管的动态显示
(⊙﹏⊙)好久没有跟新了,最近太慢了(其实是太懒了)
好了今天来学习下数码管的动态显示吧
1 学习回顾,上节课学习了静态显示
我们显示了第一位数码管,并让其显示了8
现在我们试着多一些花样
1 点亮所有数码管让其显示6
编程
代码

注意上面已经写好了函数leddata
P0 = ox00;让所有数码管都打开
P0 = leddata[3];让数码管显示三
这时就达成了我们的目的了
2 让数码管从0到9循环显示间隔500毫秒
编程
代码:
1 #include<reg52.h> // 52系列单片机头文件 2 #define uint unsigned int 3 #define uchar unsigned char 4 sbit du = P2^6; //声明U1锁存器的锁存端 5 sbit we = P2^7; //声明U2锁存器的锁存端 6 uchar i; 7 8 unsigned code leddata[]={ 9 10 0x3F, //"0" 11 0x06, //"1" 12 0x5B, //"2" 13 0x4F, //"3" 14 0x66, //"4" 15 0x6D, //"5" 16 0x7D, //"6" 17 0x07, //"7" 18 0x7F, //"8" 19 0x6F, //"9" 20 0x77, //"A" 21 0x7C, //"B" 22 0x39, //"C" 23 0x5E, //"D" 24 0x79, //"E" 25 0x71, //"F" 26 0x76, //"H" 27 0x38, //"L" 28 0x37, //"n" 29 0x3E, //"u" 30 0x73, //"P" 31 0x5C, //"o" 32 0x40, //"-" 33 0x00, //熄灭 34 0x00 //自定义 35 36 }; 37 38 void delay(uint xms) 39 { 40 uint x, y; 41 for(x=xms; x>0; x--) 42 for(y=114; y>0; y--); 43 } 44 45 void main() 46 { 47 while(1) 48 { 49 50 we = 1; //打开U2锁存器 51 P0 = 0x00; //送入位选信号 52 we = 0; //关闭U2锁存器 其数据已被锁存 53 54 55 du = 1; //打开U1锁存器 56 P0 = leddata[i]; //送入端选信号 57 du = 0; //关闭U1锁存器 58 59 delay(500); 60 i++; 61 if(i == 10) 62 i=0; 63 64 65 } 66 }

头文件和宏定义

延时函数, 当y=114时,在11.0592mhz时差不多1ms
要延时500ms 就让x = 500即可

while 大循环
段选中
P0 = leddata[i];
其中i是定义的变量,没赋初值时自动赋初值0
延时500ms 后i++
由于是0 - 9
所以用if 判断i==10
假如加到10就清零。
这样就实现了我们的目标
2 数码管的动态显示
原理 :

数码管动态显示的实质就是利用了人眼视觉的暂留和二极管的余晖作用
由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
2 编程 目标-第一个数码管显示1 时间500ms 熄灭 第二个显示2 时间500ms
到第六个显示6 一直循环下去
1 #include<reg52.h> 2 #define uint unsigned int 3 #define uchar unsigned char 4 sbit du = P2^6; 5 sbit we = P2^7; 6 unsigned code leddata[]={ 7 8 0x3F, //"0" 9 0x06, //"1" 10 0x5B, //"2" 11 0x4F, //"3" 12 0x66, //"4" 13 0x6D, //"5" 14 0x7D, //"6" 15 0x07, //"7" 16 0x7F, //"8" 17 0x6F, //"9" 18 0x77, //"A" 19 0x7C, //"B" 20 0x39, //"C" 21 0x5E, //"D" 22 0x79, //"E" 23 0x71, //"F" 24 0x76, //"H" 25 0x38, //"L" 26 0x37, //"n" 27 0x3E, //"u" 28 0x73, //"P" 29 0x5C, //"o" 30 0x40, //"-" 31 0x00, //熄灭 32 0x00 //自定义 33 34 }; 35 36 37 void delay(uint xms) 38 { 39 uint x, y; 40 for(x=xms;x>0;x--) 41 for(y=114;y>0;y--); 42 } 43 44 void main() 45 { 46 while(1) 47 { 48 du = 1; 49 P0 = leddata[1]; 50 du = 0; 51 P0 = 0xff; 52 we = 1; 53 P0 = 0xfe; 54 we = 0; 55 delay(500); 56 57 du = 1; 58 P0 = leddata[2]; 59 du = 0; 60 P0 = 0xff; 61 we = 1; 62 P0 = 0xfd; 63 we = 0; 64 delay(500); 65 66 du = 1; 67 P0 = leddata[3]; 68 du = 0; 69 P0 = 0xff; 70 we = 1; 71 P0 = 0xfb; 72 we = 0; 73 delay(500); 74 75 du = 1; 76 P0 = leddata[4]; 77 du = 0; 78 P0 = 0xff; 79 we = 1; 80 P0 = 0xf7; 81 we = 0; 82 delay(500); 83 84 du = 1; 85 P0 = leddata[5]; 86 du = 0; 87 P0 = 0xff; 88 we = 1; 89 P0 = 0xef; 90 we = 0; 91 delay(500); 92 93 du = 1; 94 P0 = leddata[6]; 95 du = 0; 96 P0 = 0xff; 97 we = 1; 98 P0 = 0xdf; 99 we = 0; 100 delay(500); 101 102 } 103 104 105 106 107 }
3 分析

段选中让显示1
打开位选让第一个数码管经行显示
注意 在段选对P0 口经行操作后
P0 = 0xff;
这条语句的专业名称叫做消影

同学们也可试一试不加这条语句看看(偷笑,我第一次时就没加这条语句)
然后延时500ms
通过以上的代码就可以实现数码管的动态显示
4 补充
当我们延时500ms时还可以明显看出数码管的交换显示
假如我们将延时的时间调到10ms
同学们试试
再将时间调到1ms
这时我们发现数码管“好像”在静态显示123456

以上为我的个人理解
如若在博客中找到任何错误,请及时联系博主,我会及时更正博客
浙公网安备 33010602011771号