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

📄 led_dis.c

📁 基于sunplus的16MCU产品,SPMC75的键盘和显示的例子,完整的工程,对单片机开发工程式师有一定的借鉴作用.
💻 C
字号:

//========================================================================
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
//             (C) COPYRIGHT 2004 SUNPLUS TECHNOLOGY CO.
//                    ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================================

//========================================================================
// Filename: LED_Dis.c
// Author: Lianshu  Mou (email: Lianshu@sunnorth.com.cn)
// Date: 2004/12/22
// Description: 
// Reference:
// Revision:
//      2004/12/22      First version
//========================================================================
#include "Spmc75_regs.h"
#include "mcMACRO.h"
#include "Option.h"
#include "GPIO_SPI.h"

static unsigned int LED_Dis_Buffer[5];			//显示缓冲区
static unsigned int Dis_flag = 0x00ff;			//显示标志
static int LED_Num = 0;							//显示的扫描位选计数器
static int LED_Daly_Time = 0;					//显示延时计数器

void LED_Dis_fill(unsigned int Data,int ID,int H_EN);

//显示译码表
/*0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,H,h,L,n,N,o,P,r,t,U,-,*/
const unsigned int LED_TAB[28] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, \
								  0x90,0x88,0x83,0xC6,0xA7,0xA1,0x86,0x8E,0x89, \
								  0x8B,0xC7,0xAB,0xC8,0xA3,0x8C,0xAF,0x87,0xC1, \
								  0xBF};
const unsigned int Diver_TAB[5] = {0xfe00,0xfd00,0xfb00,0xf700,0xef00};
//=================================================================================================
// ----Function: void Display_Init(void);
// -Description: 显示初始化
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=================================================================================================
void Display_Init(void)
{
	LED_Port_Attrib |= GPIO_CLK + GPIO_DAT + GPIO_Load;
	LED_Data_Port &= ~(GPIO_CLK + GPIO_DAT + GPIO_Load);
	LED_Data_Port_Dir |= GPIO_CLK + GPIO_DAT + GPIO_Load;
	LED_Dis_fill(0,0,0);
	LED_Dis_fill(1,1,0);
	LED_Dis_fill(2,2,0);
	LED_Dis_fill(3,3,0);
	LED_Dis_fill(0xc0,4,2);
}

//=================================================================================================
// ----Function: void LED_Diver(unsigned int Data,int LED_ID);
// -Description: 显示驱动
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=================================================================================================
void LED_Diver(unsigned int Data,int LED_ID)
{
	Data &= 0xff;
	Data |= Diver_TAB[LED_ID];
	GPIO_SPI_TXD(Data);
	GPIO_SPI_Load();
}

//=================================================================================================
// ----Function: int M_TSTB(unsigned int *Data,int Num);
// -Description: 位测试
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=================================================================================================
int M_TSTB(unsigned int *Data,int Num)
{
	if((*Data & (1 << Num)) > 0) return(1);
	else return(0);
}

//=================================================================================================
// ----Function: void M_INVB(unsigned int *Data,int Num);
// -Description: 位取反
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=================================================================================================
void M_INVB(unsigned int *Data,int Num)
{
	*Data ^= 1 << Num;
}

//=================================================================================================
// ----Function: void M_SETB(unsigned int *Data,int Num);
// -Description: 位置位
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=================================================================================================
void M_SETB(unsigned int *Data,int Num)
{
	*Data |= 1 << Num;
}

//=================================================================================================
// ----Function: void M_CLRB(unsigned int *Data,int Num);
// -Description: 位清零
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=================================================================================================
void M_CLRB(unsigned int *Data,int Num)
{
	*Data &= ~(1 << Num);
}

//=================================================================================================
// ----Function: void LED_Dis_TimeISR(void);
// -Description: 显示的定时中断服务,2mS执行一次
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=================================================================================================
void LED_Dis_TimeISR(void)
{
	int i;
	LED_Daly_Time ++;
	if(LED_Daly_Time > 250)
	{
		LED_Daly_Time = 0;
		for(i=0;i<4;i++)
		{
			if(M_TSTB(&Dis_flag,i+8) > 0) M_INVB(&Dis_flag,i);
			else M_SETB(&Dis_flag,i);
			if(M_TSTB(&LED_Dis_Buffer[4],i+8) > 0) M_INVB(&LED_Dis_Buffer[4],i);	
		}
		if(M_TSTB(&LED_Dis_Buffer[4],12) > 0) M_INVB(&LED_Dis_Buffer[4],4);
		if(M_TSTB(&LED_Dis_Buffer[4],13) > 0) M_INVB(&LED_Dis_Buffer[4],5);
	}
	LED_Num ++;
	if(LED_Num > 4) LED_Num = 0;
	if(M_TSTB(&Dis_flag,LED_Num) > 0) LED_Diver(LED_Dis_Buffer[LED_Num],LED_Num);
	else LED_Diver(0xff,LED_Num);
}

//=================================================================================================
// ----Function: void LED_Dis_fill(unsigned int Data,int ID,int H_EN);
// -Description: 显示缓冲区填充
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=================================================================================================
void LED_Dis_fill(unsigned int Data,int ID,int H_EN)
{
	if(H_EN < 2)
	{
		if(H_EN > 0) LED_Dis_Buffer[ID] = LED_TAB[Data] & 0x7f;		//数据查表填充,显示小数点
		else LED_Dis_Buffer[ID] = LED_TAB[Data];					//数据查表填充,不显示小数点
	}
	else LED_Dis_Buffer[ID] = Data;
}

//=================================================================================================
// ----Function: void Set_LED_Flash(int NUM,int State);
// -Description: 设置相应的LED是否闪亮
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=================================================================================================
void Set_LED_Flash(int NUM,int State)
{
	if(State > 0) M_SETB(&Dis_flag,NUM+8);
	else M_CLRB(&Dis_flag,NUM+8);
}

⌨️ 快捷键说明

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