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

[复制链接]
 楼主| 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
  1. #include "config.h"


  2. /* Initializes Clock System */
  3. void CS_init()
  4. {
  5.     /* Set the core voltage level to VCORE1 */
  6.     MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);

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

  10.     /* Initializes Clock System */
  11.     MAP_CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);
  12.     MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
  13.     MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
  14.     MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
  15.     MAP_CS_initClockSignal(CS_ACLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
  16. }


  17. int main(void)
  18. {
  19.     uint32_t i;
  20.         uint8_t dispdat[8];
  21.         uint32_t js=0;

  22.     // Stop watchdog timer
  23.     //WDT_A_hold(WDT_A_BASE);
  24.                 MAP_WDT_A_holdTimer();
  25.                 MAP_Interrupt_disableMaster();
  26.                 CS_init();
  27.                 //__delay_cycles(1000000);
  28.                 LED_Init();
  29.                 UART0_Init();
  30.                 TM1638_Init();
  31.                 //__delay_cycles(1000000);
  32.         for(i=0;i<8;i++)
  33.         {
  34.                 dispdat[i]=0;
  35.         }
  36.     while(1)
  37.     {
  38.                                 UART0_transmitString( "www.21ic.com -- msp432p401r\r\n" );
  39.                                 for(i=100000; i>0; i--);
  40.                                 if(js>9999)
  41.                                 {
  42.                                         js=0;
  43.                                 }
  44.                                 js++;
  45.                                 dispdat[4]=js/1000;
  46.                                 dispdat[5]=(js%1000)/100;
  47.                                 dispdat[6]=((js%1000)%100)/10;
  48.                                 dispdat[7]=((js%1000)%100)%10;
  49.                                 disp_led(dispdat);
  50.     }
  51. }

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

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

  3. //writebyte                                                                                 
  4. void tm1638_WriteDat(uint8_t dat)                        
  5. {
  6.         uint8_t i;
  7.         for(i=0;i<8;i++)
  8.         {
  9.                 clk_l();
  10.                 if(dat&0X01)
  11.                 {
  12.                         dio_h();
  13.                 }        
  14.                 else
  15.                 {
  16.                         dio_l();
  17.                 }
  18.                         
  19.                 dat>>=1;
  20.                 clk_h();
  21.         }
  22. }
  23. void tm1638_Write_cmd(uint8_t cmd)                 
  24. {
  25.         stb_l();
  26.         tm1638_WriteDat(cmd);
  27.         stb_h();
  28. }

  29. void tm1638_Write_Addr(uint8_t addr,uint8_t dat)                 
  30. {
  31.         tm1638_Write_cmd(0x44);
  32.         stb_l();
  33.         tm1638_WriteDat(0xc0|addr);
  34.         tm1638_WriteDat(dat);
  35.         stb_h();
  36. }

  37. void tm1638_Write_LED(uint8_t LED_flag)                                         
  38. {
  39.         uint8_t i;
  40.         for(i=0;i<8;i++)
  41.         {
  42.                 if(LED_flag&(1<<i))
  43.                 {
  44.                         tm1638_Write_Addr(2*i+1,1);
  45.                 }
  46.                 else
  47.                         tm1638_Write_Addr(2*i+1,0);
  48.         }
  49. }

  50. void TM1638_GpioInit(void)
  51. {

  52.         GPIO_setAsOutputPin( GPIO_PORT_P2, GPIO_PIN5 );                //P2.5
  53.         GPIO_setAsOutputPin( GPIO_PORT_P2, GPIO_PIN6 );                //P2.6
  54.         GPIO_setAsOutputPin( GPIO_PORT_P2, GPIO_PIN7 );                //P2.7
  55.         
  56. }

  57. //TM1638 INIT
  58. void TM1638_Init(void)
  59. {
  60.         uint8_t i;
  61.         
  62.         TM1638_GpioInit();
  63.         
  64.         tm1638_Write_cmd(0x8b);
  65.         tm1638_Write_cmd(0x40);
  66.         stb_l();
  67.         tm1638_WriteDat(0xc0);   

  68.         for(i=0;i<16;i++)           
  69.         {
  70.                 tm1638_WriteDat(0x00);
  71.         }
  72.         stb_h();
  73.         
  74.         for(i=0;i<8;i++)
  75.         {
  76.         tm1638_Write_Addr(i<<1,tab[0]);                       //³õʼ»¯¼Ä´æÆ÷
  77.         }
  78. }


  79. void disp_led(uint8_t *dat)
  80. {
  81.         uint8_t i;
  82.         for(i=0;i<8;i++)
  83.         {
  84.                 tm1638_Write_Addr(i<<1,tab[dat[i]]);                        
  85.         }
  86. }


    1.3、tm1638.h
  1. #ifndef TM1638_H_
  2. #define TM1638_H_


  3. #define dio_l()         GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN5)
  4. #define dio_h()                GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN5)

  5. #define clk_l()         GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6)
  6. #define clk_h()                GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6)

  7. #define stb_l()         GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7)
  8. #define stb_h()        GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7)

  9. void TM1638_Init(void);
  10. void disp_led(uint8_t *dat);

  11. #endif


    三、执行结果

    数码管正常显示。
   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
zhangmangui 发表于 2020-4-21 23:11 | 显示全部楼层
感谢分享   很炫     
zhangmangui 发表于 2020-4-21 23:12 | 显示全部楼层
这款可以跑系统吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部

132

主题

701

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部