找回密码
 立即注册
搜索
热搜: 中医 针灸 咳嗽
查看: 125|回复: 0

动态扫描数码管

[复制链接]

3706

主题

1

回帖

1万

积分

管理员

积分
11870
发表于 2023-1-17 19:14:44 | 显示全部楼层 |阅读模式
  1. /*动态数码管*/
  2. #include <reg52.h>
  3. #define Uint  unsigned int
  4. #define Uchar unsigned char
  5. #define Ulong unsigned long

  6. sbit DU = P2 ^ 6; // 数码管段选
  7. sbit WE = P2 ^ 7; // 位选

  8. /* 8位选参照表
  9. FE 1
  10. FD 2
  11. fb 3
  12. f7 4
  13. ef 5
  14. df 6
  15. bf 7
  16. 7f 8
  17. */
  18. // 段选参照表
  19. //  0x06,  //"1"
  20. //  0x5B,  //"2"
  21. //  0x4F,  //"3"
  22. //  0x66,  //"4"
  23. //  0x6D,  //"5"
  24. //  0x7D,  //"6"
  25. //  0x07,  //"7"
  26. //  0x7F,  //"8"
  27. //  0x6F,  //"9"
  28. //  0x06,  //"1"
  29. //  0x5B,  //"2"
  30. //  0x4F,  //"3"
  31. //  0x66,  //"4"
  32. //  0x6D,  //"5"
  33. //  0x7D,  //"6"
  34. //  0x07,  //"7"
  35. //  0x7F,  //"8"
  36. //  0x6F,  //"9"
  37. //  0x7C,  //"B"
  38. //  0x39,  //"C"
  39. //  0x5E,  //"D"
  40. //  0x79,  //"E"
  41. //  0x71,  //"F"
  42. //  0x76,  //"H"
  43. //  0x38,  //"L"
  44. //  0x40,  //"-"
  45. //  0x00,  //熄灭
  46. //  */

  47. // 函数声明

  48. void showval(Uchar val, Uchar WEval);
  49. void delay(Uchar z, int mod);
  50. void display(Ulong Z);

  51. Uchar code DUtabel[] = {
  52.     0x3F,
  53.     0x06,
  54.     0x5B,
  55.     0x4F,
  56.     0x66,
  57.     0x6D,
  58.     0x7D,
  59.     0x07,
  60.     0x7F,
  61.     0x6F,
  62.     0x77,
  63.     0x7C,
  64.     0x39,
  65.     0x5E,
  66.     0x79,
  67.     0x71,
  68.     0x76,
  69.     0x38,
  70.     0x40,
  71.     0x00,
  72. };

  73. Uchar code WEtabel[] = {
  74.     0x00, // 全亮,补位选空位
  75.     0xFE,
  76.     0xFD,
  77.     0xfb,
  78.     0xf7,
  79.     0xef,
  80.     0xdf,
  81.     0xbf,
  82.     0x7f,
  83. };

  84. void main()
  85. {
  86.     long int a=0;
  87.     while (1) {

  88.         display(333);
  89.     }
  90. }
  91. /*
  92. 数码管显示函数:
  93. 参数1:显示的数据0-9
  94. 参数2:需要在显示的位1-8
  95. */
  96. void showval(Uchar val, Uchar WEval)
  97. {

  98.    
  99.     WE = 1;              // 打开位选锁存
  100.     P0 = WEtabel[WEval]; // 选择位选
  101.     WE = 0;              // 位锁存
  102.    
  103.    
  104.     DU = 1;            // 打开段选锁存器
  105.     P0 = DUtabel[val]; // 送数据
  106.     DU = 0;            // 段锁存
  107.    
  108.    
  109. }
  110. /*
  111. 延迟函数.
  112. 参数1:z为数量
  113. 参数2:mod为模式
  114. 1:毫秒
  115. 2:秒
  116. */
  117. void delay(Uchar z, int mod)
  118. {
  119.     Ulong i;
  120.     if (mod == 1) {
  121.         for (i = 0; i < z; i++) {

  122.             unsigned char a, b;
  123.             for (b = 102; b > 0; b--)
  124.                 for (a = 3; a > 0; a--)
  125.                     ;
  126.         }
  127.     }

  128.     else if (mod == 2) {
  129.         for (i = 0; i < z * 1000; i++) {
  130.             // 10000us //误差 -0.000000000002us
  131.             unsigned char a, b;
  132.             for (b = 102; b > 0; b--)
  133.                 for (a = 3; a > 0; a--) ;
  134.         }
  135.     }
  136. }
  137. /*显示长数字*/
  138. void display(Ulong Z)
  139. {
  140.     // Z长度
  141.     int Zlen = 0;
  142.     /*存储Z每个位的数字数组变量*/
  143.     int val[8];
  144.     int i;

  145.     while (Z != 0) {
  146.         // 提取n的各个数位上的数
  147.         val[Zlen++] = Z % 10;
  148.         Z /= 10;
  149.     }

  150.     for (i = 0; i < Zlen; i++) {
  151.         P0 = 0XFF;           // 清除段码
  152.         showval(val[i], 8 - i);
  153.         delay(5, 1);
  154.     }
  155.    
  156. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|私人站点 ( 冀ICP备2023028127号-2 )

GMT+8, 2025-4-20 01:49 , Processed in 0.090101 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表