[MSP-EXP432E401Y] MSP432E401Y独立按键+SSD1306-12864OLED屏幕显示

[复制链接]

2

主题

4

帖子

867

积分

单晶硅锭

Rank: 3Rank: 3

积分
867
楼主
查看: 6553回复: 1 发表于 2021-4-23 08:00:04   只看该作者
本帖最后由 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 的处理器,对整个系统不是很了解,难免有不足之处,希望能和大家共同学习交流,谢谢!







SSD1306_12864OLED_MSP432E401Y.zip

2.11 MB, 下载次数: 106, 下载积分: 积分 -1

73

主题

469

帖子

1007

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1007
沙发
发表于 2021-4-27 14:13:30   只看该作者
感谢分享
快速回复 返回顶部 返回列表