打印
[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】OLED屏显示驱动的实现

[复制链接]
2477|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2022-7-14 14:27 编辑

在驱动OLED屏之前,为了掌握GPIO口的使用,以LEDKEY进行了测试验证。
测试GPIO口用法具体的步骤如下:
1)打开MPLAB X IDE v6.00,然后创建一个新项目工程。
2)按图1所示选取工程类型,并点击“Next”。
1  选取工程类型
3)按图2所示选取芯片型号及调试工具,并点击“Next”。
2  选取芯片型号及调试工具
4)按图3所示选取编译器,并点击“Next”。
3  选取编译器
5)按图4所示指定项目名称及存放路径,然后点击“Finish”完成项目工程的创建。
4  完成项目创建
6)打开MCC,然后按图5所示来配置引脚,并按图6所示来为配置引脚命名。
5  引脚配置
6  引脚命名
7)按“Generate”按键,以生成程序框架。

8)选取主程序,并按如下内容加以修改。
#include "mcc_generated_files/system/system.h"
/*
    Main application
*/

int main(void)
{
    SYSTEM_Initialize();
    while(1)
    {
        LED0_Toggle();
        LED1_Toggle();
        __delay_ms(500);
    }
}

9)对程序加以编译和下载,则外部的LED模块被点亮,见图7所示。
这样,就完成了对GPIO口的输出功能测试。
7  测试效果
10)使用MCC按图8来配置引脚,并按图9对引脚加以命名。
8  引脚配置
9  引脚命名
11)对主程序按如下内容加以修改
int main(void)
{
    KEY_SetDigitalInput();
    while(1)
    {
        if(KEY_GetValue()==0)
        LED0_SetHigh();
        else
        LED0_SetLow();
        __delay_ms(500);
    }
}

12)对程序加以编译和下载,则使用外部的按键模块就可控制板载的LED0灯灭,见图10所示。
10  测试效果
至此,就完成了对GPIO口的输入功能测试。

掌握了GPIO口的使用,再驱动OLED屏的显示就方便许多。
驱动OLED屏的具体步骤如下:

1)使用MCC按图11来配置引脚,并按图12对引脚加以命名。
11 配置引脚
12引脚命名
2)使用MCC按图11来配置引脚,并按图12对引脚加以命名。
3)添加定义语句
#define OLED_SCLK_Set()  SCL_SetHigh()
#define OLED_SCLK_Clr()  SCL_SetLow()
#define OLED_SDIN_Set()  SDA_SetHigh()
#define OLED_SDIN_Clr()  SDA_SetLow()
4)添加字库头文件
#include "oledfont.h"
5)添加相应的功能函数
OLED屏初始化函数:
void OLED_Init(void)
{
    OLED_SCLK_Set();
    OLED_SDIN_Set();
    __delay_ms(800);
    OLED_WR_Byte(0xAE,OLED_CMD);
    OLED_WR_Byte(0x02,OLED_CMD);
    OLED_WR_Byte(0x10,OLED_CMD);
    OLED_WR_Byte(0x40,OLED_CMD);
    OLED_WR_Byte(0x81,OLED_CMD);
    OLED_WR_Byte(0xff,OLED_CMD);
    OLED_WR_Byte(0xA1,OLED_CMD);
    OLED_WR_Byte(0xC8,OLED_CMD);
    OLED_WR_Byte(0xA6,OLED_CMD);
    OLED_WR_Byte(0xA8,OLED_CMD);
    OLED_WR_Byte(0x3f,OLED_CMD);
    OLED_WR_Byte(0xD3,OLED_CMD);
    OLED_WR_Byte(0x00,OLED_CMD);
    OLED_WR_Byte(0xd5,OLED_CMD);
    OLED_WR_Byte(0x80,OLED_CMD);
    OLED_WR_Byte(0xD9,OLED_CMD);
    OLED_WR_Byte(0xF1,OLED_CMD);
    OLED_WR_Byte(0xDA,OLED_CMD);
    OLED_WR_Byte(0x12,OLED_CMD);
    OLED_WR_Byte(0xDB,OLED_CMD);
    OLED_WR_Byte(0x40,OLED_CMD);
    OLED_WR_Byte(0x20,OLED_CMD);
    OLED_WR_Byte(0x02,OLED_CMD);
    OLED_WR_Byte(0x8D,OLED_CMD);
    OLED_WR_Byte(0x14,OLED_CMD);
    OLED_WR_Byte(0xA4,OLED_CMD);
    OLED_WR_Byte(0xA6,OLED_CMD);
    OLED_WR_Byte(0xAF,OLED_CMD);
    OLED_WR_Byte(0xAF,OLED_CMD);
}

OLED清屏函数:
void OLED_Clear(void)
{
         uint8_t i,n;
         for(i=0;i<8;i++)
         {
                   OLED_WR_Byte(0xb0+i,OLED_CMD);
                   OLED_WR_Byte(0x00,OLED_CMD);
                   OLED_WR_Byte(0x10,OLED_CMD);
                   for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
         }
}

OLED屏字符串显示函数:
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color)
{
    while(*p!='\0')
   {
        if(x>LCD_W-16)
        {
            x=0;
            y+=16;
        }
        if(y>LCD_H-16)
       {
           y=x=0;
           LCD_Clear(RED);
       }
       LCD_ShowChar(x,y,*p,0,color);
       x+=8;
       p++;
    }
}

6)对主程序按如下内容加以修改
int main(void)
{
    SYSTEM_Initialize();
    LED_SetHigh();
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(0,0,"PIC18F57Q43 TEST",16);
    OLED_ShowString(0,2,"OLED Display",16);
    while(1)
    {
        LED0_Toggle();
        __delay_ms(500);
    }
}

7)对程序加以编译和下载,则OLED屏的显示效果如图13所示。
13 显示效果

值得指出的是:在开发板与OLED屏连接的情况下,若进行程序下载会导致下载设备。为此,将OLED屏的VCC电源引脚接到PA4上来供电,这样就既能点亮OLED屏,又不影响程序下载了。

使用特权

评论回复
沙发
huquanz711| | 2022-7-15 07:59 | 只看该作者
这个板子果然小巧精致啊

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2022-7-15 13:32 | 只看该作者
huquanz711 发表于 2022-7-15 07:59
这个板子果然小巧精致啊

哈哈,是啊!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

463

主题

2774

帖子

38

粉丝