对于基于中断的传输,用户必须为USCI_B_I2C设备注册中断处理程序并启用USCI_B_I2C中断。
在MSP430中,超时(Timeout)是指在特定时间内未能完成某个操作或接收到预期的响应。它通常用于处理通信协议中的错误或异常情况,以防止程序陷入无限等待或死锁状态。
在某些通信协议中,例如I2C或UART,设备之间的通信可能会发生错误或超时。当发生这种情况时,为了确保程序的正常运行,可以设置一个超时机制。超时机制会在设定的时间内检测是否收到预期的响应,如果超过设定的时间仍未收到响应,则认为操作失败或通信出现问题。
超时可以根据具体应用和通信协议的要求进行设置。通常,可以使用定时器或计数器来实现超时功能。在超时期间,程序可以执行相应的错误处理或尝试重新发送数据。
超时的设定取决于通信环境、通信速度和所需的响应时间。通过合理设置超时时间,可以提高系统的鲁棒性和可靠性,避免长时间的等待或阻塞情况,从而提高程序的性能和响应能力。
二、I2C通信库函数
// 初始化I2C主模块
void USCI\_B\_I2C\_initMaster(uint16\_t baseAddress, USCI_B_I2C_initMasterParam \*param);
// 初始化I2C从模块
void USCI\_B\_I2C\_initSlave(uint16\_t baseAddress, uint8\_t slaveAddress);
// 启用I2C模块
void USCI\_B\_I2C\_enable(uint16\_t baseAddress);
// 禁用I2C模块
void USCI\_B\_I2C\_disable(uint16\_t baseAddress);
// 设置I2C主模块将在总线上放置的地址
void USCI\_B\_I2C\_setSlaveAddress(uint16\_t baseAddress, uint8\_t slaveAddress);
// 设置I2C设备的模式
void USCI\_B\_I2C\_setMode(uint16\_t baseAddress, uint8\_t mode);
// 从I2C模块发送一个字节
void USCI\_B\_I2C\_slavePutData(uint16\_t baseAddress, uint8\_t transmitData);
// 接收已发送到I2C模块的字节
uint8\_t USCI\_B\_I2C\_slaveGetData(uint16\_t baseAddress);
// 指示I2C总线是否忙
uint8\_t USCI\_B\_I2C\_isBusBusy(uint16\_t baseAddress);
// 【已弃用】该功能可能在将来的版本中被删除。指示I2C模块是否忙
uint8\_t USCI\_B\_I2C\_isBusy(uint16\_t baseAddress);
// 指示是否已发送停止位
uint8\_t USCI\_B\_I2C\_masterIsStopSent(uint16\_t baseAddress);
// 指示是否已发送起始位
uint8\_t USCI\_B\_I2C\_masterIsStartSent(uint16\_t baseAddress);
// 主模块用于启动起始位的函数
void USCI\_B\_I2C\_masterSendStart(uint16\_t baseAddress);
// 启用单独的I2C中断源
void USCI\_B\_I2C\_enableInterrupt(uint16\_t baseAddress, uint8\_t mask);
// 禁用单独的I2C中断源
void USCI\_B\_I2C\_disableInterrupt(uint16\_t baseAddress, uint8\_t mask);
// 清除I2C中断源
void USCI\_B\_I2C\_clearInterrupt(uint16\_t baseAddress, uint8\_t mask);
// 获取当前I2C中断状态
uint8\_t USCI\_B\_I2C\_getInterruptStatus(uint16\_t baseAddress, uint8\_t mask);
// 从主模块向从模块发送单个字节
void USCI\_B\_I2C\_masterSendSingleByte(uint16\_t baseAddress, uint8\_t txData);
// 从主模块向从模块发送单个字节,并带有超时功能
bool USCI\_B\_I2C\_masterSendSingleByteWithTimeout(uint16\_t baseAddress, uint8\_t txData, uint32\_t timeout);
// 从主模块启动多字节传输到从模块
void USCI\_B\_I2C\_masterSendMultiByteStart(uint16\_t baseAddress, uint8\_t txData);
// 从主模块启动多字节传输到从模块,并带有超时功能
bool USCI\_B\_I2C\_masterSendMultiByteStartWithTimeout(uint16\_t baseAddress, uint8\_t txData, uint32\_t timeout);
// 从主模块继续多字节传输到从模块
void USCI\_B\_I2C\_masterSendMultiByteNext(uint16\_t baseAddress, uint8\_t txData);
// 从主模块继续多字节传输到从模块,并带有超时功能
bool USCI\_B\_I2C\_masterSendMultiByteNextWithTimeout(uint16\_t baseAddress, uint8\_t txData, uint32\_t timeout);
// 从主模块完成多字节传输到从模块
void USCI\_B\_I2C\_masterSendMultiByteFinish(uint16\_t baseAddress, uint8\_t txData);
// 从主模块完成多字节传输到从模块,并带有超时功能
bool USCI\_B\_I2C\_masterSendMultiByteFinishWithTimeout(uint16\_t baseAddress, uint8\_t txData, uint32\_t timeout);
// 从主模块发送停止位以结束多字节传输到从模块
void USCI\_B\_I2C\_masterSendMultiByteStop(uint16\_t baseAddress);
// 从主模块发送停止位以结束多字节传输到从模块,并带有超时功能
bool USCI\_B\_I2C\_masterSendMultiByteStopWithTimeout(uint16\_t baseAddress, uint32\_t timeout);
// 从主模块开始多字节接收
void USCI\_B\_I2C\_masterReceiveMultiByteStart(uint16\_t baseAddress);
// 从主模块逐个字节开始多字节接收
uint8\_t USCI\_B\_I2C\_masterReceiveMultiByteNext(uint16\_t baseAddress);
// 从主模块完成多字节接收
uint8\_t USCI\_B\_I2C\_masterReceiveMultiByteFinish(uint16\_t baseAddress);
// 从主模块完成多字节接收,并带有超时功能
bool USCI\_B\_I2C\_masterReceiveMultiByteFinishWithTimeout(uint16\_t baseAddress, uint8\_t \*rxData, uint32\_t timeout);
// 从主模块发送停止位以结束多字节接收
void USCI\_B\_I2C\_masterReceiveMultiByteStop(uint16\_t baseAddress);
// 从主模块开始单字节接收
void USCI\_B\_I2C\_masterReceiveSingleStart(uint16\_t baseAddress);
// 从主模块开始单字节接收,并带有超时功能
bool USCI\_B\_I2C\_masterReceiveSingleStartWithTimeout(uint16\_t baseAddress, uint32\_t timeout);
// 从I2C主模块接收已发送到其的字节
uint8\_t USCI\_B\_I2C\_masterReceiveSingle(uint16\_t baseAddress);
// 返回用于DMA模块的I2C接收缓冲区的地址
uint32\_t USCI\_B\_I2C\_getReceiveBufferAddressForDMA(uint16\_t baseAddress);
// 返回用于DMA模块的I2C发送缓冲区的地址
uint32\_t USCI\_B\_I2C\_getTransmitBufferAddressForDMA(uint16\_t baseAddress);
三、OLED驱动代码
OLED.h
/\*
\* OLED.h
\*
\* Created on: 2023年7月12日
\* Author: Include everything
\*/
#ifndef HARDWARE\_OLED\_H\_
#define HARDWARE\_OLED\_H\_
void OLED\_Init(void);
void OLED\_Clear(void);
void OLED\_ShowChar(uint8\_t Line, uint8\_t Column, char Char);
void OLED\_ShowString(uint8\_t Line, uint8\_t Column, char \*String);
void OLED\_ShowNum(uint8\_t Line, uint8\_t Column, uint32\_t Number, uint8\_t Length);
void OLED\_ShowSignedNum(uint8\_t Line, uint8\_t Column, int32\_t Number, uint8\_t Length);
void OLED\_ShowHexNum(uint8\_t Line, uint8\_t Column, uint32\_t Number, uint8\_t Length);
void OLED\_ShowBinNum(uint8\_t Line, uint8\_t Column, uint32\_t Number, uint8\_t Length);
#endif /\* HARDWARE\_OLED\_H\_ \*/
OLED_Font.h
/\*
\* OLED\_Font.h
\*
\* Created on: 2023年7月12日
\* Author: Include everything
\*/
#ifndef HARDWARE\_OLED\_FONT\_H\_
#define HARDWARE\_OLED\_FONT\_H\_
/\*OLED字模库,宽8像素,高16像素\*/
const uint8\_t OLED_F8x16[][16]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,
0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,
0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,
0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,
0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,
0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,
0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,
0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//\* 10
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,
0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,
0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,
0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,
0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,
0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,
0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,
0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,
0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,
0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,
0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,
0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,
0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,
0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,
0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,
0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,
0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,
0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,
0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,
0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,
0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,
0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,
0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,
0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,
0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,
0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,
0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,
0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//\_ 63
0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,
0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,
0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,
0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,
0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,
0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,
0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,
0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,
0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,
0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,
0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,
0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,
0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,
0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,
0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};
#endif /\* HARDWARE\_OLED\_FONT\_H\_ \*/
OLED.c
/\*
\* OLED.c
\*
\* Created on: 2023年7月12日
\* Author: Include everything
\*/
#include <driverlib.h>
#include "OLED\_Font.h"
//#define I2C\_USCI\_IV UCB0IV
static uint8\_t LastByteFlag = 0;
static uint8\_t I2C_Tx_BufData = 0; // 数据缓冲字节,供中断函数使用
/\*引脚初始化\*/
void OLED\_I2C\_Init(void)
{
GPIO\_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P3, GPIO_PIN0 | GPIO_PIN1);
USCI_B_I2C_initMasterParam USCI_B_I2C_InitStructure;
USCI_B_I2C_InitStructure.dataRate = USCI_B_I2C_SET_DATA_RATE_400KBPS;
USCI_B_I2C_InitStructure.i2cClk = UCS\_getSMCLK();
USCI_B_I2C_InitStructure.selectClockSource = USCI_B_I2C_CLOCKSOURCE_SMCLK;
USCI\_B\_I2C\_initMaster(USCI_B0_BASE, &USCI_B_I2C_InitStructure);
// 设置从机地址,之后的时序中不需要再发送从机地址
USCI\_B\_I2C\_setSlaveAddress(USCI_B0_BASE, 0x78 >> 1);
USCI\_B\_I2C\_setMode(USCI_B0_BASE, USCI_B_I2C_TRANSMIT_MODE);
USCI\_B\_I2C\_enable(USCI_B0_BASE);
// 使能传送中断,用来接收从机的响应信号
USCI\_B\_I2C\_clearInterrupt(USCI_B0_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT);
USCI\_B\_I2C\_enableInterrupt(USCI_B0_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT);
}
/\*\*
\* @brief I2C发送一个字节
\* @param Byte 要发送的一个字节
\* @retval 无
\*/
void OLED\_I2C\_SendByte(uint8\_t Byte)
{
while (USCI\_B\_I2C\_isBusBusy(USCI_B0_BASE));
USCI\_B\_I2C\_masterSendSingleByte(USCI_B0_BASE, Byte);
// 等待中断响应
\_\_bis\_SR\_register(GIE + LPM0_bits);
\_\_no\_operation();
}
/\*\*
\* @brief OLED写命令
\* @param Command 要写入的命令
\* @retval 无
\*/
void OLED\_WriteCommand(uint8\_t Command)
{
while (USCI\_B\_I2C\_isBusBusy(USCI_B0_BASE));
LastByteFlag = 0;
I2C_Tx_BufData = Command;
USCI\_B\_I2C\_masterSendMultiByteStart(USCI_B0_BASE, 0x00);
// 等待中断响应
\_\_bis\_SR\_register(GIE + LPM0_bits);
\_\_no\_operation();
}
/\*\*
\* @brief OLED写数据
\* @param Data 要写入的数据
\* @retval 无
\*/
void OLED\_WriteData(uint8\_t Data)
{
while (USCI\_B\_I2C\_isBusBusy(USCI_B0_BASE));
LastByteFlag = 0;
I2C_Tx_BufData = Data;
USCI\_B\_I2C\_masterSendMultiByteStart(USCI_B0_BASE, 0x40);
// 等待中断响应
\_\_bis\_SR\_register(GIE + LPM0_bits);
\_\_no\_operation();
}
/\*\*
\* @brief OLED设置光标位置
\* @param Y 以左上角为原点,向下方向的坐标,范围:0~7
\* @param X 以左上角为原点,向右方向的坐标,范围:0~127
\* @retval 无
\*/
void OLED\_SetCursor(uint8\_t Y, uint8\_t X)
{
OLED\_WriteCommand(0xB0 | Y); //设置Y位置
OLED\_WriteCommand(0x10 | ((X & 0xF0) >> 4)); //设置X位置高4位
OLED\_WriteCommand(0x00 | (X & 0x0F)); //设置X位置低4位
}
/\*\*
\* @brief OLED清屏
\* @param 无
\* @retval 无
\*/
void OLED\_Clear(void)
{
uint8\_t i, j;
for (j = 0; j < 8; j++)
{
OLED\_SetCursor(j, 0);
for(i = 0; i < 128; i++)
{
OLED\_WriteData(0x00);
}
}
}
/\*\*
\* @brief OLED显示一个字符
\* @param Line 行位置,范围:1~4
\* @param Column 列位置,范围:1~16
\* @param Char 要显示的一个字符,范围:ASCII可见字符
\* @retval 无
\*/
void OLED\_ShowChar(uint8\_t Line, uint8\_t Column, char Char)
{
uint8\_t i;
OLED\_SetCursor((Line - 1) \* 2, (Column - 1) \* 8); //设置光标位置在上半部分
for (i = 0; i < 8; i++)
{
OLED\_WriteData(OLED_F8x16[Char - ' '][i]); //显示上半部分内容
}
OLED\_SetCursor((Line - 1) \* 2 + 1, (Column - 1) \* 8); //设置光标位置在下半部分
for (i = 0; i < 8; i++)
{
OLED\_WriteData(OLED_F8x16[Char - ' '][i + 8]); //显示下半部分内容
}
}
/\*\*
\* @brief OLED显示字符串
\* @param Line 起始行位置,范围:1~4
\* @param Column 起始列位置,范围:1~16
\* @param String 要显示的字符串,范围:ASCII可见字符
\* @retval 无
\*/
void OLED\_ShowString(uint8\_t Line, uint8\_t Column, char \*String)
{
uint8\_t i;
for (i = 0; String[i] != '\0'; i++)
{
OLED\_ShowChar(Line, Column + i, String[i]);
}
}
/\*\*
\* @brief OLED次方函数
\* @retval 返回值等于X的Y次方
\*/
uint32\_t OLED\_Pow(uint32\_t X, uint32\_t Y)
{
uint32\_t Result = 1;
while (Y--)
{
Result \*= X;
}
return Result;
}
/\*\*
\* @brief OLED显示数字(十进制,正数)
\* @param Line 起始行位置,范围:1~4
\* @param Column 起始列位置,范围:1~16
\* @param Number 要显示的数字,范围:0~4294967295
\* @param Length 要显示数字的长度,范围:1~10
\* @retval 无
\*/
void OLED\_ShowNum(uint8\_t Line, uint8\_t Column, uint32\_t Number, uint8\_t Length)
{
uint8\_t i;
for (i = 0; i < Length; i++)
{
OLED\_ShowChar(Line, Column + i, Number / OLED\_Pow(10, Length - i - 1) % 10 + '0');
}
}
/\*\*
\* @brief OLED显示数字(十进制,带符号数)
\* @param Line 起始行位置,范围:1~4
\* @param Column 起始列位置,范围:1~16
\* @param Number 要显示的数字,范围:-2147483648~2147483647
\* @param Length 要显示数字的长度,范围:1~10
\* @retval 无
\*/
void OLED\_ShowSignedNum(uint8\_t Line, uint8\_t Column, int32\_t Number, uint8\_t Length)
{
uint8\_t i;
uint32\_t Number1;
if (Number >= 0)
{
OLED\_ShowChar(Line, Column, '+');
Number1 = Number;
}
else
{
OLED\_ShowChar(Line, Column, '-');
Number1 = -Number;
}
for (i = 0; i < Length; i++)
{
OLED\_ShowChar(Line, Column + i + 1, Number1 / OLED\_Pow(10, Length - i - 1) % 10 + '0');
}
}
/\*\*
\* @brief OLED显示数字(十六进制,正数)
\* @param Line 起始行位置,范围:1~4
\* @param Column 起始列位置,范围:1~16
\* @param Number 要显示的数字,范围:0~0xFFFFFFFF
\* @param Length 要显示数字的长度,范围:1~8
\* @retval 无
\*/
void OLED\_ShowHexNum(uint8\_t Line, uint8\_t Column, uint32\_t Number, uint8\_t Length)
{
uint8\_t i, SingleNumber;
for (i = 0; i < Length; i++)
{
SingleNumber = Number / OLED\_Pow(16, Length - i - 1) % 16;
if (SingleNumber < 10)
{
OLED\_ShowChar(Line, Column + i, SingleNumber + '0');
}
else
{
OLED\_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');
}
}
}
/\*\*
\* @brief OLED显示数字(二进制,正数)
\* @param Line 起始行位置,范围:1~4
\* @param Column 起始列位置,范围:1~16
\* @param Number 要显示的数字,范围:0~1111 1111 1111 1111
\* @param Length 要显示数字的长度,范围:1~16
\* @retval 无
\*/
void OLED\_ShowBinNum(uint8\_t Line, uint8\_t Column, uint32\_t Number, uint8\_t Length)
{
uint8\_t i;
for (i = 0; i < Length; i++)
{
OLED\_ShowChar(Line, Column + i, Number / OLED\_Pow(2, Length - i - 1) % 2 + '0');
}
}
/\*\*
\* @brief OLED初始化
\* @param 无
\* @retval 无
\*/
void OLED\_Init(void)
{
uint32\_t i, j;
for (i = 0; i < 1000; i++) //上电延时
{
for (j = 0; j < 1000; j++);
}
OLED\_I2C\_Init(); //端口初始化
OLED\_WriteCommand(0xAE); //关闭显示
OLED\_WriteCommand(0xD5); //设置显示时钟分频比/振荡器频率
OLED\_WriteCommand(0x80);
OLED\_WriteCommand(0xA8); //设置多路复用率
OLED\_WriteCommand(0x3F);
OLED\_WriteCommand(0xD3); //设置显示偏移
OLED\_WriteCommand(0x00);
OLED\_WriteCommand(0x40); //设置显示开始行
OLED\_WriteCommand(0xA1); //设置左右方向,0xA1正常 0xA0左右反置
OLED\_WriteCommand(0xC8); //设置上下方向,0xC8正常 0xC0上下反置
OLED\_WriteCommand(0xDA); //设置COM引脚硬件配置
OLED\_WriteCommand(0x12);
OLED\_WriteCommand(0x81); //设置对比度控制
OLED\_WriteCommand(0xCF);
OLED\_WriteCommand(0xD9); //设置预充电周期
OLED\_WriteCommand(0xF1);
OLED\_WriteCommand(0xDB); //设置VCOMH取消选择级别
OLED\_WriteCommand(0x30);
OLED\_WriteCommand(0xA4); //设置整个显示打开/关闭
OLED\_WriteCommand(0xA6); //设置正常/倒转显示
OLED\_WriteCommand(0x8D); //设置充电泵
OLED\_WriteCommand(0x14);
OLED\_WriteCommand(0xAF); //开启显示
OLED\_Clear(); //OLED清屏
}
#pragma vector = USCI\_B0\_VECTOR;
__interrupt void USCI\_B0\_ISR(void)
{
switch (\_\_even\_in\_range(UCB0IV, 12))
{
case USCI_I2C_UCTXIFG:
if (LastByteFlag == 0)
{
USCI\_B\_I2C\_masterSendMultiByteNext(USCI_B0_BASE, I2C_Tx_BufData);
LastByteFlag = 1;
}
else if (LastByteFlag == 1)
{
USCI\_B\_I2C\_masterSendMultiByteStop(USCI_B0_BASE);
USCI\_B\_I2C\_clearInterrupt(USCI_B0_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT);
\_\_bic\_SR\_register\_on\_exit(LPM0_bits);
}
break;
default:
break;
}
}