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.

[参考译文] 帮助对用于8个交换机的MSP432P401R进行编码,以使用Keil控制两个不同的7段LED

Guru**** 2613075 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/665495/help-coding-my-msp432p401r-for-8-switches-to-control-two-different-7-segment-leds-using-keil

我正在尝试对MSP432的C代码进行编码,使4个开关控制您的7段LED中的一个,而另4个开关控制另一个7段显示屏。 您可以选择所需的LED行为。 交换机还必须由中断驱动。 以下是我目前拥有的内容:

//基本I2C驱动器。
//

#include <stdint.h>
#include "msp.h"
#include "inputoutput.h"
#define NVIC_ISER1 (HWREG32(0xE000E104))/* IRQ 32 to 63 Set Enable Register */(定义NVIC_ISER1 (HWREG32(0xE000E104))/*)

//----------------
// eUSCI等待,直到开始和地址被传输
//----------------
作废WaitStart (void)

while ((UCB0CTLW0 & UCTXSTT)!=0);
}

//----------------
// eUSCI等待直到停止完成
//----------------
空等待站(空)

while ((UCB0CTLW0 & UCTXSTP)!=0);
}

//----------------
// eUSCI等待,直到TX完成
//----------------
作废WaitTx (void)

同时((UCB0IFG和UCTXIFG0)== 0);
}

//----------------
// eUSCI等待,直到RX完成
//----------------
作废WaitRx (void)

同时((UCB0IFG和UCRXIFG0)== 0);
}

//----------------
// eUSCI生成启动
//----------------
作废GenStart (作废)

UCB0CTLW0 |= UCTXSTT;
}

//----------------
// eUSCI生成stop
//----------------
作废GenStop (作废)

UCB0CTLW0 |= UCTXSTP;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//在WFP 4.6 上启用中断。 Port4_IRQHandler应在任何时候调用下面
// 4.6 连接了I2C_SWITCH CHANGE-提供的8个输入中的一个
//到I2C_0上的INT信号。
//
void配置Interrupts()

//确保WFP 4.6 是一个输入,并允许它生成中断。
//也需要一个内部上拉电阻器。
P4DIR &=~BIT6;
P4IES |= BIT6;
P4IE |= BIT6;
P4REN |= BIT6;
P4OUT |= BIT6;
P4IFG &=~BIT6;
NVIC_ISER1 |= BIT6;// IRQ 38
}

//函数原型
extern void EnableInterrupts(void);//在startup_msp432.s中定义为子例程

//在Keil中,将ISR准确命名为以下名称...
void Port4_IRQHandler(void)

//在任何端口4引脚上生成中断
//
//如果上面调用了ConfigureInterrupts(),则可以屏蔽中断
//已启用[通过EnableInterrupts()函数],和
// I2C_0的INT引脚连接到WFP 4.6 ,将调用此ISR
//当DIP开关更改时
//
//这样,MSP432 CPU就不再需要定期轮询交换机
//查看是否有任何更改
//
//通常,ISR应较短,并推迟进一步处理
//任务到主循环-但是,此时主循环不执行任何操作
//因此可以在此处执行其他处理任务
//

//始终清除端口级别的闩锁。
P4IFG &=~BIT6;

// MSP432现在将恢复中断时正在执行的任何操作
//进来了
}

//无参数
void InitI2C (void)

//
//使用以下参数配置:
//* 7位地址。
//*单主环境。
//* MSP432始终为主控。
//* I2C模式。
//*同步模式。
//* SMCLK是源代码。
//*自动触发地址ACK。
//*无中断。
//
UCB0CTLW0|= UCSWRST;//在复位时保持USCI。
P1SEL0 |=0xC0;// WFP 1.7 (SCL)和WFP 1.6 (SDA)多路复用。
P1SEL1 &=~0xC0;
UCB0CTLW0 ||(UCMST | UCMODE_3 | UCSYNC | UCSSEL_2);
UCB0BRW = 400;//将SMCLK除以该系数得出SCL。
UCB0CTLW0 &=~UCSWRST;//释放USCI复位。
}

//
//向I2C目标发送一个字节的数据。
//[注意此处没有错误检查。]
//
void OutI2C (无符号字符地址,无符号字符数据)

UCB0I2CSA =地址;// UCB0I2CSA =<扩展器地址,不带R/W位>。
UCB0CTLW0 |= UCTR;// TX。
GenStart();//生成一个开始。
WaitStart();//等待发送起始地址和从属地址。
WaitTx();//等待,直到可以安全地写入TX缓冲区。
UCB0TXBUF =数据;// UCB0TXBUF =<数据>(准备数据)。
如果((UCB0IFG和UCNACKIFG)== 0)//检查从属设备。

// I2C从属设备响应。
WaitTx ();//等待数据传输完成。
}
否则

// I2C从属设备没有响应。
}
GenStop();//生成一个停止。
WaitStop();//等待停止发送/准备再次运行。
}

//
//从I2C目标接收一个数据字节。
//[注意此处没有错误检查。]
//
unsigned char InI2C (unsigned char地址)

无符号字符RetVal;

UCB0I2CSA =地址;// UCB0I2CSA =<扩展器地址,不带R/W位>。
UCB0CTLW0 &=~UCTR;//接收
GenStart();//生成一个开始。
WaitStart();//等待发送起始地址和从属地址。
如果((UCB0IFG和UCNACKIFG)== 0)//检查从属设备。

// I2C从属设备响应。 获取数据。
WaitRx();//等待数据。
RetVal = UCB0RXBUF;//读取UCB0RXBUF数据。
}
否则

// I2C从属设备没有响应。
}
GenStop();//生成一个停止。
WaitStop();//等待停止发送/准备再次运行。

返回RetVal;
}

内部主(无效)

const unsigned char sevSegTable[16]=

0x40,// 0
0x79,// 1
0x24,// 2
0x30,// 3
0x19,// 4.
0x12,// 5
0x02,// 6
0x78,// 7
0x00,// 8
0x18,// 9
0x08,// A
0x03,// B
0x46,// C
0x21,// D
0x06,// E
0x0E // F
};

//示例:地址= I2C_8574 | I2C_0
//示例:地址= I2C_8574_A | I2C_3
unsigned char switchAddress = I2C_8574 | I2C_0;
unsigned char sevenSegLedAddress = I2C_8574 | I2C_3;
unsigned char sevenSegLedAddress2 = I2C_8574 | I2C_4;
无符号char数据;

ConfigureInterrupts();
EnableInterrupts();



InitI2I();
同时(1)

数据= InI2C (switchAddress);
Data = sevSegTable[data & 0xF];
OutI2C (seventSegLedAddress,数据);
}

//永远不会出现这种情况(编译器可能会发出警告)
//返回0;
}

我只是不知道如何移动开关地址,以便只更改一个LED,而另4个LED更改另一个LED。 我还制作了一个查找表,以便LED将根据四个开关显示十六进制数字/字母。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很乐意为您提供帮助,但仅在您在此处发布了279次相同的请求之后。 :)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我很抱歉。 它说发布时出错,所以我尝试将其发布到其他地方,然后我的网页不会更改。 如何删除它们?

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

    这似乎是一篇重复的文章,所以我要关闭此主题。

    e2e.ti.com/.../66.5494万

    此致,

    詹姆斯

    MSP客户应用程序