本帖最后由 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);
- }
- }
编译烧录,就是上图那个状态了,通过按键可以调整最后的数字用于调试闪烁周期对应的变量。
这里提供完成的工程以供大家测试。
奉上视频:从启动软件,图形化配置,代码编写,烧录运行效果。
https://www.bilibili.com/video/BV1RP4y1W7jW/
|