1. 數碼管的靜態動態控制

Lain_surime發表於2025-01-18

數碼管,我的超級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一個個畫素點硬算和顯示卡直接計算列印的區別)

相關文章