工具/软件:Code Composer Studio
我正在尝试对MSP432的C代码进行编码,使4个开关控制您的7段LED中的一个,而另4个开关控制另一个7段显示屏。 您可以选择所需的LED行为。 交换机还必须由中断驱动。 以下是我目前拥有的内容:
//基本I2C驱动器。
//在MSP432上运行。
//马特·劳汉(2015年15月11日)
//
#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将根据四个开关显示十六进制数字/字母。