本帖最后由 gaoyang9992006 于 2021-8-15 16:35 编辑
接下来我们实现点亮IIC接口的OLED
该OLED是128×32分辨率
接口顺序是GND,VCC,SCL,SDA
我们可以使用开发板上的右上角四个接口:RC2,RA2,RC3,GND
我们让接口按照以下规则对应
OLED--------------CNANO
GND --------------GND
VCC ---------------RC3
SCL ---------------RA2
SDA ---------------RC2
直接可以将OLED插入开发板上的接口,如下图所示
接下来我们配置RC3,让其输出高电平为OLED提供电能,这里配置为输出模式,并使能上拉电阻。
RC2和RA2设置为开漏输出,并使能上拉电阻。
并给对应的函数起名,以方便识别是SCL还是SDA,或者是VCC接口。
修改OLED的头文件,以完成oled.h的内部调用IO高低操作的函数映射。
//-----------------OLED端口定义----------------
#define OLED_SCL_Clr() IO_SCL_SetLow()
#define OLED_SCL_Set() IO_SCL_SetHigh()
#define OLED_SDA_Clr() IO_SDA_SetLow()
#define OLED_SDA_Set() IO_SDA_SetHigh()
最后我们的main.c就是
//#include "mcc_generated_files/mcc.h"
#include "OLED/oled.h"
void get_button(int *i)
{
if(IO_BUTTON_GetValue()==0)
{
__delay_ms(5);
if(IO_BUTTON_GetValue()==0)
{
while(IO_BUTTON_GetValue()==0);
(*i)--;
if(*i<=0) *i=10;
printf("i=%d T=%.2f s \n",*i,(float)*i/5);
}
}
}
void main(void)
{
int t=10;
int i=0;
int val=0;
SYSTEM_Initialize();
IO_BUTTON_SetPullup();
IO_VCC_SetHigh();
IO_VCC_SetPullup();
IO_SCL_SetOpenDrain();
IO_SDA_SetOpenDrain();
IO_SCL_SetPullup();
IO_SDA_SetPullup();
OLED_Init();//初始化OLED
__delay_ms(5);
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
for(i=0;i<8;i++)
OLED_ShowChinese(i*16,0,i,16);
OLED_ShowString(0,2,"PIC18F16Q41",16);
printf("Hello world!\n");
while (1)
{
IO_LED_Toggle() ;
get_button(&t);
for(i=0;i<t;i++)
__delay_ms(50);
val=IO_BUTTON_GetValue();
printf("val=%d\n",val);
OLED_ShowNum(8*14,2,t,2,16);
}
}
编译烧录,就是上图那个状态了,通过按键可以调整最后的数字用于调试闪烁周期对应的变量。
这里提供完成的工程以供大家测试。
001-02.zip
(47.39 KB)
奉上视频:从启动软件,图形化配置,代码编写,烧录运行效果。
https://www.bilibili.com/video/BV1RP4y1W7jW/
|