⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 displaydir.c

📁 proteus电子钟(带闹钟数码管显示)
💻 C
字号:
// 为了便于阅读和打印,最大行长为100个字符.
//	 1	   2	     3	       4	 5	   6	     7	       8	 9	   A
//34567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
/*------------------------------------------------------------------------------------------------*-
	****A****			****A****		SEG_A 	...... Px.0 ---- 1	 
	|		|	 ...	|		|		SEG_B 	...... Px.1 ---- 2
	F		B			F		B		SEG_C 	...... Px.2 ---- 4
	|		|	 ...	|		|		SEG_D 	...... Px.3 ---- 8
	****G****			****G****		SEG_E 	...... Px.4 ---- 1
	|		|	 ...	|		|		SEG_F 	...... Px.5 ---- 2
	E		C			E		C  	 	SEG_G 	...... Px.6 ---- 4
	|		|	 ...	|		|	 	SEG_Dot	...... Px.7 ---- 8
	****D****.>Dot		****D****.>Dot	
	    |			   		 |				Px.Y(Y = 0 ~ 7)
	    |			   		 |________  	Dis_COMx ..... Px.Y		
	    |						.	   .
	    |						.	   .
	    |						.	   .		
	    |________________________________	Dis_COM0 ..... Px.0
	//  LED.0	...	    LED.x			    	
		
-*------------------------------------------------------------------------------------------------*/
#include "main.h"
#include "port.h"
#include "SysTick.h"
#include "DisplayDir.h"


// 数码显示初始化
uint8_t DisplayBuffer[MAX_DISP_BITS] = {
	1, 2, 3, 4
};

bool bUpdateDisplayEn;

// 数码管是否是共阳极?
//#define Is_Anode	
// 还是数码管共阴极?
//#define Is_Cathode	
// SEG线硬件连接方法定义(某位为 '1' 表示与数码管相对应的引脚相连)
#define SEG_A		0x01
#define	SEG_B		0x02
#define	SEG_C		0x04
#define	SEG_D		0x08
#define	SEG_E		0x10
#define	SEG_F		0x20
#define	SEG_G		0x40
#define	SEG_Dot		0x80

uint8_t code DispCode[] =
{
	//#ifdef Is_Anode
	(SEG_A+SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),					// 0
	(SEG_B|SEG_C),											// 1
	(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),						// 2
	(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),						// 3
	(SEG_B|SEG_C|SEG_F|SEG_G),								// 4
	(SEG_A|SEG_C|SEG_D|SEG_G|SEG_F),						// 5	
	(SEG_A|SEG_C|SEG_D|SEG_E|SEG_G|SEG_F),					// 6	
	(SEG_A|SEG_B|SEG_C),									// 7
	(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),			// 8
    (SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),					// 9
	'\0',
	(SEG_A|SEG_F|SEG_G|SEG_C|SEG_D),						// S
	(SEG_A|SEG_F|SEG_G|SEG_E|SEG_D),						// E
	(SEG_F|SEG_E|SEG_D)										// L
};


// 是否是高电平位选?
#define Is_HIGH_bool_SELECT
// 还是低电平位选?
//#define Is_LOW_bool_SELECT
// COM线接口定义(某位为 '1' 表示对位COM线位选)
#define COM0_CS		0x00
#define	COM1_CS		0x01
#define	COM2_CS		0x02
#define	COM3_CS		0x03
#define	COM4_CS		0x04
#define	COM5_CS		0x05
#define	COM6_CS		0x06
#define	COM7_CS		0x07

uint8_t code CS_Control[] =
{
	COM0_CS,
	COM1_CS,
	COM2_CS,
	COM3_CS	
};



/*LED数码管工作模式控制字*/
/*工作模式包含三种, 	1> 点位同时闪烁
					  	2> 点位分别闪烁
					  	3> 点位不闪烁  			  
*/
uint8_t LED_TMOD = 0x00;

/*点闪烁总使能标志为1点闪动*/
bool g_DFlashEn = 0;
/*位闪烁总使能标志为1位闪动*/
bool g_BFlashEn = 0;

/*用于切换点的闪烁状态,闪烁或不闪烁*/
static bool DFlash;
/*用于切换位的闪烁状态,闪烁或不闪烁*/
static bool BFlash;

/*数码管闪烁标志*/
uint8_t bdata LedChangeFlag;
// 闪烁点:Blink,为1的位闪动
sbit Dlink1 = LedChangeFlag^0;	/*时十位点 为1的位闪动*/
sbit Dlink2 = LedChangeFlag^1;
sbit Dlink3 = LedChangeFlag^2;
sbit Dlink4 = LedChangeFlag^3;	/*分个位点 为1的位闪动*/

// 闪烁位:Blink,为1的位闪动
sbit Blink1 = LedChangeFlag^4;	/*时十位*/
sbit Blink2 = LedChangeFlag^5;	/*时个位*/
sbit Blink3 = LedChangeFlag^6;	/*分十位*/
sbit Blink4 = LedChangeFlag^7;	/*分个位*/


/*-------------------------------------------------------------------------------------------------------*-
	关于数码管显示的各寄存器的应用说明:
// 任意位和任意点可以同时闪烁(点位总使能开同时开)
#define LED_DISP_ALL_FLASH()		do{LED_TMOD = 0x00; g_DFlashEn = 1;	g_BFlashEn = 1;}while(0)

-*-------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------*-
 * 函数名称: LedDisplay()
 * 参    数: XX
 * 返    回: XX
 * 函数功能: 数码显示
 *              
 * 说     明: 
 *
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl           	* 修    改:  
 * 版本信息: 2006-09-14         * 修改信息: 

-*-------------------------------------------------------------------------------------------------------*/
void LedDisplay(void)
{
	static uint8_t BitCnt;

	// 关数码管消隐
	COM_LINE |= (1<<COM0_CS)|(1<<COM1_CS)|(1<<COM2_CS)|(1<<COM3_CS);	

	
	// 任意位和任意点可以同时闪烁(点位总使能开同时开)
	if ( DFlash )	
	{
		switch (BitCnt)
		{
			case 0:	if (Dlink1)	{SEG_LINE = ~(DispCode[DisplayBuffer[BitCnt]] + SEG_Dot);}
					else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];}		break;

			case 1:	if (Dlink2)	{SEG_LINE = ~(DispCode[DisplayBuffer[BitCnt]] + SEG_Dot);}
					else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];}		break;

			case 2:	if (Dlink3)	{SEG_LINE = ~(DispCode[DisplayBuffer[BitCnt]] + SEG_Dot);}
					else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];}		break;

			case 3:	if (Dlink4)	{SEG_LINE = ~(DispCode[DisplayBuffer[BitCnt]] + SEG_Dot);}
					else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];}		break;

			default:	break;
		}
	}
	else if ( !BFlash ) /*否则是位闪烁*/
	{
		switch (BitCnt)
		{
			case 0:	if (Blink1)	{SEG_LINE = 0xff;}
					else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];}		break;

			case 1:	if (Blink2)	{SEG_LINE = 0xff;}
					else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];}		break;

			case 2:	if (Blink3)	{SEG_LINE = 0xff;}
					else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];}		break;

			case 3:	if (Blink4)	{SEG_LINE = 0xff;}
					else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];}		break;

			default:	break;
		}		
	}
	else
	{
		SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];
	}	
				


	COM_LINE ^= 1 << CS_Control[BitCnt++];
	if (BitCnt >= MAX_DISP_BITS)
	{
		BitCnt = 0;
	}
}


/*-------------------------------------------------------------------------------------------------------*-
 * 函数名称: FlashFreq()
 * 参    数: XX
 * 返    回: XX
 * 函数功能: 控制闪烁频率(在定时中断中运行)
 *              
 * 说     明: 
 *
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl           	* 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 

-*-------------------------------------------------------------------------------------------------------*/
void LedFlashFreq(void)
{
	static uint8_t ucLedFlashFreq = 0;

	ucLedFlashFreq++;            			// 设每5mS中断一次

	if (ucLedFlashFreq >= 500/TIMEROUT)   	// 500ms除以标
	{
		ucLedFlashFreq = 0;
		if ( g_DFlashEn )	 		 		// 是否需要点闪烁
		{
			DFlash = ~DFlash;
		}
		else 
		{
			DFlash = 0;
		}

		if ( g_BFlashEn )	 				// 是否需要点闪烁
		{						   		
			BFlash = ~BFlash;
		}
		else
		{
			BFlash = 0;
		}
	}
}

void UpdateDisplayBuffer(uint8_t hour, uint8_t minute)
{
	DisplayBuffer[0] = hour / 10;
	DisplayBuffer[1] = hour % 10; 
	DisplayBuffer[2] = minute / 10; 
	DisplayBuffer[3] = minute % 10;  
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -