[STM32F1]

谁能帮忙看看这个TM1628的程序为什么数码管不亮

[复制链接]
3908|9
手机看帖
扫描二维码
随时随地手机跟帖
xiedu|  楼主 | 2018-3-26 14:39 | 显示全部楼层 |阅读模式
#include "TM1628.h"

#define DIO_H HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15, GPIO_PIN_SET)
#define DIO_L HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15, GPIO_PIN_RESET)
#define CLK_H HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14, GPIO_PIN_SET)
#define CLK_L HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14, GPIO_PIN_RESET)
#define STB_H HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13, GPIO_PIN_SET)
#define STB_L HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13, GPIO_PIN_RESET)

uint8_t const ucTabBrightness[]={
                                                                                        0x80,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
                                };//显示亮度表
uint8_t const ucTabCode[]=
{
        0x3F, // 0
        0x06, // 1
        0x5B, // 2
        0x4F, // 3
        0x66, // 4
        0x6D, // 5
        0x7D, // 6
        0x07, // 7
        0x7F, // 8
        0x6F, // 9        
        0xFF,//全亮         
        0x00,//全灭         
};

void WriteByte(uint8_t w_data)      //写一字节数据
{

    uint8_t i;
        for(i=0;i<8;i++)
        {
               
        if(w_data&0x01)
                DIO_H;
        else
                DIO_L;
          CLK_L;
       
                __nop();
                __nop();
                __nop();
                __nop();
                __nop();
                __nop();
          
                CLK_H;
          __nop();
          __nop();
                w_data=w_data >> 1;        
        }

}               

//发送控制命令
void send_command(uint8_t com)
{
        STB_H;
        __nop();
        __nop();
        __nop();
        __nop();
        __nop();
        STB_L;
        WriteByte(com);
}

//== 数码管显示 flag :1->TM1628芯片1显示   2->TM1628芯片2显示
//== Brighttness :亮度调节 级别 0-8
void TM1628_Display()   //写多字节数据
{
    uint8_t i,data;
       
        send_command(0x03);//设置显示模式,7位10段模式
        send_command(0x40);//设置数据命令,采用地址自动加1模式
//        send_command(0x44);
        send_command(0xc8);//设置显示地址,从00H开始
//        send_command(0xc0|(data));
//        WriteByte(Svalue);
//        send_command(0xc0|(data+1));
//        WriteByte(0);
        for(i=0;i<7;i++)                                        //7个地址
                        {
                                WriteByte(ucTabCode[i]);
                                WriteByte(0);
      }
                          WriteByte(0x8f); //开显示,亮度为10/16
                          STB_H;
}

void DisplayTest(void)
{
        TM1628_Display();
}
xiedu|  楼主 | 2018-3-26 14:40 | 显示全部楼层
我只是让四个数码管亮

使用特权

评论回复
xiedu|  楼主 | 2018-3-26 14:45 | 显示全部楼层
三个IO口用的推挽输出

使用特权

评论回复
mmuuss586| | 2018-3-26 14:53 | 显示全部楼层
用示波器看下时序;
好像CLK太快了

使用特权

评论回复
xiedu|  楼主 | 2018-3-26 17:27 | 显示全部楼层
mmuuss586 发表于 2018-3-26 14:53
用示波器看下时序;
好像CLK太快了

中间我都延时了,网上的都没有延时

使用特权

评论回复
weiyuliang| | 2018-3-29 21:28 | 显示全部楼层

/****************************************Copyright (c)****************************************************
**
** Copyright (c) 2017 by Kirin co.,ltd. All Rights Reserved.
**
**--------------File Info---------------------------------------------------------------------------------
** File name         : bsp_tm1620.c
** Last modified Date: 2017年08月19日
** Last Version      : Ver 1.0
** Description             :
**
**------------------------------------------------------------------------------------------------------
** Created by        : wyl
** Created date      : 2017年08月19日
** Version           : Ver 1.0
** Description       : The original version 初始版本
**
**------------------------------------------------------------------------------------------------------
** Modified by       :
** Modified date     :
** Version           :
** Description       :
**
********************************************************************************************************/


/************************************************************************
-------------------------------------------------------------------------
**Debug switch 调试选项
-------------------------------------------------------------------------
************************************************************************/

/************************************************************************
-------------------------------------------------------------------------
**Include File 包含文件
-------------------------------------------------------------------------
************************************************************************/
#include <bsp.h>

#include "bsp_tm1620.h"

/************************************************************************
-------------------------------------------------------------------------
**Macro Define 宏定义
-------------------------------------------------------------------------
************************************************************************/


#define TM1620B_RCC_DIO     RCC_APB2Periph_GPIOB
#define TM1620B_PORT_DIO         GPIOB
#define TM1620B_PIN_DIO         GPIO_Pin_3

#define TM1620B_RCC_CLK     RCC_APB2Periph_GPIOB
#define TM1620B_PORT_CLK         GPIOB
#define TM1620B_PIN_CLK         GPIO_Pin_4

#define TM1620B_RCC_STB     RCC_APB2Periph_GPIOB
#define TM1620B_PORT_STB         GPIOB
#define TM1620B_PIN_STB         GPIO_Pin_5


#define DIO1_LOW        (TM1620B_PORT_DIO->BRR = TM1620B_PIN_DIO)
#define DIO1_HIGH       (TM1620B_PORT_DIO->BSRR = TM1620B_PIN_DIO)

#define DIO_IS_HIGH()        ((TM1620B_PORT_DIO->IDR & TM1620B_PIN_DIO) != 0)

#define STB1_LOW        (TM1620B_PORT_STB->BRR = TM1620B_PIN_STB)
#define STB1_HIGH       (TM1620B_PORT_STB->BSRR = TM1620B_PIN_STB)

#define CLK1_LOW        (TM1620B_PORT_CLK->BRR = TM1620B_PIN_CLK)
#define CLK1_HIGH       (TM1620B_PORT_CLK->BSRR = TM1620B_PIN_CLK)

   
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//

#define   WRITE_MODE   0x40    /* 写数据模式 */
#define   READ_MODE    0x42    /* 读数据模式  读取按键 */


/* 显示命令设置 */
#define   DIS_CMD_00    0x00    /* 4位9段 */
#define   DIS_CMD_01    0x01    /* 5位8段 */
#define   DIS_CMD_10    0x02    /* 6位7段 */
#define   DIS_CMD_11    0x03    /* 7位6段 */


#define   AUTO_ADDR_MODE    0x40    /* 地址自动加1 */
#define   FIXED_ADDR_MODE   0x44    /* 固定地址 */

/* 显示控制命令设置 */
#define   LIGHT_LEVE_OFF    0x80    /* 显示关闭 */
#define   LIGHT_LEVE_ON     0x88    /* 显示开启 */

#define   LIGHT_LEVE_1      0x80    /* 设置脉冲宽度为 1/16 */
#define   LIGHT_LEVE_2      0x81    /* 设置脉冲宽度为 2/16 */
#define   LIGHT_LEVE_3      0x82    /* 设置脉冲宽度为 4/16 */
#define   LIGHT_LEVE_4      0x83    /* 设置脉冲宽度为 10/16 */
#define   LIGHT_LEVE_5      0x84    /* 设置脉冲宽度为 11/16 */
#define   LIGHT_LEVE_6      0x85    /* 设置脉冲宽度为 12/16 */
#define   LIGHT_LEVE_7      0x86    /* 设置脉冲宽度为 13/16 */
#define   LIGHT_LEVE_8      0x87    /* 设置脉冲宽度为 14/16 */


/* 地址命令设置 */
#define   ADDR_0      0xC0      /*  00H */
#define   ADDR_1      0xC1      /*  01H */
#define   ADDR_2      0xC2      /*  02H */
#define   ADDR_3      0xC3      /*  03H */
#define   ADDR_4      0xC4      /*  04H */
#define   ADDR_5      0xC5      /*  05H */
#define   ADDR_6      0xC6      /*  06H */
#define   ADDR_7      0xC7      /*  07H */
#define   ADDR_8      0xC8      /*  08H */
#define   ADDR_9      0xC9      /*  09H */
#define   ADDR_10     0xCA      /*  0aH */
#define   ADDR_11     0xCB      /*  0bH */
#define   ADDR_12     0xCC      /*  0cH */
#define   ADDR_13     0xCD      /*  0dH */
#define   ADDR_14     0xCE      /*  0eH */
#define   ADDR_15     0xCF      /*  0fH */


/************************************************************************
-------------------------------------------------------------------------
**Struct Define 结构体定义
-------------------------------------------------------------------------
************************************************************************/

/************************************************************************
-------------------------------------------------------------------------
**Prototype Declare 函数原型声明
-------------------------------------------------------------------------
************************************************************************/

/************************************************************************
-------------------------------------------------------------------------
**Global Variable Declare 全局变量声明
-------------------------------------------------------------------------
************************************************************************/

/************************************************************************
-------------------------------------------------------------------------
**File Static Variable Define Static 变量定义部分
-------------------------------------------------------------------------
************************************************************************/

/************************************************************************
-------------------------------------------------------------------------
**Function Define  函数定义
-------------------------------------------------------------------------
************************************************************************/

/*********************************************************************************************************
** Function name : TM1638_Init
** Input Para         :
** Output Para         :
** Created by    : wyl
** Created Date  : 2017年08月19日
** Descriptions         : 数码管初始化
**
** -------------------------------------------------------------------------------------------------------
** Modified by   :
** Modified Date :
** Descriptions         :
**
** -------------------------------------------------------------------------------------------------------
**********************************************************************************************************/

void bSP_TM1638Init(void)      
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        
        /* 打开GPIO时钟 */
        RCC_APB2PeriphClockCmd(TM1620B_RCC_DIO, ENABLE);
        RCC_APB2PeriphClockCmd(TM1620B_RCC_CLK, ENABLE);
        RCC_APB2PeriphClockCmd(TM1620B_RCC_STB, ENABLE);

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   /* 输出频率 */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //开漏输出可以在不用改变成输入的情况下读取IO的电平
        GPIO_InitStructure.GPIO_Pin = TM1620B_PIN_DIO ;
        GPIO_Init(TM1620B_PORT_DIO,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   /* 输出频率 */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           /* 推挽输出 */
        GPIO_InitStructure.GPIO_Pin = TM1620B_PIN_CLK ;
        GPIO_Init(TM1620B_PORT_CLK,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   /* 输出频率 */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           /* 推挽输出 */
        GPIO_InitStructure.GPIO_Pin = TM1620B_PIN_STB;
        GPIO_Init(TM1620B_PORT_STB,&GPIO_InitStructure);

}


/* DIO2设置输入模式 */
void DIO_Set_Input(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = TM1620B_PIN_DIO;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;           /* 输入上拉模式 */
        GPIO_Init(TM1620B_PORT_DIO,&GPIO_InitStructure);
}

/* DIO2设置输出模式 */
void DIO_Set_Output(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = TM1620B_PIN_DIO;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           /* 改为推挽输出  */
        GPIO_Init(TM1620B_PORT_DIO,&GPIO_InitStructure);
}




/* 读数据函数 */
u8 Read_Byte_TM1638(void)                  
{
    u8 temp = 0;
    u8 i;
       
    for (i = 0; i < 8; i++)
    {
        CLK1_LOW;
        
        temp >>= 1;
        
        CLK1_HIGH;
        
        if(DIO_IS_HIGH())
        {
            temp |= 0x80;
        }
    }

    return temp;
   
}


/* 读取按键 */
u32 Read_Key_Value(void)
{
    u32 l_u32AtCmdRet = 0;
   
        u8 l_u8key_buff[4], i;
               
        STB1_LOW;

        /* 读取数据 模式 */
        Write_Byte_TM1638(READ_MODE);
       
        /* 拉高数据线 */
        DIO1_HIGH;

    /* 设置DIO 输入上拉模式 */
        DIO_Set_Input();

    /* 获取 BYTE1—BYTE3 */
    for (i = 0; i < 3; i++)
    {
        l_u8key_buff[i] = Read_Byte_TM1638(); //读取按键的4个BYTE
    }
   
    /* 设置DIO 推挽输出模式 */
    DIO_Set_Output();
   
    STB1_HIGH;
   
    l_u32AtCmdRet = ( (l_u8key_buff[2]<<16)
                    +(l_u8key_buff[1]<<8)
                    +l_u8key_buff[0] );
  
    return l_u32AtCmdRet;
   
}



/*********************************************************************************************************
** Function name : WriteByteTo_TM1638
** Input Para         :
** Output Para         :
** Created by    : wyl
** Created Date  : 2017年08月19日
** Descriptions         : 实现一个字节的写入
**
** -------------------------------------------------------------------------------------------------------
** Modified by   :
** Modified Date :
** Descriptions         :
**
** -------------------------------------------------------------------------------------------------------
**********************************************************************************************************/

void Write_Byte_TM1638(u8 byte)
{
    u8 i;

        STB1_LOW;
       
    for (i = 0; i < 8; i++)
    {
        CLK1_LOW;

        /* 最小100ns */
        //delayUS(1);
        
        if ((byte & 0x01) == 1)
        {
            DIO1_HIGH;
        }
        else
        {
            DIO1_LOW;
        }

        CLK1_HIGH;

        /* 最小100ns */
        //delayUS(1);  
        
        byte >>= 1;
    }   
   
}

/*********************************************************************************************************
** Function name : WriteCmdTo_TM1638
** Input Para         :
** Output Para         :
** Created by    : wyl
** Created Date  : 2017年08月19日
** Descriptions         : 发送命令的函数
**
** -------------------------------------------------------------------------------------------------------
** Modified by   :
** Modified Date :
** Descriptions         :
**
** -------------------------------------------------------------------------------------------------------
**********************************************************************************************************/

void WriteCmdTo_TM1638(u8 cmd)
{
    STB1_HIGH;
    CLK1_HIGH;
   // delayUS(2);
    DIO1_HIGH;

    Write_Byte_TM1638(cmd);
}


void Write_Buffer_TM1638(u8 *p_buffer, u8 buffer_len)
{
    u8 i = 0;

    /* 显示命令设置 4位9段 */
        WriteCmdTo_TM1638(DIS_CMD_01);  
       
    /* 数据命令 自动地址增加模式 */
        WriteCmdTo_TM1638(AUTO_ADDR_MODE);  

        /* 显示地址 00H单元开始 */
        WriteCmdTo_TM1638(ADDR_0);  

    /* 地址自动累加 */

    for(i=0; i<buffer_len;i++)
    {
        Write_Byte_TM1638(p_buffer[i]);
    }

        /* 亮度调节 */
    WriteCmdTo_TM1638(LIGHT_LEVE_ON|LIGHT_LEVE_7);
   

    STB1_HIGH;   
}





/**********************************END**********************************/


使用特权

评论回复
weiyuliang| | 2018-3-29 21:28 | 显示全部楼层
楼主用这个代码测试一下,我之前用的F103驱动LED指示灯的,测试程序没有问题

使用特权

评论回复
android2| | 2018-3-30 21:03 | 显示全部楼层
是不是一闪而过,没有视觉停留啊

使用特权

评论回复
数据总线| | 2018-6-16 08:52 | 显示全部楼层
weiyuliang 发表于 2018-3-29 21:28
楼主用这个代码测试一下,我之前用的F103驱动LED指示灯的,测试程序没有问题 ...

程序写得挺好的,比较有条理性,程序我验证过了,没有问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

138

帖子

1

粉丝