msp430f5438a和tm1638

2019-07-15 00:32发布


// ***两者的电路连接:P4.0--DIO   P4.1--STB   P4.2--CLK  tm1638的VCC和GND接5V的电源箱***

// STB=0 ---> P4OUT &= 0x05
// STB=1 ---> P4OUT |= 0x02
// CLK=0 ---> P4OUT &= 0x02
// CLK=1 ---> P4OUT |= 0x06
// DIO=0 ---> P4OUT &= 0x06
// DIO=1 ---> P4OUT |= 0x01


#include<TM1638_zj.h>

#include"msp430f5438a.h"



#define  STB_0   P4OUT &= 0x05
#define  STB_1   P4OUT |= 0x02
#define  CLK_0   P4OUT &= 0x03
#define  CLK_1   P4OUT |= 0x06
#define  DIO_0   P4OUT &= 0x06
#define  DIO_1   P4OUT |= 0x01
#define  DIO_IN  P4DIR &= ~BIT0
#define  DIO_OUT P4DIR |= BIT0      //CLK  STB 一直为输出   P4DIR |= BIT0 + BIT1 + BIT2

unsigned char tap1[16] = {0x6f, 0x00, 0xf3, 0x00, 0xbf, 0x00, 0x6d, 0x00, 0x45, 0x00, 0x1d, 0x00, 0x7d, 0x00, 0x01, 0x00}; //12345678,从地址00H写入
unsigned char tap2[16] = {0xf6, 0x00, 0xcf, 0x00, 0xfd, 0x00, 0xb6, 0x00, 0xa2, 0x00, 0xa8, 0x00, 0xae, 0x00, 0x01, 0x00}; //87654321,从地址00H写入
unsigned int j;

/****延时程序*******/
void delay_zj(unsigned long time)
         {
          while(time--) ;                   
         }
         

void DigitalTube1(void)    //数码管显示,地址自动增加,12345678
{
  unsigned char i;
  Write_COM(0x8a);  //  打开显示,脉冲宽度4/16
  Write_COM(0x40);  //  写数据到显示寄存器,地址自动增加模式
  STB_0;          //  变低为了写命令字节(地址),然后需要直接开始传送数据,传送完成后,才能再次置1
  TM1638_Write(0xc0);  //  地址从 00H 开始
  j=0;
  for(i=0;i<16;i++)
  {
    TM1638_Write(tap1[j]);
    j++;
  }
  STB_1;  
}

void DigitalTube2(void)    //数码管显示,固定地址,87654321
{
  unsigned char i, ads;
  Write_COM(0x8a);
  Write_COM(0x8a);  //  打开显示,脉冲宽度4/16(只用了一条命令语句,和初始化函数不同)
  Write_COM(0x44);  //  写数据到显示寄存器,固定地址模式
  ads = 0xc0;
  j=0;
  for(i=0;i<8;i++)
  {
    STB_0;
    TM1638_Write(ads);  //  地址从 00H 开始
    TM1638_Write(tap2[j]);
    STB_1;
    ads = ads + 2;
    j = j + 2;
  }
}

void TM1638_Write(unsigned char        DATA)                        //写数据函数
{
        unsigned char i;
        DIO_OUT;
        for(i=0;i<8;i++)
        {
                CLK_0;
                if(DATA&0X01)                       //从最低位开始写入
                        DIO_1;
                else
                        DIO_0;
                DATA>>=1;
                CLK_1;                            //给一个上升沿,完成写入
        }
}


               
void Write_COM(unsigned char cmd)                //发送命令字,后面不需要传送数据的子程序调用
{
        STB_0;                     //在STB下降沿后由DIO输入的第一个字节作为一条指令。
        TM1638_Write(cmd);         //经过译码,取最高B7、B6两位比特位以区别不同的指令。
        STB_1;                     //上升沿写入,STB为高时,CLK被忽略
}



void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  P4DIR |= BIT0 + BIT1 + BIT2;                       //P4.0--DIO   P4.1--STB    P4.2--CLK

  P7SEL |= BIT0 + BIT1;                       //Enable XT1
  UCSCTL6 &= ~(XT1OFF);
  UCSCTL6 |= XCAP_3;                  //  到底是把这个电容接到哪里???

  do
  {
    UCSCTL7 &= ~XT1LFOFFG;
  }while(UCSCTL7&XT1LFOFFG);
  while(1)
  {
  DigitalTube1();
  delay_zj(50000);
  DigitalTube2();
  delay_zj(50000);
  }
  
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
dirtwillfly
1楼-- · 2019-07-15 10:13
这种情况,大部分是时序问题。建议先用逻辑分*析仪或者示波器观察一下时序
吉祥peacock
2楼-- · 2019-07-15 12:51
 精彩回答 2  元偷偷看……
吉祥peacock
3楼-- · 2019-07-15 14:39
dirtwillfly 发表于 2017-11-11 15:58
这种情况,大部分是时序问题。建议先用逻辑分*析仪或者示波器观察一下时序 ...

我又看到一个别的他们两个之间的通信程序,是用了SPI通信方式写的, 用了专门的数据接收P3.5 发送 P3.4 端口和时钟发送P3.1 端口,但是我稍微修改了一下  用到了msp430f5438a上    示波器输出的波形也还是不对。参考链接 forum.43oh.com/topic/2270-tm1638-leds-interface-_version-170-available
吉祥peacock
4楼-- · 2019-07-15 17:24
dirtwillfly 发表于 2017-11-11 15:58
这种情况,大部分是时序问题。建议先用逻辑分*析仪或者示波器观察一下时序 ...

我又看到一个别的他们两个之间的通信程序,是用了SPI通信方式写的, 用了专门的数据接收P3.5 发送 P3.4 端口和时钟发送P3.1 端口,但是我稍微修改了一下  用到了msp430f5438a上    示波器输出的波形也还是不对。参考链接 forum.43oh.com/topic/2270-tm1638-leds-interface-_version-170-available
dirtwillfly
5楼-- · 2019-07-15 23:07
吉祥peacock 发表于 2017-11-15 15:26
我又看到一个别的他们两个之间的通信程序,是用了SPI通信方式写的, 用了专门的数据接收P3.5 发送 P3.4  ...

这个程序是基于g2553的,需要移植到f5438a才可以
吉祥peacock
6楼-- · 2019-07-16 01:14
dirtwillfly 发表于 2017-11-15 16:36
这个程序是基于g2553的,需要移植到f5438a才可以

所谓移植  就是把里面用到的端口改成5438a的对应端口和寄存器指令吧  我都改了  但是还是不可以

一周热门 更多>