硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6759|回复: 0
收起左侧

【安富莱】LED-5604 LED数码管显示屏相关资源

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2012-10-18 12:01:58 | 显示全部楼层 |阅读模式
购买本产品,请访问安富莱电子官方淘宝店: http://item.taobao.com/item.htm? ... ;amp;id=20475732595


购买本产品,请访问安富莱电子官方淘宝店: http://item.taobao.com/item.htm? ... ;amp;id=20475732595

型号:LED5604 (四位)  产品名称:LED数码管显示屏
产品规格:供电电压 : 3-5V
供电电流 : 3.3V供电全亮时70mA;   5V供电全亮时150mA工作温度 :-40 ~ 85℃ (工业级)
内部数码管 :4个红色高亮,尺寸 0.5“外壳尺寸 :宽79mm x 高43mm x 深21.5mm
推荐面板开孔尺寸 :宽76mm x 高39.2mm
推荐用户的板子使用KF2510-5P插座, 线序为:VCC、CLK、SDI、GND、LCK
产品优势:1、静态显示,显示稳定。内置4片74HC595,无需CPU动态扫描,可以让单片机做其它的事情
2、只需要占用CPU的3个普通IO (输出口)即可驱动,无论级联多少个显示屏,均只需占用3个IO。3、兼容3.3V和5V系统。可以给显示模块提供3.3V或5V电源。
4、控制IO口输入端有缓冲器,IO口集成上拉电阻,抗干扰性能好(特别是连接线较长时)5、完美解决单片机上电复位期间的乱显问题(通过硬件方式)。保证单片机复位期间,LED数码管无显示。
6、级联输出口带限流保护。即使你将输入口和级联输出口搞反,也不会损坏显示模块。
产品靓照:



应用程序编程示例:
请到我们公司的论坛 bbs.armfly.com   下载驱动文件bsp_LED595.c 和 .h 文件,可以移植到任意单片机。LED595_DispStr(0, "1.234");          /* 第1个显示屏显示 1.234 */
LED595_DispStr(1, "8.8.8.8.");       /* 第2个显示屏全部笔画点亮 */LED595_DispStr(3, "    ");              /*  第4个显示屏显示空格,等于不显示 */
LED595_DispStr(7, "-0.23");          /*  第8个显示屏显示 -0.23 */
例程下载地址: http://www.armbbs.cn/forum.php?mod=viewthread&tid=329STM8-006_4位LED数码管(74HC595静态)显示例程
下载该例程后,请解压rar文件,核心驱动代码在: bsp_led595.c 和 bsp_led595.h 两个文件。
bsp_led595.h 文件内容如下:

#ifndef _BSP_LED595_H
#define _BSP_LED595_H

void LED595_InitHard(void);
void LED595_DispOn(void);
void LED595_DispOff(void);
void LED595_DispClr(void);
void LED595_DispTestOn(void);
void LED595_DispStr(uint8_t _ucSN, char *_ucaBuf);
#endif
bsp_led595.c 文件内容如下:/*
*********************************************************************************************************
*
*   模块名称 : LED数码管(74HC595驱动,静态显示)驱动模块
*   文件名称 : bsp_led595.c
*   版    本 : V1.0
*   说    明 : 驱动74HC595静态驱动的四位LED数码管; 支持级联操作。
*   修改记录 :
*       版本号  日期       作者    说明
*       v1.0    2012-10-12 armfly  ST固件库版本 V2.1.0
*
*   Copyright (C), 2012-2013, 安富莱电子www.armfly.com
*
*********************************************************************************************************
*/

#include "stm8s.h"
#include <stdio.h>
#include <string.h>
#include "bsp_led595.h"
#define LED_COUNT_PER_MODULE    4               /* 每个LED模块包含的数码管个数 */
#define MODULE_COUNT            2               /* LED模块的个数,支持级连 */
/*
1.安富莱LED5604型 4位LED数码管模块 接线定义 (只需要5根杜邦线连接)
   【LED模块排针】 【开发板接口】
        VCC ----------- 3.3V
        SCK ----------- PC5/SPI_SCK
        SDI ----------- PC6/SPI_MOSI
        GND ----------- 无需软件控制
        LCK ----------- PA3
*/
#define SCK_PORT        GPIOC
#define SCK_PIN         GPIO_PIN_5

#define SDI_PORT        GPIOC
#define SDI_PIN         GPIO_PIN_6
#define LCK_PORT        GPIOA
#define LCK_PIN         GPIO_PIN_3

#if 0   /* 使用固件库函数,一次翻转约 1.167us */
    #define SCK_1()     GPIO_WriteHigh(SCK_PORT, SCK_PIN)
    #define SCK_0()     GPIO_WriteLow(SCK_PORT, SCK_PIN)
    #define SDI_1()     GPIO_WriteHigh(SDI_PORT, SDI_PIN)
    #define SDI_0()     GPIO_WriteLow(SDI_PORT, SDI_PIN)

    #define LCK_1()     GPIO_WriteHigh(SCK_PORT, LCK_PIN)
    #define LCK_0()     GPIO_WriteLow(SCK_PORT, LCK_PIN)
#else   /* 直接操作寄存器,一次翻转约 125ns; 一个完整的SCK 实测 1.56us */
    #define SCK_1()     SCK_PORT->ODR |= SCK_PIN
    #define SCK_0()     SCK_PORT->ODR &= (uint8_t)(~SCK_PIN);
    #define SDI_1()     SDI_PORT->ODR |= SDI_PIN
    #define SDI_0()     SDI_PORT->ODR &= (uint8_t)(~SDI_PIN);

    #define LCK_1()     LCK_PORT->ODR |= LCK_PIN
    #define LCK_0()     LCK_PORT->ODR &= (uint8_t)(~LCK_PIN);
#endif
/*
    共阳数码管0-3和的16进制代码
    从ASCII字符空格开始 ‘ ’
*/
#define CHAR_SUB        0xDF        /* '-' 的显示代码 */
#define CHAR_F          0x87        /* 'F' */
#define CHAR_A          0x06        /* 'A' */
#define CHAR_n          0xD6        /* 'n' */
#define CHAR_S          0x8A        /* 'S' */
#define CHAR_E          0x83        /* 'E' */
#define CHAR_O          0x22        /* 'O' */
#define CHAR_o          0xD2        /* 'o' */
#define CHAR_SPACE      0xFF        /* 不显示 */
#define CHAR_P          0x07        /* 不显示 */

#define CHAR_TEST_ON    0x00        /* 全点亮的代码 */
#define DOT_MASK        0xFD        /* 小数点MASK */
/*
;   数码管笔画定义:
;          AAAAAA
;         F      B
;         F      B
;         F      B
;          GGGGGG
;         E      C
;         E      C
;         E      C
;          DDDDDD  dp

;   74HC595数据位对应关系 (0表示点亮,1表示灭);         d6d6d6d6
;        d5      d7
;        d5      d7
;        d5      d7
;         d4d4d4d4
;        d3      d1
;        d3      d1
;        d3      d1
;         d2d2d2d2  d0
;------------------------------
*/

#define DOT_FLAG    0xFE/*
【ASCII区】
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
*/

const uint8_t g_CharCode[] =
{
    0xFF,   // 空格 = 0x20
    0xFF,   // !
    0xFF,   // "
    0xFF,   // #
    0xFF,   // $
    0xFF,   // %
    0xFF,   // &
    0xFF,   // '
    0xFF,   // (
    0xFF,   // )
    0xFF,   // *
    0xFF,   // +
    0xFF,   // ,
    0xEF,   // -    1110 1111
    0xFF,   // .    1111 1110
    0xFF,   // /
/*
;         d6d6d6d6
;        d5      d7
;        d5      d7
;        d5      d7
;         d4d4d4d4
;        d3      d1
;        d3      d1
;        d3      d1
;         d2d2d2d2  d0
*/
    0x11,   // 0    0001 0001
    0x7D,   // 1    0111 1101
    0x23,   // 2    0010 0011
    0x29,   // 3    0010 1001
    0x4D,   // 4    0100 1101
    0x89,   // 5    1000 1001
    0x81,   // 6    1000 0001
    0x3D,   // 7    0011 1101
    0x01,   // 8    0000 0001
    0x09,   // 9    0000 1001
    0xFF,   // :
    0xFF,   // ;
    0xFF,   // <
    0xFF,   // =
    0xFF,   // >
    0xFF,   // ?
    0xFF,   // @

    0x06,   // A
    0xC2,   // B
    0xA3,   // C
    0x52,   // D
    0x83,   // E
    0x87,   // F
    0x0A,   // G
    0x46,   // H
    0xE7,   // I
    0x7A,   // J
    0xC7,   // K
    0xE3,   // L
    0x26,   // M
    0xD6,   // N
    0xD2,   // O
    0x07,   // P
    0xD2,   // Q
    0xD7,   // R
    0x8A,   // S
    0xDE,   // T
    0x62,   // U
    0xF2,   // V
    0xF2,   // W
    0x46,   // X
    0x4E,   // Y
    0x13,   // Z
    0xFF,   // [:
    0xFF,   // \:
    0xFF,   // ]:
    0xFF,   // ^:
    0xFB,   // _:
    0xEF,   // `:

    0x06,   // a
    0xc2,   // b
    0xd3,   // c
    0x52,   // d
    0x83,   // e
    0x87,   // f
    0x0a,   // g
    0x46,   // h
    0xe7,   // i
    0x7a,   // j
    0xc7,   // k
    0xe3,   // l
    0x26,   // m
    0xd6,   // n
    0xd2,   // o
    0x07,   // p
    0xd2,   // q
    0xd7,   // r
    0x8a,   // s
    0xde,   // t
    0x62,   // u
    0xf2,   // v
    0xf2,   // w
    0x46,   // x
    0x4E,   // y
    0x13,   // z
};
static uint8_t s_ucLedBuf[LED_COUNT_PER_MODULE * MODULE_COUNT]; /* 定义LED数码管显示缓冲区 */
static void LED595_ConfigGPIO(void);
static void LED595_LockOutData(void);
static void LED595_Delay(void);
static void LED595_RefeshDisp(void);
/*
*********************************************************************************************************
*   函 数 名: LED595_InitHard
*   功能说明: 初始化led数码管模块
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void LED595_InitHard(void)
{
    LED595_ConfigGPIO();
    LED595_DispClr();
}

/*
*********************************************************************************************************
*   函 数 名: LED595_DispOff
*   功能说明: 暂时关闭全部显示(可用于闪烁)
*   形    参: 无
*   返 回 值: 无
*********************************************************************************************************
*/
void LED595_DispOff(void)
{
    LCK_1();            /* LCK = 1 时, 全部不显示 */
}
/*
*********************************************************************************************************
*   函 数 名: LED595_DispOn
*   功能说明: 恢复全部显示(可用于闪烁)
*   形    参: 无
*   返 回 值: 无
*********************************************************************************************************
*/
void LED595_DispOn(void)
{
    LED595_LockOutData();
}

/*
*********************************************************************************************************
*   函 数 名: LED595_DispClr
*   功能说明: 清屏
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void LED595_DispClr(void)
{
    memset(s_ucLedBuf, CHAR_SPACE, LED_COUNT_PER_MODULE * MODULE_COUNT);    /* 先清楚显示缓冲区,显示空白 */
    LED595_RefeshDisp();    /* 刷新LED数码管 */
}
/*
*********************************************************************************************************
*   函 数 名: LED595_DispTestOn
*   功能说明: 显示全8带小数点
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void LED595_DispTestOn(void)
{
    memset(s_ucLedBuf, CHAR_TEST_ON, LED_COUNT_PER_MODULE * MODULE_COUNT);  /* 先清楚显示缓冲区,显示空白 */
    LED595_RefeshDisp();    /* 刷新LED数码管 */
}

/*
*********************************************************************************************************
*   函 数 名: LED595_DispStr
*   功能说明: 控制4位LED数码管显示字符串. (支持插入小数点)
*   形    参: _ucSN: 数码管模块的编号,0表示1个,1表示第2个级联的
*            _ucaBuf : 字符串,以0结束。 支持字符串中插入小数点。 比如 “1.23”
*   返 回 值: 无
*********************************************************************************************************
*/
void LED595_DispStr(uint8_t _ucSN, char *_ucaBuf)
{
    uint8_t ucLen;
    uint8_t i;
    uint8_t offset;
    offset = _ucSN * LED_COUNT_PER_MODULE;      /* 计算偏移地址 */
    ucLen = 0;
    /* 未作数据有效性判断 */
    for (i = 0; i < 32; i++)
    {
        /* 首位小数点 */
        if ((i == 0) && (_ucaBuf == '.'))
        {
            s_ucLedBuf[offset + ucLen] = DOT_FLAG;
            ucLen++;
        }
        else
        {
            if (_ucaBuf[i+1] == '.')
            {
                s_ucLedBuf[offset + ucLen] = (g_CharCode[_ucaBuf - ' '] & DOT_FLAG);
                ucLen++;
                i++;
                if (ucLen >= LED_COUNT_PER_MODULE)
                {
                    break;
                }
            }
            else
            {
                s_ucLedBuf[offset + ucLen] =  g_CharCode[_ucaBuf - ' '];
                ucLen++;
                if (ucLen >= LED_COUNT_PER_MODULE)
                {
                    break;
                }
            }
        }
    }

    for (i = ucLen; i < LED_COUNT_PER_MODULE; i++)
    {
        s_ucLedBuf[offset + ucLen] = CHAR_SPACE;
        ucLen++;
    }
    LED595_RefeshDisp();    /* 刷新LED数码管 */
}

/*
*********************************************************************************************************
*   函 数 名: LED595_ConfigGPIO
*   功能说明: 配置数码管模块的控制口线
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
static void LED595_ConfigGPIO(void)
{
    /* 初始化OLED接口,配置为推挽输出 */
    GPIO_Init(LCK_PORT, (GPIO_Pin_TypeDef)LCK_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);
    GPIO_Init(SDI_PORT, (GPIO_Pin_TypeDef)SDI_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);
    GPIO_Init(SCK_PORT, (GPIO_Pin_TypeDef)SCK_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);
}
/*
*********************************************************************************************************
*   函 数 名: LED_Delay
*   功能说明: 时序延迟。如果太快了,LED数码管可能乱码。
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
static void LED595_Delay(void)
{
    //uint8_t i;
    //for (i = 0; i < 32; i++);
    // 实际测试,无需延迟也很正常
}

/*
*********************************************************************************************************
*   函 数 名: LED595_LockOutData
*   功能说明: 发送1个输出锁存脉冲
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
static void LED595_LockOutData(void)
{
    LCK_0();
    LCK_1();
    LCK_0();
}
/*
*********************************************************************************************************
*   函 数 名: LED595_RefeshDisp
*   功能说明: 将全局显示缓冲区的显示数据刷新到LED数码管
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
static void LED595_RefeshDisp(void)
{
    uint8_t i;
    uint8_t k;
    uint8_t dd;

    for (k = LED_COUNT_PER_MODULE * MODULE_COUNT; k > 0 ; k--)
    {
        dd = s_ucLedBuf[k - 1];
        for (i = 0; i < 8; i++)
        {
            if (dd & 0x80)
            {
                SDI_1();
            }
            else
            {
                SDI_0();
            }
            LED595_Delay();
            SCK_0();            ;
            LED595_Delay();
            SCK_1();
            dd <<= 1;
        }
    }
    LED595_LockOutData();
}

/***************************** 安富莱电子www.armfly.com(END OF FILE) *********************************/
  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 12:07 , Processed in 0.149035 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表