首页 > 其他分享 >使用PIC单片机驱动OLED模块(软件模拟IIC模式)

使用PIC单片机驱动OLED模块(软件模拟IIC模式)

时间:2024-10-22 14:45:45浏览次数:8  
标签:SCL do PIC MI2C 单片机 OLED SDA IIC define

@使用PIC单片机驱动OLED模块(软件模拟IIC模式)

使用PIC单片机驱动OLED模块(软件模拟IIC模式)

最近学习Microchhip的PIC18系列单片机,使用该款单片机进行一些外设的开发。发现网上的资料很少,故开了此个博客,对自己的学习过程进行一些记录,希望未来国内Microchip的社区能有更多的资源。

单片机型号

本次实验使用的单片机型号为PIC18F56Q71,Microchip公司提供了很多的开发板,但是没有进行过多的宣传,不像STM8或者51单片机那样热门。但是并不妨碍PIC单片机是一款非常好的单片机,在很多极端环境下都能正常的使用比如石油化工等方面。
Microchip公司官方提供的PIC18F56Q71好奇板开发板

OLED模块

OLED模块使用的是最常见的4引脚IIC驱动的OLED模块,淘宝价格大概十来块钱。对于STM系列和51单片机来说,各种资源随处可见,但是并没有适用于PIC单片机的资源。本文将对STM32F108C8T6的OLED驱动代码进行移植,使得PIC单片机能正常使用OLED模块。
OLED模块

开发环境

使用MPLAB X IDE进行开发,IDE版本为v6.20。代码生成器MCC版本为v5.5.1。这里注意:使用MCC版本为MCC Melody而不是MCC Classic。

实验开始

在做好各个前序工作后,就可以使用PIC单片机对OLED模块进行开发实验啦!
第一步打开XIDE,新建工程。
在这里插入图片描述
选择MCU型号以及下载器型号:
在这里插入图片描述
选择编译器:
在这里插入图片描述
两种方式打开MCC:
方式一:
在这里插入图片描述
方式二(tools->Embedded->MCC):
在这里插入图片描述
双击System中的Pins,就会得到两个窗口,这里选择RD4管脚以及RD5关键作为模拟IIC通信的SCL以及SDA管脚。
在这里插入图片描述
在Pins Grid View中单击勾选PORTD4与PORTD5两个管脚,选择output方式。(可根据自己的需要进行勾选)
在这里插入图片描述
在Pins窗口中勾选篇配置PORTD4与PORTD5两个管脚属性。可以在Custom Name中将管脚默认名字重命名为自己想要的名字。(这里将在生成的代码中使用自定义的名字)
在这里插入图片描述
完成后点击Generate,然后编译工程,就可以看到MCC已经为我们成功生成代码了。
在这里插入图片描述
生成的主要代码如下(主要是定义了IO管脚的一些功能性函数,可直接调用):

// get/set RD4 aliases
#define MI2C_SCL_TRIS                 TRISDbits.TRISD4
#define MI2C_SCL_LAT                  LATDbits.LATD4
#define MI2C_SCL_PORT                 PORTDbits.RD4
#define MI2C_SCL_WPU                  WPUDbits.WPUD4
#define MI2C_SCL_OD                   ODCONDbits.ODCD4
#define MI2C_SCL_ANS                  ANSELDbits.ANSELD4
#define MI2C_SCL_SetHigh()            do { LATDbits.LATD4 = 1; } while(0)
#define MI2C_SCL_SetLow()             do { LATDbits.LATD4 = 0; } while(0)
#define MI2C_SCL_Toggle()             do { LATDbits.LATD4 = ~LATDbits.LATD4; } while(0)
#define MI2C_SCL_GetValue()           PORTDbits.RD4
#define MI2C_SCL_SetDigitalInput()    do { TRISDbits.TRISD4 = 1; } while(0)
#define MI2C_SCL_SetDigitalOutput()   do { TRISDbits.TRISD4 = 0; } while(0)
#define MI2C_SCL_SetPullup()          do { WPUDbits.WPUD4 = 1; } while(0)
#define MI2C_SCL_ResetPullup()        do { WPUDbits.WPUD4 = 0; } while(0)
#define MI2C_SCL_SetPushPull()        do { ODCONDbits.ODCD4 = 0; } while(0)
#define MI2C_SCL_SetOpenDrain()       do { ODCONDbits.ODCD4 = 1; } while(0)
#define MI2C_SCL_SetAnalogMode()      do { ANSELDbits.ANSELD4 = 1; } while(0)
#define MI2C_SCL_SetDigitalMode()     do { ANSELDbits.ANSELD4 = 0; } while(0)

// get/set RD5 aliases
#define MI2C_SDA_TRIS                 TRISDbits.TRISD5
#define MI2C_SDA_LAT                  LATDbits.LATD5
#define MI2C_SDA_PORT                 PORTDbits.RD5
#define MI2C_SDA_WPU                  WPUDbits.WPUD5
#define MI2C_SDA_OD                   ODCONDbits.ODCD5
#define MI2C_SDA_ANS                  ANSELDbits.ANSELD5
#define MI2C_SDA_SetHigh()            do { LATDbits.LATD5 = 1; } while(0)
#define MI2C_SDA_SetLow()             do { LATDbits.LATD5 = 0; } while(0)
#define MI2C_SDA_Toggle()             do { LATDbits.LATD5 = ~LATDbits.LATD5; } while(0)
#define MI2C_SDA_GetValue()           PORTDbits.RD5
#define MI2C_SDA_SetDigitalInput()    do { TRISDbits.TRISD5 = 1; } while(0)
#define MI2C_SDA_SetDigitalOutput()   do { TRISDbits.TRISD5 = 0; } while(0)
#define MI2C_SDA_SetPullup()          do { WPUDbits.WPUD5 = 1; } while(0)
#define MI2C_SDA_ResetPullup()        do { WPUDbits.WPUD5 = 0; } while(0)
#define MI2C_SDA_SetPushPull()        do { ODCONDbits.ODCD5 = 0; } while(0)
#define MI2C_SDA_SetOpenDrain()       do { ODCONDbits.ODCD5 = 1; } while(0)
#define MI2C_SDA_SetAnalogMode()      do { ANSELDbits.ANSELD5 = 1; } while(0)
#define MI2C_SDA_SetDigitalMode()     do { ANSELDbits.ANSELD5 = 0; } while(0)

完成后将OLED模块附带的STM32F103的几个头文件以及源文件添加到OLED文件夹中:
在这里插入图片描述
将oled.h中的代码

//-----------------OLED IIC端口定义----------------  					   

#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_5)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(GPIOA,GPIO_Pin_5)

#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_7)//SDA
#define OLED_SDIN_Set() GPIO_SetBits(GPIOA,GPIO_Pin_7)

替换为:

#define OLED_SCLK_Clr() MI2C_SCL_SetLow()//SCL
#define OLED_SCLK_Set() MI2C_SCL_SetHigh()

#define OLED_SDIN_Clr() MI2C_SDA_SetLow()//SDA
#define OLED_SDIN_Set() MI2C_SDA_SetHigh()

然后就可以像STM32单片机一样使用该OLED模块了,调用oled.c文件中的相关函数即可。经过测试,会出现无法使用的问题,需要在几个函数中增加一个1us的延时即可使用(注意:延时函数需要使用调用system.h文件才能正常使用,不然会报错):

void IIC_Start()
{

	OLED_SCLK_Set();
	OLED_SDIN_Set();
    __delay_us(1);
	OLED_SDIN_Clr();
	OLED_SCLK_Clr();
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
OLED_SCLK_Set() ;

	OLED_SDIN_Clr();
	OLED_SDIN_Set();
	
}

void IIC_Wait_Ack()
{
	OLED_SCLK_Set();
    __delay_us(1);
	OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/

void Write_IIC_Byte(unsigned char IIC_Byte)
{
	unsigned char i;
	unsigned char m,da;
	da=IIC_Byte;
	OLED_SCLK_Clr();
	for(i=0;i<8;i++)		
	{
			m=da;
		//	OLED_SCLK_Clr();
		m=m&0x80;
		if(m==0x80)
		{OLED_SDIN_Set();}
		else OLED_SDIN_Clr();
			da=da<<1;
		OLED_SCLK_Set();
        __delay_us(1);
		OLED_SCLK_Clr();
		}

运行结束后OLED模块即可显示用户需要的图文信息。
在这里插入图片描述

标签:SCL,do,PIC,MI2C,单片机,OLED,SDA,IIC,define
From: https://blog.csdn.net/qq_34436979/article/details/143021173

相关文章

  • ActiveMQ消息模式Queue和Topic机制讲解
    Docker安装ActiveMQ镜像以及通过Java生产消费activemq示例_dockeractivemq-CSDN博客背景周末由于服务器异常宕机,导致业务系统重启后出现ActiveMQ中的数据没有被正常消费,运维认为是消息积压,便联系博主排查。最终发现并不存在消息积压,是因为采用ActiveMQTopic模式生产消费......
  • 基于32位单片机的裸机开发:使用定时器进行任务调度 V2.0
     在嵌入式系统开发中,合理地管理和调度任务对于提高系统的实时性、可靠性和可维护性非常重要。本文将详细介绍一个基于定时器的任务管理系统的设计与实现,该系统无需使用系统滴答定时器(SysTick)来增加堆栈深度,而是采用基本的定时器来实现任务的分时执行。V2.0对比V1.0优点V2.0......
  • 单片机嵌入式的上位机编程用哪种语言比较好
    单片机嵌入式的上位机编程主要有几种主流编程语言选择:一、C/C++语言;二、Python语言;三、Java语言;四、C#语言。这些语言各自具有不同的优势和特点。例如,C/C++语言具有高效、灵活、对硬件控制能力强等优势,广泛应用于实时系统和高性能要求的场景。下文将对这些编程语言的特性、优劣势......
  • 【可答疑】基于51单片机的智能小区安防系统(含仿真、代码、报告、演示视频等)
     ✨哈喽大家好,这里是@每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~......
  • 基于单片机GPS跌倒和心电老人防护监测仪系统
    **文章目录前言概要设计思路软件设计效果图程序文章目录前言......
  • 基于单片机的人体感应智能台灯系统
    **文章目录前言概要功能设计设计思路软件设计效果图程序文章目录前言......
  • Python pickle
    Pythonpicklepickle在python中实现对象结构的序列化和反序列化python序列化(Pickling)是一个将python对象层次结构转换为可以本地储存或者网络传输的字节流的过程python反序列化(unpickling)是将字节流还原为对象层次结构数据序列化:就是把不能直接储存的数据储存到......
  • IIC通讯协议笔记
    iic通讯协议片上外设iic主发送器主发送器通讯过程发送开始位后等待EVT5,发送从机(slave)地址等待EVT6和发送要写入从机的寄存器等待EVT8,发送数据等待EVT8_2片上外设主接收器发送过程接收过程......
  • 项目-STM32F765VIT6+W5500 使用单片机串口发送命令实现OTA远程升级单片机程序测试说明
       测试1,单片机通过SPI1和模块通信; 单片机PA8引脚作为复位模组使用;串口1做日志打印(115200); 2,打开例程 3,使用下载器先下载BootLoader,然后再下载用户程序   4,在网站的根目录建几个文件夹  目录要和mcu_project程序里面的目录一致 ......
  • 【学术论文投稿】单片机原理与应用详解:从入门到进阶
     【会后3-4个月检索|IEEE出版】第五届人工智能与计算机工程国际学术会议(ICAICE2024)_艾思科蓝_学术一站式服务平台更多学术会议论文投稿链接:https://ais.cn/u/nuyAF3目录引言一、单片机概述二、单片机原理三、单片机开发环境四、单片机应用实例五、单片机进阶应用......