打印
[MCU]

【MSP432评测】 -- 2、驱动TM1638点亮LED数码管

[复制链接]
1332|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tlled|  楼主 | 2020-4-21 08:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tlled 于 2020-4-21 08:59 编辑

        使用MSP432P401R驱动TM1638来点亮LED数码管。

    一、硬件电路

   1.1、LED驱动板电路图
   
   

    1.2、MCU部分电路图

    使用P2.5、P2.6、P2.7来驱动TM1638模块
   

    二、驱动程序


   2.1、main.c
#include "config.h"


/* Initializes Clock System */
void CS_init()
{
    /* Set the core voltage level to VCORE1 */
    MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);

    /* Set 2 flash wait states for Flash bank 0 and 1*/
    MAP_FlashCtl_setWaitState(FLASH_BANK0, 2);
    MAP_FlashCtl_setWaitState(FLASH_BANK1, 2);

    /* Initializes Clock System */
    MAP_CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);
    MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
    MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
    MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
    MAP_CS_initClockSignal(CS_ACLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
}


int main(void)
{
    uint32_t i;
        uint8_t dispdat[8];
        uint32_t js=0;

    // Stop watchdog timer
    //WDT_A_hold(WDT_A_BASE);
                MAP_WDT_A_holdTimer();
                MAP_Interrupt_disableMaster();
                CS_init();
                //__delay_cycles(1000000);
                LED_Init();
                UART0_Init();
                TM1638_Init();
                //__delay_cycles(1000000);
        for(i=0;i<8;i++)
        {
                dispdat[i]=0;
        }
    while(1)
    {
                                UART0_transmitString( "www.21ic.com -- msp432p401r\r\n" );
                                for(i=100000; i>0; i--);
                                if(js>9999)
                                {
                                        js=0;
                                }
                                js++;
                                dispdat[4]=js/1000;
                                dispdat[5]=(js%1000)/100;
                                dispdat[6]=((js%1000)%100)/10;
                                dispdat[7]=((js%1000)%100)%10;
                                disp_led(dispdat);
    }
}

   2.2、tm1638.c
#include "config.h"

uint8_t const tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

//writebyte                                                                                 
void tm1638_WriteDat(uint8_t dat)                        
{
        uint8_t i;
        for(i=0;i<8;i++)
        {
                clk_l();
                if(dat&0X01)
                {
                        dio_h();
                }        
                else
                {
                        dio_l();
                }
                        
                dat>>=1;
                clk_h();
        }
}
void tm1638_Write_cmd(uint8_t cmd)                 
{
        stb_l();
        tm1638_WriteDat(cmd);
        stb_h();
}

void tm1638_Write_Addr(uint8_t addr,uint8_t dat)                 
{
        tm1638_Write_cmd(0x44);
        stb_l();
        tm1638_WriteDat(0xc0|addr);
        tm1638_WriteDat(dat);
        stb_h();
}

void tm1638_Write_LED(uint8_t LED_flag)                                         
{
        uint8_t i;
        for(i=0;i<8;i++)
        {
                if(LED_flag&(1<<i))
                {
                        tm1638_Write_Addr(2*i+1,1);
                }
                else
                        tm1638_Write_Addr(2*i+1,0);
        }
}

void TM1638_GpioInit(void)
{

        GPIO_setAsOutputPin( GPIO_PORT_P2, GPIO_PIN5 );                //P2.5
        GPIO_setAsOutputPin( GPIO_PORT_P2, GPIO_PIN6 );                //P2.6
        GPIO_setAsOutputPin( GPIO_PORT_P2, GPIO_PIN7 );                //P2.7
        
}

//TM1638 INIT
void TM1638_Init(void)
{
        uint8_t i;
        
        TM1638_GpioInit();
        
        tm1638_Write_cmd(0x8b);
        tm1638_Write_cmd(0x40);
        stb_l();
        tm1638_WriteDat(0xc0);   

        for(i=0;i<16;i++)           
        {
                tm1638_WriteDat(0x00);
        }
        stb_h();
        
        for(i=0;i<8;i++)
        {
        tm1638_Write_Addr(i<<1,tab[0]);                       //³õʼ»¯¼Ä´æÆ÷
        }
}


void disp_led(uint8_t *dat)
{
        uint8_t i;
        for(i=0;i<8;i++)
        {
                tm1638_Write_Addr(i<<1,tab[dat[i]]);                        
        }
}


    1.3、tm1638.h
#ifndef TM1638_H_
#define TM1638_H_


#define dio_l()         GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN5)
#define dio_h()                GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN5)

#define clk_l()         GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6)
#define clk_h()                GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6)

#define stb_l()         GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7)
#define stb_h()        GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7)

void TM1638_Init(void);
void disp_led(uint8_t *dat);

#endif


    三、执行结果

    数码管正常显示。
   

使用特权

评论回复

相关帖子

沙发
zhangmangui| | 2020-4-21 23:11 | 只看该作者
感谢分享   很炫     

使用特权

评论回复
板凳
zhangmangui| | 2020-4-21 23:12 | 只看该作者
这款可以跑系统吧

使用特权

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

本版积分规则

125

主题

690

帖子

6

粉丝