This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430G2553:使用 max7219ENG 驱动7段、但不适用于 MSP430

Guru**** 2538950 points
Other Parts Discussed in Thread: MSP430G2553

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/999693/msp430g2553-drived-7-segment-using-max7219eng-but-doesnt-worked-msp430

器件型号:MSP430G2553

在 ti 论坛上找不到任何 max7219驱动7段的示例、因此我找到了一个在 PIC 微控制器上工作的代码。 然后我将代码转换为 msp430g2553。 但没有发生任何事情。这是网站(https://microcontrollerslab.com/max7219-interfacing-8-digit-7-segment-display-pic16f877a/)。

这是我的代码:

#include "io430.h"

#define SPI_SIMO BIT2
#define SPI_CLK BIT4
#define SPI_CS BIT3 //加载或/CS


#define DECODE_MODE_REG 0x09
#define Intese_REG 0x0A
#define SCAN_LIMIT_REG 0x0B
#define SHUTDOWN_REG 0x0C
#define DISPLAY_TEST_REG 0x0F
///----------------------------------
#define DISABLE_DE解码0x00
#define decode_all 0xFF
#define 亮度0x0F
#define SCAN_LOW_N半 字节0x03
#define SCAN_All_digits 0x0F
#define SHUTDOWN_MODE 0x00
#define NORMAL 运行0x01
#define DISABLE_TEST_MODE 0x00
#define ENABLE_TEST_MODE 0x01
void SPI_Init (void)//SPI 初始化

UCA0CTL1 |= UCSWRST;// USCI 处于复位状态(用于 CONFIG)
//前沿+ MSB 优先+主器件+同步模式(SPI)
UCA0CTL0 = UCCKPH + UCMSB + UCMST + UCSYNC;
UCA0CTL1 |= UCSSEL_2;// SMCLK 作为时钟源
UCA0BR0 |= 0x01;// SPI 速度(与 SMCLK 相同)
UCA0BR1=0;
P1SEL |= SPI_SIMO + SPI_CLK;//设置 USCI 的端口引脚
P1SEL2 |= SPI_SIMO + SPI_CLK;
UCA0CTL1 &=~Ω UCSWRST;//清除 USCI 复位状态

void MAX7219_write (char reg1、char data1)

P1OUT &=~(SPI_CS);
_DELAY_CYCLES (50);
UCA0TXBUF = reg1;
while (UCA0STAT 和 UCBUSY);
UCA0TXBUF = data1;
while (UCA0STAT 和 UCBUSY);
P1OUT |= SPI_CS;

void MAX7219_init()

SPI_Init();

MAX7219_WRITE (DECODE_MODE_REG、DECODE_ALL);
MAX7219_WRITE (亮度寄存器、亮度);
MAX7219_WRITE (SCAN_LIMIT_REG、SCAN_ALL_DIGITS);
MAX7219_WRITE (SHUTDOWN_REG、NORMAL 运行);
MAX7219_WRITE (DISPLAY_TEST_REG、ENABLE_TEST_MODE);
MAX7219_WRITE (DISPLAY_TEST_REG、DISABLE_TEST_MODE);

void Max7219Print (无符号长数、无符号短数 OfDigits)

长 I;
for (i=1;number>0||i-NumberOfDigits<=0;number/=10、i++)

P1OUT &=~(SPI_CS);
_DELAY_CYCLES (50);
UCA0TXBUF = I;
while (UCA0STAT 和 UCBUSY);
UCA0TXBUF =编号%10;
while (UCA0STAT 和 UCBUSY);
P1OUT |= SPI_CS;

void Max7219DisplayOff()

P1OUT &=~(SPI_CS);
_DELAY_CYCLES (50);
UCB0TXBUF = SHUTDOWN_REG;
while (UCA0STAT 和 UCBUSY);
UCB0TXBUF = DISABLE_DEBUG;
while (UCB0STAT 和 UCBUSY);
P1OUT |= SPI_CS;

void Max7219DisplayOn()

P1OUT &=~(SPI_CS);
_DELAY_CYCLES (50);
UCB0TXBUF = SHUTDOWN_REG;
while (UCB0STAT 和 UCBUSY);
UCB0TXBUF = NORMAL 运行;
while (UCB0STAT 和 UCBUSY);
P1OUT |= SPI_CS;

void Max7219UpdateIntensity (char OnValue)

if (OnValue>=0 && OnValue<=15)

P1OUT &=~(SPI_CS);
_DELAY_CYCLES (50);
UCB0TXBUF = 0x0a;
while (UCB0STAT 和 UCBUSY);
UCB0TXBUF = OnValue;
while (UCB0STAT 和 UCBUSY);
P1OUT |= SPI_CS;


unsigned long i;
int main (空)

WDTCTL = WDTPW | WDTHOLD;
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
P1DIR |= SPI_SIMO + SPI_CLK + SPI_CS;
P1OUT &=~(SPI_CS);// MAX7221芯片选择为高电平无效
SPI_Init();
MAX7219_init();
Max7219DisplayOn();
_DELAY_CYCLES (100000);
MAX7219_init();
_DELAY_CYCLES (1000);

while (1)//循环永远

对于(i=0;i<9999;i++)//从0到99999计数并显示在8 7个段上

Max7219Print (I、8);
_DELAY_CYCLES (1000);



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否正在使用 Launchpad? 如果是、请确保从 J101 ("桥接接头")上移除 RXD/TXD 跳线。

    我不熟悉 MAX7219、但我看不到您的代码有任何明显错误。 (如果使用“插入”->“代码”进行粘贴,则更易于阅读。)

    DISPLAY_TEST_REG 是否显示任何内容? 可能会在启用和禁用之间增加人的延迟。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    #include "io430.h"
    #include "in430.h"
    #define SPI_SIMO	BIT2
    #define SPI_CLK		BIT4
    #define SPI_CS		BIT3	// Load or /CS
    
    
    #define DECODE_MODE_REG     0x09
    #define INTESITY_REG        0x0A
    #define SCAN_LIMIT_REG      0x0B
    #define SHUTDOWN_REG        0x0C
    #define DISPLAY_TEST_REG    0x0F
    //------------------------------------------------------------------------------
    #define DISABLE_DECODE      0x00
    #define DECODE_ALL          0xFF
    #define BRIGHTNESS          0x0F
    #define SCAN_LOW_NIBBLE     0x03
    #define SCAN_ALL_DIGITS     0x07
    #define SHUTDOWN_MODE       0x00
    #define NORMAL_OPERATION    0x01
    #define DISABLE_TEST_MODE   0x00
    #define ENABLE_TEST_MODE    0x01
    void SPI_Init(void) //SPI initialization
    {
            UCA0CTL1 |= UCSWRST; 		// USCI in Reset State (for config)
    	// Leading edge + MSB first + Master + Sync mode (spi)
    	UCA0CTL0 = UCCKPH + UCMSB + UCMST + UCSYNC;
    	UCA0CTL1 |= UCSSEL_2; 		// SMCLK as clock source
    	UCA0BR0 |= 0x01; 		// SPI speed (same as SMCLK)
    	UCA0BR1 = 0;
    	P1SEL |= SPI_SIMO + SPI_CLK;	// Set port pins for USCI
    	P1SEL2 |= SPI_SIMO + SPI_CLK;
    	UCA0CTL1 &= ~UCSWRST; 		// Clear USCI Reset State
    }
    void MAX7219_write(char reg1, char data1)
    {
      P1OUT &= ~(SPI_CS);
      __delay_cycles(50);
      UCA0TXBUF  = reg1 ;
    while (UCA0STAT & UCBUSY);
      UCA0TXBUF  = data1 ;
      while (UCA0STAT & UCBUSY);
      P1OUT |= SPI_CS;
    }
    void MAX7219_init()
    {
      SPI_Init();
    
      MAX7219_write(DECODE_MODE_REG,DECODE_ALL);
      MAX7219_write(INTESITY_REG,BRIGHTNESS);
      MAX7219_write(SCAN_LIMIT_REG,SCAN_ALL_DIGITS);
      MAX7219_write(SHUTDOWN_REG,NORMAL_OPERATION);
      MAX7219_write(DISPLAY_TEST_REG,ENABLE_TEST_MODE);
      MAX7219_write(DISPLAY_TEST_REG,DISABLE_TEST_MODE);
    }
    void Max7219Print(unsigned long Number, unsigned short NumberOfDigits)
    {
      long i;
      for(i=1;Number>0||i-NumberOfDigits<=0;Number/=10,i++)
      {
      P1OUT &= ~(SPI_CS);
      __delay_cycles(50);
      UCA0TXBUF  = i ;
      while (UCA0STAT & UCBUSY);
      UCA0TXBUF  = Number%10 ;
     while (UCA0STAT & UCBUSY);
      P1OUT |= SPI_CS;
      }
    }
    
    void Max7219DisplayOff()
    {
      P1OUT &= ~(SPI_CS);
      __delay_cycles(50);
      UCB0TXBUF = SHUTDOWN_REG;
      while (UCA0STAT & UCBUSY);
      UCB0TXBUF = DISABLE_DECODE;
      while (UCB0STAT & UCBUSY);
      P1OUT |= SPI_CS;
    }
    
    void Max7219DisplayOn()
    {
      P1OUT &= ~(SPI_CS);
      __delay_cycles(50);
      UCB0TXBUF = SHUTDOWN_REG;
      while (UCB0STAT & UCBUSY);
      UCB0TXBUF = NORMAL_OPERATION;
      while (UCB0STAT & UCBUSY);
      P1OUT |= SPI_CS;
    }
    
    void Max7219UpdateIntensity(char OnValue)
    {
      if(OnValue>=0 && OnValue<=15)
      {
        P1OUT &= ~(SPI_CS);
      __delay_cycles(50);
      UCB0TXBUF = 0x0a;
      while (UCB0STAT & UCBUSY);
      UCB0TXBUF = OnValue;
      while (UCB0STAT & UCBUSY);
      P1OUT |= SPI_CS;
      }
    }
    unsigned long i;
    int main(void)
    {
       WDTCTL = WDTPW | WDTHOLD;
       BCSCTL1 = CALBC1_8MHZ;
       DCOCTL  = CALDCO_8MHZ;
       P1DIR |= SPI_SIMO + SPI_CLK + SPI_CS;
       P1OUT &= ~(SPI_CS); // MAX7221 Chip Select is inactive high
       SPI_Init();
       MAX7219_init();
        Max7219DisplayOn();
       __delay_cycles(100000);
       MAX7219_init();
      __delay_cycles(1000);
    
      while(1)// loop forever
      {
        for(i=0;i<99999999;i++)//Count From 0 To 99999999 And Display on 8 Seven segemnts
        {
           Max7219Print(i,4);
          __delay_cycles(1000);
        }
      }
           
    }

    您好、感谢您的回答。 İ 执行了您所说的操作、删除了 TX 和 Rx 并提供了更好的源。 现在、所有数字和所有段都在闪烁。 İ 还调试了代码、然后分步执行。 每个 for 循环闪烁所有段和所有数字。   

    İ 如果不能使 max7219工作,就没有太多时间进行这个项目,我会用另一种方法

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Hakan、

    在移植代码时、可能需要考虑一些时钟频率差异。
    我想、如果您用示波 器抓取 PIC 和 MSP430波形、它可能会帮助您诊断问题。

    谢谢!

    此致

    Johnson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Johnson、

    由于使用隔离、我无法到达示波器等设备。 我认为我不是这么做的人。 İ 我想我将使用移位寄存器或将段直接连接到 MSP430。

    • 谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在亚马逊上跑过一些 gizmos、它们将 max7219封装到显示屏上。 该品牌是 ACEIRMC、但它看起来与许多其他优惠相同:

    https://www.amazon.com/gp/product/B08L7MGKSD

    其中一个连接到运行代码的 G2ET Launchpad 似乎计数正常。 我尚未检查功耗、但我记得 G2ET 只能提供大约60mA 的电流。

    可能需要检查下一件事是接线?

    [编辑:我确实注意到上电操作:当我为 LP+显示屏上电时、不会显示任何内容、但如果我然后重置它显示的 MCU。 我在数据表中看不到这方面的任何信息、但这是值得注意的。]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、由于我们必须为项目制作一个 PCB、我无法使用您说过的器件。 İ 已订购两个75hc595芯片。 一个用于句段、另一个用于数字。 İ 如果出现问题、我会再次询问您。 谢谢。 但我稍后会尝试它。 本学期结束时:)