CH32V103 软件驱动TM1650四位数码管

参考沁恒官方例程

 tm1650.h

/*
 * tm1650.h
 *      Author: armxu
 */

#ifndef USER_TM1650_H_
#define USER_TM1650_H_
#include "debug.h"
#define IIC_GPIO_CLK    RCC_APB2Periph_GPIOC
#define SCL_SDA_PORT   GPIOC
#define SCL_PIN  GPIO_Pin_15
#define SDA_PIN  GPIO_Pin_14

#define  SDA_H  GPIO_SetBits(SCL_SDA_PORT,SDA_PIN)    //配置SDA接口高电平
#define  SDA_L  GPIO_ResetBits(SCL_SDA_PORT,SDA_PIN)  //配置SDA接口低电平

#define  SCL_H  GPIO_SetBits(SCL_SDA_PORT,SCL_PIN)    //配置SCL接口高电平
#define  SCL_L  GPIO_ResetBits(SCL_SDA_PORT,SCL_PIN)  //配置SCL接口低电平

#define  SDA_READ()  GPIO_ReadInputDataBit(SCL_SDA_PORT, SDA_PIN)  //读SDA口线状态
void GPIO_INIT(void);
void IIC_Idle_State();
void TM1650_INIT(void);
void TM1650_start(void);
void TM1650_stop(void);
void TM1650_Write(unsigned char DAT);
void TM1650_ACK(void);
void Write_DATA(unsigned char add,unsigned char DAT) ;



#endif /* USER_TM1650_H_ */

 tm1650.c

/*
 * tm1650.c
 *
 *      Author: armxu
 */

#include "tm1650.h"
const unsigned char  tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,//9
                         //  0    1    2    3    4    5   6    7    8    9
                      0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,//19
                        //  0.    1.    2.   3.  4.   5.  6.    7.   8.  9.
                      0x00,0x40};
                      //消隐   负号

void GPIO_INIT(void)
{

    GPIO_InitTypeDef GPIO_InitStructure ;

    RCC_APB2PeriphClockCmd(IIC_GPIO_CLK, ENABLE);
    GPIO_InitStructure.GPIO_Pin = SCL_PIN|SDA_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SCL_SDA_PORT, &GPIO_InitStructure);

    IIC_Idle_State();
}
//IIC空闲状态
//当IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为IIC总线的空闲状态
void IIC_Idle_State()
{
    SDA_H;
    SCL_H;

    Delay_Us(4);
}

void TM1650_INIT(void)
{
    GPIO_INIT();
}

void TM1650_start(void)
{
    SCL_H;
  Delay_Us(1);
    SDA_H;
    Delay_Us(1);
    SDA_L;
    Delay_Us(1);
}
void TM1650_stop(void)
{
    SCL_H;
//  _delay_us(1);
    SDA_L;
    Delay_Us(1);
    SDA_H;
    Delay_Us(1);
}
void TM1650_Write(unsigned char DAT)           //写数据函数
{
    unsigned char i;
    Delay_Us(1);
    SCL_L;
    for(i=0;i<8;i++)
    {
        if(DAT&0X80)
            SDA_H;
        else
            SDA_L;
        DAT<<=1;
        SCL_L;
        Delay_Us(1);
        SCL_H;
        Delay_Us(1);
        SCL_L;
        Delay_Us(1);
    }
}
void TM1650_ACK(void)
{
    unsigned char timeout=0;
    SCL_H;
    Delay_Us(1);
    SCL_L;
    do  timeout++;
    while((SDA_READ())&&(timeout<255));
    Delay_Us(1);
    SCL_L;
}

void Write_DATA(unsigned char add,unsigned char DAT)       //指定地址写入数据
{
    TM1650_start();
    TM1650_Write(add);
    TM1650_ACK();
    TM1650_Write(DAT);
    TM1650_ACK();
    TM1650_stop();
}

main.c 

/********************************** (C) COPYRIGHT *******************************
 * File Name          : main.c
 * Author             : WCH
 * Version            : V1.0.0
 * Date               : 2020/04/30
 * Description        : Main program body.
 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
 * SPDX-License-Identifier: Apache-2.0
 *******************************************************************************/
#include "debug.h"
#include "tm1650.h"
extern unsigned char const tab[];
/* Global typedef */

/* Global define */

/* Global Variable */


/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    unsigned char i,j;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    TM1650_INIT();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n", SystemCoreClock);

    printf("This is printf example\r\n");
    Write_DATA(0x48,0x01);
    while(1)
    {

      for(i=0;i<16;i++)
          {
              for(j=0;j<4;j++)
                  {
                      Write_DATA(0x68+2*j,tab[(j+i)%16]|0x80);
                  }
              Delay_Ms(200);
          }
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

armcsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值