ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数码管驱动芯片ta6932 驱动

2022-01-29 09:02:16  阅读:175  来源: 互联网

标签:ta6932 num Pin 数码管 TA6932 GPIO cs 驱动


#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "stm32f10x.h"
#include "stm32f10x_it.h"

#include "ta6932.h"

#define ta6932_mosi_l()      (GPIO_ResetBits(GPIOB,GPIO_Pin_5))
#define ta6932_mosi_h()      (GPIO_SetBits(GPIOB,GPIO_Pin_5))

#define ta6932_sck_l()      (GPIO_ResetBits(GPIOB,GPIO_Pin_3))
#define ta6932_sck_h()      (GPIO_SetBits(GPIOB,GPIO_Pin_3))

#define TIME_US 400
#define STB_IO_REVERT 1
#if (STB_IO_REVERT == 1)

#if 1
#define ta6932_cs_l_a()      (GPIO_SetBits(GPIOD,GPIO_Pin_4))
#define ta6932_cs_h_a()      (GPIO_ResetBits(GPIOD,GPIO_Pin_4))

#define ta6932_cs_l_b()      (GPIO_SetBits(GPIOD,GPIO_Pin_3))
#define ta6932_cs_h_b()      (GPIO_ResetBits(GPIOD,GPIO_Pin_3))
#else
#define ta6932_cs_l_a()      (GPIO_SetBits(GPIOD,GPIO_Pin_3))
#define ta6932_cs_h_a()      (GPIO_ResetBits(GPIOD,GPIO_Pin_3))

#define ta6932_cs_l_b()      (GPIO_SetBits(GPIOD,GPIO_Pin_4))
#define ta6932_cs_h_b()      (GPIO_ResetBits(GPIOD,GPIO_Pin_4))
#endif
#define ta6932_cs_l_c()      (GPIO_SetBits(GPIOD,GPIO_Pin_5))
#define ta6932_cs_h_c()      (GPIO_ResetBits(GPIOD,GPIO_Pin_5))

#define ta6932_cs_l_d()      (GPIO_SetBits(GPIOD,GPIO_Pin_6))
#define ta6932_cs_h_d()      (GPIO_ResetBits(GPIOD,GPIO_Pin_6))

#else


#define ta6932_cs_l_a()      (GPIO_ResetBits(GPIOD,GPIO_Pin_3))
#define ta6932_cs_h_a()      (GPIO_SetBits(GPIOD,GPIO_Pin_3))

#define ta6932_cs_l_b()      (GPIO_ResetBits(GPIOD,GPIO_Pin_4))
#define ta6932_cs_h_b()      (GPIO_SetBits(GPIOD,GPIO_Pin_4))

#define ta6932_cs_l_c()      (GPIO_ResetBits(GPIOD,GPIO_Pin_5))
#define ta6932_cs_h_c()      (GPIO_SetBits(GPIOD,GPIO_Pin_5))

#define ta6932_cs_l_d()      (GPIO_ResetBits(GPIOD,GPIO_Pin_6))
#define ta6932_cs_h_d()      (GPIO_SetBits(GPIOD,GPIO_Pin_6))
#endif
#define delay_us Delay_us

Display_num dis_num = {0};


const unsigned char  tab[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0xef};
u16 ta6932_number[TA6932_LEDCOUNT] = {0};
unsigned char  channel_num = TA6932_LEDCOUNT;
void ta6932_channel_num_init(unsigned char num)
{
	channel_num = num;
}
void TA6932_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
//    u8 i = 0;

    // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

    //PB3 ÊÇSPI_SCK PB5 ÊÇSPI1_MOSI
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    // GPIO_SetBits(GPIOB, GPIO_Pin_3|GPIO_Pin_5);	sck h mosi h
    //GPIO_ResetBits(GPIOB, GPIO_Pin_3|GPIO_Pin_5);	//sck h mosi l

    //PD3456 ÓÃÓÚƬѡ
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    //GPIO_SetBits(GPIOD, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
    //GPIO_ResetBits(GPIOD, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);

    //TEST
    ta6932_mosi_h();
    ta6932_sck_h();
    //ta6932_mosi_l();
    //ta6932_sck_l();

    ta6932_cs_h_a();
    ta6932_cs_h_b();
    ta6932_cs_h_c();
    ta6932_cs_h_d();


    /*
    for(i = 0; i < TA6932_LEDCOUNT; i++)
    {
        ta6932_number[i] = 0;
    }

    TA6932_DisplayAllNumber(ta6932_number);
    */
}

void TA6932_Write_Byte(unsigned char dat)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        if(dat&0x01)
        {
            ta6932_sck_l();
            delay_us(TIME_US);
            ta6932_mosi_h();
            delay_us(TIME_US);
            //	delay_us(10);
            ta6932_sck_h();
            delay_us(TIME_US);
            //	delay_us(10);
        }
        else
        {
            ta6932_sck_l();
            delay_us(TIME_US);
            ta6932_mosi_l();
            delay_us(TIME_US);
            //	delay_us(10);
            ta6932_sck_h();
            delay_us(TIME_US);
            //	delay_us(10);
        }
        dat>>=1;
    }
}

/*ÏÔʾÿ¸öta6932µÄled
dat ÊÇÏÔʾµÄÊý¾Ý½á¹¹£¬20¸ö¶Ë¿ÚµÄÊý¾Ý
num ÊÇƬѡºÅ
*/
void TA6932_Display_Number(Display_num *dat,u8 stb)
{
    u8 i =0;
    u8 j =0;


    switch(stb)
    {
    case 1:
        ta6932_cs_l_a();
        delay_us (TIME_US);
        TA6932_Write_Byte(0x40);
        ta6932_cs_h_a();
        ta6932_sck_h();
        delay_us (TIME_US);

        ta6932_cs_l_a();
        delay_us (TIME_US);
        TA6932_Write_Byte(0xC0);
        // ta6932_sck_h();
        //  delay_us (TIME_US);

        for(i=0; i<5; i++)
        {
            for(j=0; j<3; j++)
            {
                //printf("dat[%d][%d]=0x%x \r\n",i,j,dat->num[i][j]);
                TA6932_Write_Byte(dat->num[i][j]);
            }
        }
        ta6932_cs_h_a();
        ta6932_sck_h();
        delay_us (TIME_US);
        ta6932_cs_l_a();
        delay_us (TIME_US);
        TA6932_Write_Byte(0x8f);
        ta6932_cs_h_a();
        ta6932_sck_h();
        break;

    case 2:
        ta6932_cs_l_b();
        delay_us (TIME_US);
        TA6932_Write_Byte(0x40);
        ta6932_cs_h_b();
        ta6932_sck_h();
        delay_us (TIME_US);
        ta6932_cs_l_b();
        delay_us (TIME_US);
        TA6932_Write_Byte(0xC0);
        //    ta6932_sck_h();
        //delay_us (TIME_US);
        for(i=0; i<5; i++)
        {
            for(j=0; j<3; j++)
            {
                //	printf("dat[%d][%d]=0x%x \r\n",i,j,dat->num[i][j]);
                TA6932_Write_Byte(dat->num[i+5][j]);
            }
        }
        ta6932_cs_h_b();
        ta6932_sck_h();
        delay_us (TIME_US);
        ta6932_cs_l_b();
        delay_us (TIME_US);
        TA6932_Write_Byte(0x8f);
        ta6932_cs_h_b();
        ta6932_sck_h();
        break;

    case 3:
        ta6932_cs_l_c();
        delay_us (TIME_US);
        TA6932_Write_Byte(0x40);
        ta6932_cs_h_c();
        ta6932_sck_h();
        delay_us (TIME_US);
        ta6932_cs_l_c();
        delay_us (TIME_US);
        TA6932_Write_Byte(0xC0);
        for(i=0; i<5; i++)
        {
            for(j=0; j<3; j++)
            {
                TA6932_Write_Byte(dat->num[i+10][j]);
            }
        }
        ta6932_cs_h_c();
        ta6932_sck_h();
        delay_us (TIME_US);
        ta6932_cs_l_c();
        delay_us (TIME_US);
        TA6932_Write_Byte(0x8f);
        ta6932_cs_h_c();
        ta6932_sck_h();
        break;

    case 4:
        ta6932_cs_l_d();
        delay_us (TIME_US);
        TA6932_Write_Byte(0x40);
        ta6932_cs_h_d();
        ta6932_sck_h();
        delay_us (TIME_US);
        ta6932_cs_l_d();
        delay_us (TIME_US);
        TA6932_Write_Byte(0xC0);
        for(i=0; i<5; i++)
        {
            for(j=0; j<3; j++)
            {
                TA6932_Write_Byte(dat->num[i+15][j]);
            }
        }
        ta6932_cs_h_d();
        ta6932_sck_h();
        delay_us (TIME_US);
        ta6932_cs_l_d();
        delay_us (TIME_US);
        TA6932_Write_Byte(0x8f);
        ta6932_cs_h_d();
        ta6932_sck_h();
        break ;

    default :
        break;
    }
}
/*ÏÔʾËùÓÐ20¸ö¶Ë¿ÚµÄÊý×Ö£¬numberÊÇÒ»¸öu16 number[20]µÄÊý×é */
void TA6932_DisplayAllNumber(u16 *number)
{
    u16 num = 0;
    u16 temp = 0;
    u8 i = 0;

    if(number == NULL)
    {
        return ;
    }

    memcpy(ta6932_number,number,sizeof(ta6932_number));

    for(i = 0; i < channel_num; i++ )
    {
        num = ta6932_number[i];
        /*°Ù*/
        temp = num %1000 / 100;
        dis_num.num[i][0] = tab[temp];
        /*Ê®*/
        temp = num %100 / 10;
        dis_num.num[i][1] = tab[temp];
        /*¸ö*/
        temp = num %10;
        dis_num.num[i][2] = tab[temp];
    }
    if(channel_num == 10)
    {
        TA6932_Display_Number(&dis_num, 1);
        TA6932_Display_Number(&dis_num, 2);

    }
    else if(channel_num == 20)
    {
        TA6932_Display_Number(&dis_num, 1);
        TA6932_Display_Number(&dis_num, 2);

        TA6932_Display_Number(&dis_num, 3);
        TA6932_Display_Number(&dis_num, 4);
    }
}
/*ÏÔʾij¸ö¶Ë¿ÚµÄÊý×Ö£¬
portÊǶ˿ںŠ[1~20]
numberÊÇÏÔʾÊý¾Ý£¬¼´³äµç·ÖÖÓÊý£¬
*/
void TA6932_DisplayPortNumber(u8 port, u16 number)
{
    if(port < 1 || port > TA6932_LEDCOUNT)
    {
        return;
    }
    port = (port-1)%TA6932_LEDCOUNT;
	if(number != ta6932_number[port])
	{
	    ta6932_number[port] = number;
	    TA6932_DisplayAllNumber(ta6932_number);
	}
}


标签:ta6932,num,Pin,数码管,TA6932,GPIO,cs,驱动
来源: https://blog.csdn.net/xushx_bigbear/article/details/122739149

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有