📄 led_display.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 + -