Microchip Curiosity PIC32MX470学习+驱动OLED12864显示屏

标签:OLEDPIC
分享到:

这次要测试的是驱动OLED12864显示屏。OLED12864模块使用的是IIC接口,SDA接RF4引脚,SCL接RF5引脚,电源为3.3V。IIC时序使用软件模拟,采用强制读写模式。

1.iic.h文件

#ifndef __IIC_H
#define __IIC_H
 
#include <stdint.h>
#include "system_config.h"
 
#define IIC_SCL(status)      if(status) \
                                   PLIB_PORTS_PinSet(PORTS_ID_0, PORT_CHANNEL_F, PORTS_BIT_POS_5);\
                             else       \
                                   PLIB_PORTS_PinClear(PORTS_ID_0, PORT_CHANNEL_F, PORTS_BIT_POS_5) 
 
#define IIC_SDA_OUT(status)  if(status) \
                                   PLIB_PORTS_PinSet(PORTS_ID_0, PORT_CHANNEL_F, PORTS_BIT_POS_4);\
                             else       \
                                   PLIB_PORTS_PinClear(PORTS_ID_0, PORT_CHANNEL_F, PORTS_BIT_POS_4)
 
#define DELAY_US             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop");\
                             asm("nop");asm("nop");asm("nop");        asm("nop")
 
void   IIC_Init(void);                        
void   IIC_Start(void);                                       
void   IIC_Stop(void);                                     
void   IIC_Send_Byte(uint8_t data);        
void   DelayMs(uint32_t msDelay );
void   DelayUs(uint32_t usDelay );
 
2.iic.c文件
#include "iic.h"
 
void IIC_Start(void)//产生启动时序
{
    IIC_SCL(0);
    DelayUs(2);
        
    IIC_SDA_OUT(1);
    DelayUs(2);
        
    IIC_SCL(1);
    DelayUs(2);
        
    IIC_SDA_OUT(0);
    DelayUs(2);
        
    IIC_SCL(0);
    DelayUs(2);
}          
 
void IIC_Stop(void)//产生停止时序
{
    IIC_SCL(0);
    DelayUs(2);
        
    IIC_SDA_OUT(0);
    DelayUs(2);
        
    IIC_SCL(1);
    DelayUs(2);
        
    IIC_SDA_OUT(1);
    DelayUs(2);                                           
}
 
3.oled.c:OLED初始化与驱动程序
 
void OLED_Write_CMD(uint8_t oled_cmd)//写命令函数
{
    IIC_Start();
    IIC_Send_Byte(0x78);//模块地址
        
    IIC_SCL(0);
    DelayUs(2);
    IIC_SCL(1);
    DelayUs(2);
    IIC_SCL(0);
    DelayUs(2);//跳过应答位
 
    IIC_Send_Byte(0x00);//写命令
    
    IIC_SCL(0);
    DelayUs(2);
    IIC_SCL(1);
    DelayUs(2);
    IIC_SCL(0);
    DelayUs(2);//跳过应答位
 
    IIC_Send_Byte(oled_cmd);//命令值
    IIC_Stop();
}
 
4.app.c:显示“1234”.
 
#include "app.h"
#include "oled.h" 
#include "iic.h"
#include "bsp.h"
 
APP_DATA appData;
 
void APP_Initialize ( void )
{
    appData.state = APP_STATE_INIT;
}
 
void APP_Tasks ( void )
{
    switch ( appData.state )
    {
        case APP_STATE_INIT:
        {
            DelayMs(100);
            OLED_Init();
            OLED_Clear();
            
            appData.state = APP_STATE_SERVICE_TASKS;
            break;
        }
        case APP_STATE_SERVICE_TASKS:
        {
            OLED_Show_Char0816((16 + 1), 0,0); //"1"
            OLED_Show_Char0816((16 + 2), 0,8); //"2"
            OLED_Show_Char0816((16 + 3), 0,16);//"3"
            OLED_Show_Char0816((16 + 4), 0,24);//"4"
            
            DelayMs(1000);
            break;
        }
    }
}
 
5.显示效果
 
103036h8g5gpgi8ik8g33t
 
 
 
 
 
 
 
继续阅读
柔性半导体新突破:传输速度已足够驱动OLED像素

  将二硫化钼作为 2D 半导体材料有一项非常优异的性能,那就是它们很容易弯曲。电子在这样的半导体中可以快速移动。

简述Microchip PIC16F87XA与PIC16F88X的五点不同之处

除了配备中文版数据手册以外,PIC16F88X系列单片机较之前的PIC16F87XA系列有了不少的改进,以PIC16F877A与PIC16F887粗略对比发现有以下几点不同

基于Microchip Curiosity PIC32MX470的温湿度计+RTOS+GUI:第一步,点灯

首先下载官方的开发工具,包括MPLAB、XC32、Harmony,但是要想在MPLAB中创建Harmony的工程,得按照help_harmony_vol_I.pdf中的说明,先在MPLAB中安装harmony的plug-in

基于Microchip Curiosity PIC32MX470的温湿度计+RTOS+GUI:第二步,Harmony

uCOS-III跑起来了,但是温湿度计和OLED还没到,打算用这段空窗期把串口调出来,顺便熟悉一下这块板卡的外设。

基于Microchip Curiosity PIC32MX470的温湿度计+RTOS+GUI:第四步,点灯

温湿度可以正常读取了,接下来就是调SPI和OLED显示,尝试将数据通过OLED屏显示出来。

©2019 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss