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

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

1. 数码管的静态控制

只在一个位置显示一个数字

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
#include <REGX52.H> void nixie(unsigned char location, unsigned char number); unsigned char nixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E,0x79, 0x71, 0x00}; /* @param location 用于确定数码管位置 @param number 用于传递要在数码管上显示的值 数码管的静态控制函数 */ void nixie(unsigned char location, unsigned char number) { switch (location) { case 1:P2_4 = 1, P2_3 = 1, P2_2 = 1;break; // LED8 case 2:P2_4 = 1, P2_3 = 1, P2_2 = 0;break; // LED7 case 3:P2_4 = 1, P2_3 = 0, P2_2 = 1;break; // LED6 case 4:P2_4 = 1, P2_3 = 0, P2_2 = 0;break; // LED5 case 5:P2_4 = 0, P2_3 = 1, P2_2 = 1;break; // LED4 case 6:P2_4 = 0, P2_3 = 1, P2_2 = 0;break; // LED3 case 7:P2_4 = 0, P2_3 = 0, P2_2 = 1;break; // LED2 case 8:P2_4 = 0, P2_3 = 0, P2_2 = 0;break; // LED1 } P0 = nixieTable[number]; } void main() { nixie(7,8); while (1) { /* code */ } }

2. 数码管的动态控制

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
#include <REGX52.H> #include <INTRINS.H> void nixie(unsigned char location, unsigned char number); void Delay1ms(); unsigned char nixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E,0x79, 0x71, 0x00}; void Delay1ms() //@11.0592MHz { unsigned char i, j; _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } void nixie(unsigned char location, unsigned char number) { switch (location) { case 1:P2_4 = 1, P2_3 = 1, P2_2 = 1;break; // LED8 case 2:P2_4 = 1, P2_3 = 1, P2_2 = 0;break; // LED7 case 3:P2_4 = 1, P2_3 = 0, P2_2 = 1;break; // LED6 case 4:P2_4 = 1, P2_3 = 0, P2_2 = 0;break; // LED5 case 5:P2_4 = 0, P2_3 = 1, P2_2 = 1;break; // LED4 case 6:P2_4 = 0, P2_3 = 1, P2_2 = 0;break; // LED3 case 7:P2_4 = 0, P2_3 = 0, P2_2 = 1;break; // LED2 case 8:P2_4 = 0, P2_3 = 0, P2_2 = 0;break; // LED1 } P0 = nixieTable[number]; } void main() { while (1) { nixie(7,8); Delay1ms(); nixie(6,7); Delay1ms(); nixie(1,1); Delay1ms(); nixie(3,2); Delay1ms(); } }

实际上就是多次调用静态控制函数,并再调用一次后加上很小的延迟来起到同时显示的效果

若延迟给的过小或者没有给延迟,则数码管上会出现乱码;这是因为数码管先进行段选择再进行位置选择,多次调用静态控制函数实则在每一次调用后都会进行清零操作,之后再进行数码管段选择位置选择,因为单片机计算速度快导致在显示上人眼会看不出数字。

基于单片机动态控制数码管显示的方法实际上非常耗费硬件资源,实际应该使用专门的芯片来进行图像数据处理(CPU一个个像素点硬算和显卡直接计算打印的区别)

posted @   Lain_surime  阅读(19)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开