数码管,我的超级LED
![[Pasted image 20250116130225.png]]
![[Pasted image 20250116134916.png]]
![[Pasted image 20250116130421.png]]
多个数码管共引脚连接节省接口
在同一个时刻相同引脚的数码管只能显示相同内容
动态数码管显示是根据人眼视觉残留与数码管余辉实现的
图中COM为公共端(数码管共阴极连接)
74HC245用于数据缓冲,防止传输的数据驱动能力不足
1. 数码管的静态控制
只在一个位置显示一个数字
#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. 数码管的动态控制
#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一个个像素点硬算和显卡直接计算打印的区别)
标签:case,P2,char,静态,unsigned,break,数码管,动态控制 From: https://www.cnblogs.com/surime/p/18675015