当前位置:   article > 正文

c51单片机的八位静态数码管显示编程_通过编写c51程序,利用单片机控制数码管静态显示和动态显示字符。 1.控制8段共阴极

通过编写c51程序,利用单片机控制数码管静态显示和动态显示字符。 1.控制8段共阴极

前言

所谓静态显示,就是每一个数码管的段码都要独占具有锁存功能的输出口CPU把要显示的字码送到输出口上,就可以使 数码管显示 对应的字符,直到下一次送出另一个字码之前,显示的内容一直不会消失。

目录

 一、数码管简介

二、.静态数码管显示原理

三、代码

 一、数码管简介

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极 COM 接到+5V 共阴数码管是指将所有发光二板管的阴板接到一起形成公共阴 极(COM) 的数 码管,共阴数码管在应用时应将公共极 COM 接到地线 GND上。

共阳极是指数码管内部LED的正极接在一起,想要点亮LED,拉低相应的负极即可。 共阴极是指数码管内部LED的负极接在一起,想要点亮LED,拉高相应的正极即可。其编码是让数码管显示数字时,对应的IO输出的高低电平。顺序为:dp, g ,f ,e, d, c, b, a。欲使其亮,共阴极时,阴极应送低电平;共阳极时,阳极应送高电平。

二、.静态数码管显示原理

多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,否则一体的多位同时显示必须时显示相同内容。当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选的信号都是相同的,那么他们显示的数字必定一样。(换言之,你可以通过位选控制那个数码管亮,但是亮的同时显示的数字必定相同)

注:因为共阳极数码管,所以位选接的是高电平,要想正常显示通过控制低电平来控制段选即可。

数码管硬件电路原理图:

硬件原理图
​​​​

以下是八段数码管0-9显示代码表:

共阳极字形码:0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e

共阴极字形码:0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71。

本实验采取的是共阴极的数码管静态显示,8位数码管从左到右显示为“20231221”。

字位码是位选,就是用公共端控制让8个数码管的哪一个数码管显示数字。

三、代码

  1. #include "regx52.h"
  2. #include "intrins.h"
  3. //延时函数
  4. void Delay1_ms(unsigned int a) //@11.0592MHz
  5. {
  6. unsigned char i, j;
  7. for(a;a>0;a--)
  8. {
  9. _nop_();
  10. i = 2;
  11. j = 199;
  12. do
  13. {
  14. while (--j);
  15. } while (--i);
  16. }
  17. }
  18. // 0 1 2 3 4 5 6 7 8 9
  19. unsigned char meg_code[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  20. //定义数码管引脚
  21. sbit HC_Y0 = P2^2;
  22. sbit HC_Y1 = P2^3;
  23. sbit HC_Y2 = P2^4;
  24. void SMG_Select(unsigned char n)
  25. {
  26. switch(n)
  27. {
  28. case 1:
  29. HC_Y0 = 0;//低位
  30. HC_Y1 = 0;
  31. HC_Y2 = 0;
  32. break;
  33. case 2:
  34. HC_Y0 = 1;//高位
  35. HC_Y1 = 0;
  36. HC_Y2 = 0;
  37. break;
  38. case 3:
  39. HC_Y0 = 0;
  40. HC_Y1 = 1;
  41. HC_Y2 = 0;
  42. break;
  43. case 4:
  44. HC_Y0 = 1;
  45. HC_Y1 = 1;
  46. HC_Y2 = 0;
  47. break;
  48. case 5:
  49. HC_Y0 = 0;
  50. HC_Y1 = 0;
  51. HC_Y2 = 1;
  52. break;
  53. case 6:
  54. HC_Y0 = 1;
  55. HC_Y1 = 0;
  56. HC_Y2 = 1;
  57. break;
  58. case 7:
  59. HC_Y0 = 0;
  60. HC_Y1 = 1;
  61. HC_Y2 = 1;
  62. break;
  63. case 8:
  64. HC_Y0 = 1;
  65. HC_Y1 = 1;
  66. HC_Y2 = 1;
  67. break;
  68. }
  69. }
  70. void Show_Num(long num)
  71. {
  72. //第一种诸位显示
  73. char sn = 0;
  74. SMG_Select(1);
  75. num = num/10; //12345/10=0
  76. sn = num%10;
  77. P0 = meg_code[sn]; //数组第一位数据赋值给数码管段选口
  78. Delay1_ms(3);
  79. num = num/10; //12345/10=1234
  80. SMG_Select(2);
  81. sn = num%10;
  82. P0 = meg_code[sn]; //12345%10=4
  83. Delay1_ms(3);
  84. num = num/10; //12345/10=123
  85. SMG_Select(3);
  86. sn = num%10;
  87. P0 = meg_code[sn]; //12345%10=3
  88. Delay1_ms(3);
  89. num = num/10; //12345/10=12
  90. SMG_Select(4);
  91. sn = num%10;
  92. P0 = meg_code[sn]; //12345%10=2
  93. Delay1_ms(3);
  94. num = num/10; //12345/10=1
  95. SMG_Select(5);
  96. sn = num%10;
  97. P0 = meg_code[sn]; //12345%10=1
  98. Delay1_ms(3);
  99. //第二种使用for循环
  100. char i =0;
  101. for(i=1;i<=8;i++) //8位数码管循环8次
  102. {
  103. SMG_Select(i); //第一位数码管
  104. P0 = meg_code[num%10]; //取出传入参数的个位数的值
  105. Delay1_ms(1);
  106. P0 = 0x00; //消影
  107. num = num/10; //取完个位数之后除以10,去掉当前个位数
  108. if(num<=0)
  109. break;
  110. }
  111. }
  112. void main()
  113. {
  114. while(1)
  115. {
  116. Show_Num(20231221);//数码管显示的数字
  117. }
  118. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/709375
推荐阅读
相关标签
  

闽ICP备14008679号