[PIC®/AVR®/dsPIC®产品] PIC16F18446开发板测评__OLED屏显示

[复制链接]
2905|12
 楼主| jinglixixi 发表于 2019-12-16 22:16 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2019-12-16 22:18 编辑

PIC16F18446开发板是一块外设简单的最小系统板,在熟悉GPIO口的使用方法后,可以采用模拟I2C接口的方式来驱动OLED屏进行显示,其显示效果如图1和图2所示。
图1 6*8点阵字模显示



图2  8*16点阵字模显示

在编写程序前,用MCC可对使用的引脚进行设置,见图3所示。

图3  设置OLED屏引脚

为识读的方便,可对使用的引脚加以重新命名,如PB5为SCL,PB7为SDA。


OLED屏的初始化函数为:
  1. void OLED_Init(void)
  2. {
  3.         __delay_ms(50);
  4.         OLED_WrCmd(0xae);//--turn off oled panel
  5.         OLED_WrCmd(0x00);//---set low column address
  6.         OLED_WrCmd(0x10);//---set high column address
  7.         OLED_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  8.         OLED_WrCmd(0x81);//--set contrast control register
  9.         OLED_WrCmd(Brightness); // Set SEG Output Current Brightness
  10.         OLED_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0×óÓÒ·´ÖÃ 0xa1Õý³£
  11.         OLED_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0ÉÏÏ·´Öà 0xc8Õý³£
  12.         OLED_WrCmd(0xa6);//--set normal display
  13.         OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
  14.         OLED_WrCmd(0x3f);//--1/64 duty
  15.         OLED_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  16.         OLED_WrCmd(0x00);//-not offset
  17.         OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
  18.         OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  19.         OLED_WrCmd(0xd9);//--set pre-charge period
  20.         OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  21.         OLED_WrCmd(0xda);//--set com pins hardware configuration
  22.         OLED_WrCmd(0x12);
  23.         OLED_WrCmd(0xdb);//--set vcomh
  24.         OLED_WrCmd(0x40);//Set VCOM Deselect Level
  25.         OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  26.         OLED_WrCmd(0x02);//
  27.         OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
  28.         OLED_WrCmd(0x14);//--set(0x10) disable
  29.         OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
  30.         OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
  31.         OLED_WrCmd(0xaf);//--turn on oled panel
  32.         OLED_Fill(0x00);
  33.         OLED_Set_Pos(0,0);
  34. }


相应的字符串显示函数为:
  1. void OLED_P8x16Str(unsigned char x,unsigned char y,unsigned char ch[])
  2. {
  3.         unsigned char c=0,i=0,j=0;
  4.         while (ch[j]!='\0')
  5.         {
  6.                 c =ch[j]-32;
  7.                 if(x>120){x=0;y++;}
  8.                 OLED_Set_Pos(x,y);
  9.                 for(i=0;i<8;i++)
  10.                 OLED_WrDat(F8X16[c*16+i]);
  11.                 OLED_Set_Pos(x,y+1);
  12.                 for(i=0;i<8;i++)
  13.                 OLED_WrDat(F8X16[c*16+i+8]);
  14.                 x+=8;
  15.                 j++;
  16.         }
  17. }


图示效果的主程序为:
  1. void main(void)
  2. {

  3.     SYSTEM_Initialize();
  4.     OLED_Init();
  5.     __delay_ms(20);
  6.     OLED_CLS();
  7.     OLED_P8x16Str(0,0,"PIC16F18446");
  8.     OLED_P8x16Str(0,2,"OLED Display");
  9.     OLED_P8x16Str(0,4,"jinglixixi");
  10.     OLED_P8x16Str(0,6,"2019.12.16");
  11.    
  12.     while (1)
  13.     {
  14.       led0_Toggle();        // LED ON
  15.       __delay_ms(200);   // 1 Second Delay
  16.     }
  17.    
  18. }





图4  程序界面

经编译处理,将生成的HEX文件复制到虚拟U盘即可见到显示效果。  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
小明的同学 发表于 2019-12-17 21:37 | 显示全部楼层
牛,这是个很好的模拟串口的教程啊。
 楼主| jinglixixi 发表于 2019-12-18 07:43 | 显示全部楼层
小明的同学 发表于 2019-12-17 21:37
牛,这是个很好的模拟串口的教程啊。

感谢支持!
渔夫的烟斗 发表于 2019-12-20 19:41 | 显示全部楼层
这个应该不是模拟口吧?是不是这是还没有配置前的图片?另外 i2c实现的代码是要用户自己再写还是MCC中有带?
wangdanq 发表于 2019-12-20 21:19 | 显示全部楼层
谢谢分享   我正在学习 mplabx ide xc8  网上程序例子  经过编程  出现一些错误  不知 是 软件安装 不对,  还是设置  不对,能否看一下 你的完整程序  非常感谢!
 楼主| jinglixixi 发表于 2019-12-21 08:52 | 显示全部楼层
wangdanq 发表于 2019-12-20 21:19
谢谢分享   我正在学习 mplabx ide xc8  网上程序例子  经过编程  出现一些错误  不知 是 软件安装 不对,  ...

你测试一下这个工程,以便分析出问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| jinglixixi 发表于 2019-12-21 08:57 | 显示全部楼层
渔夫的烟斗 发表于 2019-12-20 19:41
这个应该不是模拟口吧?是不是这是还没有配置前的图片?另外 i2c实现的代码是要用户自己再写还是MCC中有带 ...

见图3将PB5设为SCL,PB7设为SDA,以I/O口模拟的i2c,其实现的代码是用户自己编写的,用MCC没法给出!
dongnanxibei 发表于 2019-12-21 10:25 | 显示全部楼层
多谢楼主分享的工程,学习一下GPIO模拟
21mengnan 发表于 2019-12-26 15:23 | 显示全部楼层
非常优秀,学习一下。
 楼主| jinglixixi 发表于 2019-12-30 11:15 | 显示全部楼层
21mengnan 发表于 2019-12-26 15:23
非常优秀,学习一下。

感谢支持!
hhhahhh 发表于 2021-6-15 15:57 | 显示全部楼层
你好,现在我正在做一个pic32驱动OLED的实验,能否参考一下您的代码呢?之前的那个zip文件格式损坏了
 楼主| jinglixixi 发表于 2021-6-16 07:42 | 显示全部楼层
hhhahhh 发表于 2021-6-15 15:57
你好,现在我正在做一个pic32驱动OLED的实验,能否参考一下您的代码呢?之前的那个zip文件格式损坏了 ...

参考这个吧
【CuriosityNano测评报告】+I2C接口的OLED屏显示
https://bbs.21ic.com/icview-3138266-1-1.html
dql2015 发表于 2021-6-16 13:09 | 显示全部楼层
非常优秀,学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部