本帖最后由 Question 于 2021-4-23 07:58 编辑
单片机型号:MSP432E401Y 板卡型号:MSP-EXP432E401Y Launchpad 按键+显示:板载按键USR_SW1,OLED128X64 (SSD1306驱动)屏幕 开发环境及版本号:CCS 10.2.0
本程序使用的屏幕分辨率是128x64,0.96英寸,SSD1306驱动芯片,SPI模式。 显示屏与开发板连接示意图如下所示,本程序使用的是软件模拟SPI通信,可以方便的更换引脚连接,引脚连接的配置在oled.h文件中。
* MSP432E401Y *------------- * PE4 |-->OLED_SCLK * PC4 |--> OLED_DAT * PC5 |-->OLED_RES * PC6 |--> OLED_DC * PE5 |--> OLED_CS * * * PJ0 |<-- USR_SW1 * * PN0 |--> LED D2 * PN1 |--> LED D1 *-------------
按键为板载的USR_SW1按键,通过按下按键更新显示内容。
完整的接线图如下所示:
显示2021 8.4
显示NUEDC Contest:
显示全国大学生电子设计竞赛培训网:
显示电赛的徽章LOGO:
显示本次用到的芯片型号和TI的LOGO:
程序说明: main.c 为程序主文件,开机上电后对系统的外设进行初始化,按下按键后依次显示内容,主程序显示一个画面后等待按键按下,其中按键采用外部中断处理,若按键按下,进入GPIOJ_IRQHandler()中断处理程序,将Trg变量置为1,以此来判断按键按下。 部分代码如下:
#include <ti/devices/msp432e4/driverlib/driverlib.h>
#include <stdint.h>
#include <stdbool.h>
#include "oled.h"
#include "bmp.h"
volatile uint32_t gpioState = 0;
uint8_t Trg = 0;
void GPIOInit(void);
void SysTick_Handler(void);
void GPIOJ_IRQHandler(void);
int main(void)
{
uint32_t systemClock;
/* 将系统时钟配置为16 MHz */
systemClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480),
16000000);
/* 初始化GPIO */
GPIOInit();
/* 启用SysTick计时器以每1/20秒生成一次中断,用于控制LED2亮灭 */
MAP_SysTickPeriodSet(systemClock / 20);
MAP_SysTickIntEnable();
MAP_SysTickEnable();
OLED_Init(); //初始化OLED
OLED_Clear();//OLED清屏
while (1)
{
OLED_Clear();
OLED_ShowString(0, 0, "2021 8.4");
while (!Trg); //等待中断触发,按键按下
Trg = 0;
OLED_ShowString(0, 2, "NUEDC Contest");
while (!Trg);
Trg = 0;
OLED_ShowCHinese(0, 4, 0); //全
OLED_ShowCHinese(18, 4, 1); //国
OLED_ShowCHinese(36, 4, 2); //大
OLED_ShowCHinese(54, 4, 3); //学
OLED_ShowCHinese(72, 4, 4); //生
OLED_ShowCHinese(90, 4, 5); //电
OLED_ShowCHinese(108, 4, 6); //子
OLED_ShowCHinese(0, 6, 7); //设
OLED_ShowCHinese(18, 6, 8); //计
OLED_ShowCHinese(36, 6, 9); //竞
OLED_ShowCHinese(54, 6, 10); //赛
OLED_ShowCHinese(72, 6, 11); //培
OLED_ShowCHinese(90, 6, 12); //训
OLED_ShowCHinese(108, 6, 13); //网
while (!Trg);
Trg = 0;
OLED_Clear();
OLED_DrawBMP(0, 0, 128, 8, BMP1); //图片显示,图片数据在bmp.h文件中
while (!Trg);
Trg = 0;
OLED_DrawBMP(0, 0, 128, 8, BMP2);
while (!Trg);
Trg = 0;
}
}
//GPIOJ中断处理,按键SW1触发
void GPIOJ_IRQHandler(void)
{
uint32_t getIntStatus;
/* 从GPIO获取中断状态并清除状态 */
getIntStatus = MAP_GPIOIntStatus(GPIO_PORTJ_BASE, true);
if ((getIntStatus & GPIO_PIN_0) == GPIO_PIN_0)
{
MAP_GPIOIntClear(GPIO_PORTJ_BASE, getIntStatus);
/* 根据引脚的当前状态置位Trg*/
if (MAP_GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_0) == GPIO_PIN_0)
Trg = 1;
}
}
//系统定时器中断处理程序,用于控制LED2指示灯 void SysTick_Handler(void) { if (gpioState != 3) { gpioState++; } else { gpioState = 0; } /* 将GPIO的新值写入端口引脚。 API将生成位带区地址,以写入特定的端口引脚*/ MAP_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0, gpioState); //LED2亮灭 }
本程序中启用SysTick计时器以每1/20秒生成一次中断,用于控制LED2亮灭,以此来指示芯片运行状态。 oled.c文件里面是SSD1306的主要驱动函数以及部分显示函数,例如显示字符串,显示128x64像素的图片等,像素图片数据需要使用取模软件获取。 oledfont.h主要为字符的字模数据,汉字需要使用取模软件获取。 bmp.h 主要为128x64像素的图片数据。
由于我是首次使用 TI 的处理器,对整个系统不是很了解,难免有不足之处,希望能和大家共同学习交流,谢谢!
|