用Microchip Curiosity PIC32MX470驱动OLED12864显示屏

分享到:

这次要测试的是驱动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新型汽车级 MEMS 振荡器问世 —— 有效改善恶劣环境下的可靠性及性能

随着技术不断进步以及现代汽车中复杂电子系统应用的日益增加,市场对相关器件定时性能和可靠性的卓越性要求越来越高。在当今高度先进的汽车系统中,时序的精确度、准确性以及对恶劣环境的耐受能力对于能否确保精确操作至关重要。为此,全球领先的整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商——Microchip Technology Inc.(美国微芯科技公司)发布了全新的DSA系列汽车级MEMS(微机电系统)振荡器产品

Microchip首席运营官专访:展望2018!半导体行业的机遇与挑战

随着全球电子产品市场的蓬勃发展,在过去的一年里,Microchip与各位一起经历了半导体领域大幅、持续的增长。与此同时,半导体行业的格局也已发生了显著转变。那么,2018年行业内有哪些机遇和挑战呢?

Microchip Curiosity PIC32MZEF学习教程之:使用Harmony的动态驱动和状态机编写程序

上一篇中介绍了UART的收发数据操作,那些操作都是基于外设库的,而不是采用Harmony的动态驱动,也没有采用状态机的机制。本篇就来介绍一下如何使用Harmony的动态驱动和状态机来编写程序。其实状态机是挺简单的,就是事先定义好可能发生的哪些状态,然后主循环里根据不同的状态进行不同的处理,这个在项目中也是比较常用的方法。

Microchip Curiosity PIC32MZEF学习教程之:定时器测试

前面说过TC1使用的是外部32K的时钟源,因为这个晶振没有焊接,无法测试,所以我们这里选择的测试时钟为TC2。

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