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

📄 led_display.c

📁 MSP430 DS1302程序库
💻 C
字号:
/*
             LED_DISPLAY.c
                    
             MSP430F149开发板LED显示源程序
                    
        说明:此程序需调用ZLG7290B的库函数,而ZLG7290B又需要调用I2C的库函数,故需要把
             I2C.c和ZLG7290B.c包含到工程中去
             在使用LED库函数时,只需要调用LED_DISPLAY.h头文件就行
                
             Copyright(c)2008, 323实验室 罗佳芳
             
             All rights reserved.
    
*/

#include <msp430x14x.h>
#include "ZLG7290B.h"
#include "LED_DISPLAY.h"

/*宏定义,数码管a-g各段对应的比特,更换硬件只用改动以下8行*/
#define a       0x80                            // AAAA
#define b       0x40                            // F  B
#define c       0x20                            // F  B
#define d       0x10                            // GGGG
#define e       0x08                            // E  C
#define f       0x04                            // E  C
#define g       0x02                            // DDDD
#define DP      0x01                            //小数点 
#define NEGSEG  0x02                            //负号


//直接写入显示缓冲的显示码
const unsigned char LED_Reg_Tab[] = {
  a + b + c + d + e + f,                        // Displays "0"
  b + c,                                        // Displays "1"
  a + b + d + e + g,                            // Displays "2"
  a + b + c + d + g,                            // Displays "3"
  b + c + f + g,                                // Displays "4"
  a + c + d + f +g,                             // Displays "5"
  a + c + d + e + f + g,                        // Displays "6"
  a + b + c,                                    // Displays "7"
  a + b + c + d + e + f + g,                    // Displays "8"
  a + b + c + d + f + g,                        // Displays "9"
  a + b + c + e + f + g,                        // Displays "A"
  c + d + e + f + g,                            // Displays "b"  
  a + d + e + f,	                        // Displays "C"
  b + c + d + e + g,               	        // Displays "d"
  a + d + e + f + g,            	        // Displays "E"
  a + e + f + g,	                        // Displays "F"
  a + c + d + e + f,                            // Displays "G"
  b + c + e + f + g,                            // Displays "H"  
  e + f,                                        // Displays "i"
  b + c + d + e,                    		// Displays "J"
  d + e + f,                                    // Displays "L"  
  c + d + e + g,                    		// Displays "o"
  a + b + e + f + g,                    	// Displays "p"
  a + b + c + f + g,                    	// Displays "q" 
  e + g,					// Displays "r"
  d + e + f + g,                    		// Displays "t"
  b + c + d + e + f,                    	// Displays "U"
  b + c + d + f + g,                    	// Displays "y" 
  d + e + g,                                    // Displays "c" 
  c + e + f + g,                                // Displays "h"
  a + e + f ,                    		// Displays "T"
  0,	                            		// Displays " "            
  g,                            		// Displays "-"
  b                            		        // Displays "'" 
 
  
}; 
#undef a
#undef b
#undef c
#undef d
#undef e
#undef f
#undef g


//ZLG7290B Donload命令字中的数据显示编码
const char LED_Word_Tab[] = {
	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //displays "0~9"  
	0x0A,             //displays "A"
	0x0B,             //displays "b"
	0x0C,             //displays "C"
	0x0D,             //displays "d"
	0x0E,             //displays "E"
	0x0F,             //displays "F"
	0x10,             //displays "G"
	0x11,             //displays "H"
	0x12,             //displays "i"
	0x13,             //displays "J"
	0x14,             //displays "L"
	0x15,             //displays "o"
	0x16,             //displays "p"
	0x17,             //displays "q"
	0x18,             //displays "r"
	0x19,             //displays "t"
	0x1A,             //displays "U"
	0x1B,             //displays "y"
	0x1C,             //displays "c"
	0x1D,             //displays "h"
	0x1E,             //displays "T"
	0x1F              //displays " "	
};



#define AA 10
#define bb AA+1
#define CC bb+1
#define dd CC+1
#define EE dd+1
#define FF EE+1
#define GG FF+1
#define HH GG+1
#define ii HH+1
#define JJ ii+1
#define LL JJ+1
#define oo LL+1
#define pp oo+1
#define qq pp+1
#define rr qq+1
#define tt rr+1
#define UU tt+1
#define yy UU+1
#define cc yy+1
#define hh cc+1
#define TT hh+1
#define SP TT+1     /* 空白 */
#define BR SP+1     /*   -  */
#define DT BR+1     /*   '  */



//初始化,在使用前要进行初始化一次
//此函数会对IIC进行初始化,故在正在使用IIC时,切不可调用此函数
void LED_Init(void)
{
	unsigned char temp= ZLG7290_DpRam0;     //将显示缓存0赋给临时变量temp
	unsigned char i;                        //循环临时变量
	
        ZLG7290_Init();   //ZLG7290初始化
        for(i=0;i<8;i++)
	 {
	        ZLG7290_WriteReg(temp,LED_Reg_Tab[SP]);   //将显示缓存全部清空,既LED不显示
	        temp++;
	       }
	       
	LED_ScanNum(7);   //初始为LED七位全显示
	LED_Flash(0x00,0x77);  //初始化为全不闪烁,闪烁占空比为50%...
	       
	
}

/****************************************************************************
* 名    称:LED_DisplayLongDecimal()
* 功    能:在LED上显示一个带有小数点的长数据。
* 入口参数:Number:显示数值  (-9999999~99999999)
            DOT   :小数点位数(0~7)
* 出口参数:无
* 范    例: LCD_DisplayDecimal( 123456,2); 显示结果: 1234.56 (2位小数)
            LCD_DisplayDecimal(-123456,1); 显示结果:-12345.6 (1位小数)
* 说    明: 该函数能够显示满屏7位数字,但执行时间较长,耗电大。
****************************************************************************/
void LED_DisplayLongDecimal( long int Number, char DOT)
{
	unsigned char Neg;    //正负标志,1表示为负号
	unsigned char PolarLocate;  //负号显示的位置
	char DispBuff[8];     //输出缓冲
	unsigned char i,temp;
	unsigned char tempReg; //临时缓存变量
	
	if(Number < 0) {Number=-Number; Neg=1;  }    //处理负数
	 else Neg=0;
	 
	for(i=0;i<8;i++)           //拆分数字              
	  {
	  	DispBuff[i] = Number %10;
	  	Number /=10;
	  }
	  
	for(i=7;i>DOT;i--)         //消影无效0
	{
		if(DispBuff[i]==0) DispBuff[i]=SP;
		 else break;
		}
	PolarLocate = i +1;    //上面i跳出的位置既为最高的数字位
	
	if(DOT>7) DOT=255;  // 无效的小数点不显示
        if(DOT<1) DOT=255;  
        
        tempReg = ZLG7290_DpRam7;   //数码管的最低位对应着ZLG7290显示缓存的最高地址
        for(i=0;i<8;i++)   //数码管从低位开始显示
        {
        	temp=LED_Reg_Tab[DispBuff[i]];  
        	if(i==DOT) temp |= DP;   //显示小数点
        	if((i==PolarLocate)&&(Neg==1)) temp |=NEGSEG; //显示负号
        	ZLG7290_WriteReg(tempReg,temp); //写入显示缓存
        	tempReg--;
        	}	  
	
}


/****************************************************************************
* 名    称:LED_DownloadData()
* 功    能:给LED一个特定的位显示特定的数据
* 入口参数:LEDAddr :LED的位置,与硬件设计有关,请注意
            LEDDate :要显示的数据
            dp :是否点亮小数点 0不点亮,1点亮
            flash :是否闪烁  0正常显示,1闪烁
            
* 出口参数:0 正常
            1 出错了
* 范    例: LED_DownloadDate(0,SP,0,0); //表示第0位不显示数据
            
* 说    明: 此函数是向ZLG7290的命令缓冲寄存器中输入下载译码命令
            此函数会将LEDDate译码生成的显示码存入相应的显示缓存中
            故它会覆盖其它函数的显示
            输入特别的值可能会让LED不亮
            此函数受扫描寄存器的影响
****************************************************************************/
unsigned char LED_DownloadDate(unsigned char LEDAddr,unsigned char LEDData,unsigned dp,unsigned flash)
{
	unsigned displayCode;   //要显示的数据的译码
	displayCode = LED_Word_Tab[LEDData];
	
	return ZLG7290_Download(LEDAddr,dp,flash,displayCode);   //LED的位置,小数点,闪烁,显示数据
		
	}
	
/****************************************************************************
* 名    称:LED_DisplayReg()
* 功    能:给一个特定的显示缓存输入特定的显示数据,用以点亮特定的LED,显示特定的数据
* 入口参数:LEDAddr :LED的位置,与硬件设计有关,请注意 0~7
            LEDDate :要显示的数据
            dp  :是否要显示小数点 0 不显示, 1 显示
            
            
* 出口参数:0 正常
            1 出错了
* 范    例: 
            
* 说    明: 此函数是向ZLG7290的显示缓冲寄存器中直接输入显示的数据
            它会覆盖其它函数的显示
             它比起LED_DownloadDate()函数,能显示"-"和"'",但它不能控制闪烁
            此函数受扫描寄存器的影响
****************************************************************************/	
unsigned char LED_DisplayReg(unsigned char LEDAddr,unsigned char LEDData,unsigned char dp)
{
	unsigned char displayCode;    //显示码
	unsigned char ledAddr;     //显示的LED缓冲寄存器
	
	if(LEDAddr>7) return 1;    //如果给的地址越界,出错返回
	if(dp>1) dp=1;      //如果dp>1,仍认为为有亮
	
	ledAddr = ZLG7290_DpRam0 + LEDAddr;   //缓冲寄存器的首地址加上偏移地址
	
	displayCode = LED_Reg_Tab[LEDData];  //译码
	if(dp) displayCode |= DP;   //如果dp=1,则显示小数点
	
	return ZLG7290_WriteReg(ledAddr,displayCode);  //写入缓冲存器
}

/****************************************************************************
* 名    称:LED_ScanNum()
* 功    能:LED扫描位数显示
* 入口参数:num  : 扫描的位数 0~7          
* 出口参数:0 正常
            1 出错了
* 范    例: LED_ScanNum(3)  :只显示0,1,2,3 LED
            LED_ScanNum(0)  :只显示0 LED
* 说    明: 此函数是向ZLG7290的扫描位数寄存器中写入要描述的位数
            它会影响一所有的显示函数
            扫描的位数越少,LED越亮
            每次复位后,默认LED全亮,即扫描位数为7
****************************************************************************/
unsigned char LED_ScanNum(unsigned char num)
{
	  //越界调整
	if(num>7) num = 7;
	
	return ZLG7290_WriteReg(ZLG7290_ScanNum,num); //写入寄存器,成功返回0,失败返回1
}

/****************************************************************************
* 名    称:LED_Flash()
* 功    能:LED的闪烁控制以及闪烁频率调整
* 入口参数:flash : 闪烁位控制 0000,0000B~1111,1111B 0表示不闪烁,1表示闪烁 
            frequency :闪烁频率和占空比调整  0111,0111B 高四位表示持续亮的时间,
                       低四位表示持续灭的时间 而0x00将达到最快的闪烁        
* 出口参数:0 正常
            1 出错了
* 范    例: LED_Flash(0x01,0x77)  :第0位闪烁,占空比为50% 较快
            
* 说    明: 此函数是向ZLG7290的写入闪烁控制命令,并给闪烁控制寄存器输入调整值
            LED_DownloadDate()函数貌似也可能控制闪烁,但不能调整闪烁频率和占空比
            闪烁频率每次复位后都为0x77;
****************************************************************************/
unsigned char LED_Flash(unsigned char flash,unsigned char frequency)
{
	if(ZLG7290_WriteReg(ZLG7290_FlashOnOff,frequency)) return 1; //如果出错,刚出错返回
	
	return ZLG7290_cmd(0x70,flash);  //第一个命令字0x70是命令字
}

/****************************************************************************
* 名    称:LED_Clear()
* 功    能:清除所有的LED显示
* 入口参数:无    
* 出口参数:0 正常
            1 出错了
* 范    例: 
* 说    明: 此函数不受一切前有的函数影响
****************************************************************************/
unsigned char LED_Clear(void)
{
	unsigned char temp= ZLG7290_DpRam0;     //将显示缓存0赋给临时变量temp
	unsigned char i;                        //循环临时变量
	for(i=0;i<8;i++)
	 {
	        if(ZLG7290_WriteReg(temp,LED_Reg_Tab[SP])) return 1;   //将显示缓存全部清空,既LED不显示
	        temp++;
	       }
	return 0;       
	}

⌨️ 快捷键说明

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