找回密码
 立即注册
首页 业界区 安全 1. 数码管的静态动态控制

1. 数码管的静态动态控制

猷浮 2025-6-9 14:37:35
数码管,我的超级LED
![[Pasted image 20250116130225.png]]
![[Pasted image 20250116134916.png]]
![[Pasted image 20250116130421.png]]
多个数码管共引脚连接节省接口
在同一个时刻相同引脚的数码管只能显示相同内容
动态数码管显示是根据人眼视觉残留与数码管余辉实现的
图中COM为公共端(数码管共阴极连接)
74HC245用于数据缓冲,防止传输的数据驱动能力不足
1. 数码管的静态控制

只在一个位置显示一个数字
  1. #include <REGX52.H>
  2. void nixie(unsigned char location, unsigned char number);
  3. unsigned char nixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E,0x79, 0x71, 0x00};
  4. /*
  5.     @param location 用于确定数码管位置
  6.     @param number 用于传递要在数码管上显示的值
  7.     数码管的静态控制函数
  8. */
  9. void nixie(unsigned char location, unsigned char number)
  10. {
  11.     switch (location)
  12.     {
  13.     case 1:P2_4 = 1, P2_3 = 1, P2_2 = 1;break;  // LED8   
  14.     case 2:P2_4 = 1, P2_3 = 1, P2_2 = 0;break;  // LED7
  15.     case 3:P2_4 = 1, P2_3 = 0, P2_2 = 1;break;  // LED6
  16.     case 4:P2_4 = 1, P2_3 = 0, P2_2 = 0;break;  // LED5
  17.     case 5:P2_4 = 0, P2_3 = 1, P2_2 = 1;break;  // LED4
  18.     case 6:P2_4 = 0, P2_3 = 1, P2_2 = 0;break;  // LED3
  19.     case 7:P2_4 = 0, P2_3 = 0, P2_2 = 1;break;  // LED2
  20.     case 8:P2_4 = 0, P2_3 = 0, P2_2 = 0;break;  // LED1
  21.     }
  22.     P0 = nixieTable[number];
  23. }
  24. void main()
  25. {
  26.     nixie(7,8);
  27.     while (1)
  28.     {
  29.         /* code */
  30.     }
  31.    
  32. }
复制代码
2. 数码管的动态控制
  1. #include <REGX52.H>
  2. #include <INTRINS.H>
  3. void nixie(unsigned char location, unsigned char number);
  4. void Delay1ms();
  5. unsigned char nixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E,0x79, 0x71, 0x00};  
  6. void Delay1ms()                //@11.0592MHz
  7. {
  8.         unsigned char i, j;
  9.         _nop_();
  10.         i = 2;
  11.         j = 199;
  12.         do
  13.         {
  14.                 while (--j);
  15.         } while (--i);
  16. }
  17. void nixie(unsigned char location, unsigned char number)
  18. {
  19.     switch (location)
  20.     {
  21.     case 1:P2_4 = 1, P2_3 = 1, P2_2 = 1;break;  // LED8   
  22.     case 2:P2_4 = 1, P2_3 = 1, P2_2 = 0;break;  // LED7
  23.     case 3:P2_4 = 1, P2_3 = 0, P2_2 = 1;break;  // LED6
  24.     case 4:P2_4 = 1, P2_3 = 0, P2_2 = 0;break;  // LED5
  25.     case 5:P2_4 = 0, P2_3 = 1, P2_2 = 1;break;  // LED4
  26.     case 6:P2_4 = 0, P2_3 = 1, P2_2 = 0;break;  // LED3
  27.     case 7:P2_4 = 0, P2_3 = 0, P2_2 = 1;break;  // LED2
  28.     case 8:P2_4 = 0, P2_3 = 0, P2_2 = 0;break;  // LED1
  29.     }
  30.     P0 = nixieTable[number];
  31. }
  32. void main()
  33. {
  34.     while (1)
  35.     {
  36.         nixie(7,8);
  37.         Delay1ms();
  38.         nixie(6,7);
  39.         Delay1ms();
  40.         nixie(1,1);
  41.         Delay1ms();
  42.         nixie(3,2);
  43.         Delay1ms();
  44.     }
  45.    
  46. }
复制代码
实际上就是多次调用静态控制函数,并再调用一次后加上很小的延迟来起到同时显示的效果
若延迟给的过小或者没有给延迟,则数码管上会出现乱码;这是因为数码管先进行段选择再进行位置选择,多次调用静态控制函数实则在每一次调用后都会进行清零操作,之后再进行数码管段选择位置选择,因为单片机计算速度快导致在显示上人眼会看不出数字。
基于单片机动态控制数码管显示的方法实际上非常耗费硬件资源,实际应该使用专门的芯片来进行图像数据处理(CPU一个个像素点硬算和显卡直接计算打印的区别)

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册