3.6 51单片机-动态数码管

举报
DS小龙哥 发表于 2021/12/09 23:06:22 2021/12/09
【摘要】 3.6 动态数码管   3.6.1 数码管原理图 图3-6-1  图3-6-2 注意:使用排线连接时,排线有金属触点的一片必须朝右 开发板连线说明: J21跳线帽接左边、JP165跳线帽断开、JP10(P0)接J12、JP16(右排)接JP8。 (数码管控制线)JP10接线详细说明:...

3.6 动态数码管

 

3.6.1 数码管原理图

图3-6-1 

图3-6-2

注意:使用排线连接时,排线有金属触点的一片必须朝右

开发板连线说明:

J21跳线帽接左边、JP165跳线帽断开、JP10(P0)接J12、JP16(右排)接JP8。

(数码管控制线)JP10接线详细说明: P0.0-->A   P0.1--->B …….

(数码管片选线)JP16接线详细说明:P1.0--->1   P1.1 --->2  ………..

3.6.2 数码管动态显示介绍

LED显示器工作方式有两种:静态显示方式和动态显示方式

静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。

数码管动态显示注意事项: 

1、每个数码显示的驻留时间合理,保证显示的亮度

2、多个数码管显示时扫描的频率合理,保证显示不闪烁

3.6.3 对共阴极数码管进行编码

通过得到的编码,定义成数组,小数点默认不点亮。 数字0~9

code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

3.6.4 对数码管片选端进行编码

code u8 LED_CS_Config[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

3.6.5 示例代码: 静态显示

下面代码实现,在8个数码管上轮流显示数字0~9(单个数码管的静态显示)。


  
  1. #include <reg51.h>
  2. //共阴极数码管编码(要显示的段就输出1)
  3. //数字0~9
  4. code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  5. //数码管的片选控制,查表选择法
  6. code u8 LED_CS_Config[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
  7. /*
  8. 静态数码管显示,共阴极数码管
  9. */
  10. #define LED_CS P1  //定义数码管的片选脚
  11. #define LED P0  //定义数码管的段选引脚
  12. void LED2_StaticDisplay(u8 number,u8 val)
  13. {
  14.     LED_CS=LED_CS_Config[number];//选择指定的数码管进行显示: 0~7
  15.     LED=LED2_Coding[val]; //显示数字: 0~9
  16. }
  17. //动态数码管一共有8个数码管
  18. //数码的控制端接P0端口
  19. //数码管的片选端接P1接口
  20. int main()
  21. {
  22.     u8 i,j;
  23.     while(1)
  24.     {
  25.         for(i=0;i<8;i++)
  26.         {
  27.             for(j=0;j<10;j++)
  28.             {
  29.                 LED2_StaticDisplay(i,j);
  30.                 DelayMs(500);
  31.             }
  32.         }
  33. }
  34. }

3.6.6 示例代码: 动态显示数字0~9

下面代码,实现在8个数码管上动态同时显示1234567数字。


  
  1. #include <reg51.h>
  2. //共阴极数码管编码(要显示的段就输出1)
  3. //数字0~9
  4. code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  5. //数码管的片选控制,查表选择法
  6. code u8 LED_CS_Config[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
  7. /*
  8. 静态数码管显示,共阴极数码管
  9. */
  10. #define LED_CS P1  //定义数码管的片选脚
  11. #define LED P0  //定义LED引脚
  12. //数码管的动态显示函数
  13. void LED_DemoDisplay(void)
  14. {
  15.     u16 i,j;
  16.     for(i=0;i<8;i++)
  17.     {
  18.         LED_CS=LED_CS_Config[i];//控制数码管的片选
  19.         LED=LED2_Coding[i];     //控制数码管的显示数据值
  20.         j = 180;                //扫描间隔时间设定
  21.         while(j--){}    
  22.         LED_CS=0xFF;            //消隐,所有数码管都不显示
  23. }
  24. }
  25. //动态数码管一共有8个数码管
  26. //数码的控制端接P0端口
  27. //数码管的片选端接P1接口
  28. int main()
  29. {
  30.     while(1)
  31.     {
  32.        LED_DemoDisplay();
  33.     }
  34. }

3.6.7 示例代码: 在数码管上显示指定的整数

要在数码管上显示指定的数据,需要先学会数位分离,将指定的一个整数分离出来。

示例代码:  将整数的每个位分离


  
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     unsigned int data=123;
  5.     printf("%d\n",data/10000000%10); //1
  6.     printf("%d\n",data/1000000%10);//2
  7.     printf("%d\n",data/100000%10);//3
  8.     printf("%d\n",data/10000%10);//4
  9.     printf("%d\n",data/1000%10);//5
  10.     printf("%d\n",data/100%10);//6
  11.     printf("%d\n",data/10%10);//7
  12.     printf("%d\n",data/1%10);//8
  13. return 0;
  14. }

数码管显示代码:动态右对齐显示指定的整数


  
  1. //共阴极数码管编码(要显示的段就输出1)
  2. //数字0~9
  3. code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  4. //数码管的片选控制,查表选择法
  5. code u8 LED_CS_Config[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
  6. /*静态数码管显示,共阴极数码管*/
  7. #define LED_CS P1  //定义数码管的片选脚
  8. #define LED P0    //定义LED引脚
  9. //设置数码管显示指定的数字
  10. void LED_DisplayNumber(unsigned long number)
  11. {
  12.     u16 i,j;
  13.     u8 display_data[8];//存放当前数码管显示的数据
  14.     //以下代码将number按十进制位从低到高依次提取并转为数码管显示字符
  15. display_data[0] = LED2_Coding[number/10000000%10];     
  16. display_data[1] = LED2_Coding[number/1000000%10];
  17.     display_data[2] = LED2_Coding[number/100000%10];
  18.     display_data[3] = LED2_Coding[number/10000%10];
  19.     display_data[4] = LED2_Coding[number/1000%10];
  20.     display_data[5] = LED2_Coding[number/100%10];
  21.     display_data[6] = LED2_Coding[number/10%10];
  22.     display_data[7] = LED2_Coding[number/1%10];
  23.     for(i=0;i<8;i++)
  24.     {
  25.         LED_CS=LED_CS_Config[i]; //控制数码管的片选
  26.         LED=display_data[i];     //控制数码管的显示数据值
  27.         j = 180;                 //扫描间隔时间设定
  28.         while(j--){}    
  29.         LED_CS=0xFF;             //消隐,所有数码管都不显示
  30.     }
  31. }
  32. int main()
  33. {
  34.     while(1)
  35.     {
  36.        LED_DisplayNumber(4579);
  37. }
  38. }

文章来源: xiaolong.blog.csdn.net,作者:DS小龙哥,版权归原作者所有,如需转载,请联系作者。

原文链接:xiaolong.blog.csdn.net/article/details/121017752

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。