找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15825|回复: 20
打印 上一主题 下一主题
收起左侧

51单片机驱动OLED源代码

  [复制链接]
跳转到指定楼层
楼主
OLED源代码,需要做显示朋友可能有用.


51单片机源程序如下:
  1. #include <reg52.h>
  2. #include "function.h"
  3. #include "word_lib.h"

  4. #define X_WIDTH 128        //显示屏每行的显示点数
  5. #define Y_WIDTH 64         //显示屏每列的显示点数

  6. /*************************************************************************************
  7.           以下为设置控制OLED的端口,D0、D1、RST、DC依次对应OLED的CK、DI、RST、DC
  8. **************************************************************************************/
  9. sbit  OLED_D0 = P1^0;  
  10. sbit  OLED_D1 = P1^1;
  11. sbit  OLED_RST= P1^2;
  12. sbit  OLED_DC = P1^3;

  13. /*************************************************************************************
  14.           函数名称:  void OLED_WrCmd(unsigned char cmd)
  15.           函数功能: OLED显示屏下指令操作
  16.           调用函数:  无       
  17.           入口参数:  cmd
  18.           出口参数:  无
  19.           返回值:    无
  20.           其他:      可以不理解,直接拿过来用
  21. **************************************************************************************/
  22. void OLED_WrCmd(unsigned char cmd)
  23. {
  24.     unsigned char i=8;
  25.     OLED_DC=0;;;;
  26.     OLED_D0=0;;;;
  27.     while(i--)
  28.     {
  29.         if(cmd&0x80)
  30.         {
  31.             OLED_D1=1;
  32.         }       
  33.         else
  34.         {
  35.             OLED_D1=0;;;;
  36.         }                                 
  37.             OLED_D0=1;;;;                                                          
  38.         ;;;;;;

  39.         OLED_D0=0;;   
  40.         cmd<<=1;;   
  41.     }        
  42.        
  43. }

  44. /**************************************************************************************
  45.     函数名称:  void OLED_Fill(unsigned char bmp_dat)
  46.     函数功能: 让OLED清屏或者全屏亮,取决于参数
  47.     调用函数:  OLED_WrCmd(0xb0+y); OLED_WrDat(bmp_dat);
  48.     入口参数:  bmp_dat//一般为0x00或者0xff
  49.     出口参数:  无
  50.     返回值:    无
  51.     其他:      可用此函数进行清屏操作,如OLED_Fill(0),可以清除所有的显示
  52. ***************************************************************************************/
  53. void OLED_Fill(unsigned char bmp_dat)
  54. {
  55.     unsigned char y,x;
  56.     for(y=0;y<8;y++)
  57.     {
  58.         OLED_WrCmd(0xb0+y);
  59.         OLED_WrCmd(0x01);
  60.         OLED_WrCmd(0x10);
  61.         for(x=0;x<X_WIDTH;x++)
  62.         OLED_WrDat(bmp_dat);
  63.     }
  64. }

  65. /******************************************************************************************************
  66.           函数名称:  void OLED_Init(void)   
  67.           函数功能: OLED显示屏初始化
  68.           调用函数:  OLED_WrCmd(unsigned char cmd),写命令CD_Fill(0x00);  //初始清屏  OLED_Set_Pos(0,0);写地址        
  69.           入口参数:  无
  70.           出口参数:  无
  71.           返回值:    无
  72.           其他:      可以不理解,直接拿过来用
  73. *******************************************************************************************************/
  74. void OLED_Init(void)        
  75. {  
  76.     OLED_D0=1;
  77.     //OLED_CS=1;        //预制SLK和SS为高电平         
  78.     OLED_RST=0;
  79.     ;;;;;;;
  80.     OLED_RST=1;
  81.    
  82.     //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕   

  83.     OLED_WrCmd(0xae);//--turn off oled panel
  84.     OLED_WrCmd(0x00);//---set low column address
  85.     OLED_WrCmd(0x10);//---set high column address
  86.     OLED_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  87.     OLED_WrCmd(0x81);//--set contrast control register
  88.     OLED_WrCmd(0xcf); // Set SEG Output Current Brightness
  89.     OLED_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  90.     OLED_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  91.     OLED_WrCmd(0xa6);//--set normal display
  92.     OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
  93.     OLED_WrCmd(0x3f);//--1/64 duty
  94.     OLED_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  95.     OLED_WrCmd(0x00);//-not offset
  96.     OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
  97.     OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  98.     OLED_WrCmd(0xd9);//--set pre-charge period
  99.     OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  100.     OLED_WrCmd(0xda);//--set com pins hardware configuration
  101.     OLED_WrCmd(0x12);
  102.     OLED_WrCmd(0xdb);//--set vcomh
  103.     OLED_WrCmd(0x40);//Set VCOM Deselect Level
  104.     OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  105.     OLED_WrCmd(0x02);//
  106.     OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
  107.     OLED_WrCmd(0x14);//--set(0x10) disable
  108.     OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
  109.     OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
  110.     OLED_WrCmd(0xaf);//--turn on oled panel   
  111.     OLED_Fill(0x00);  //初始清屏
  112.     OLED_Set_Pos(0,0);        
  113. }

  114. /**********************************************************************************
  115.           函数名称:  void OLED_WrDat(unsigned char dat)
  116.           函数功能: 写下点,每次写8个,从上到下竖着写,亮是1,灭是0
  117.           调用函数:  无
  118.           入口参数:  dat//一般为0x**,8位,即8个点,亮或灭
  119.           出口参数:  无
  120.           返回值:    无
  121.           其他:      
  122. **********************************************************************************/
  123. void OLED_WrDat(unsigned char dat)
  124. {
  125.     unsigned char i=8;
  126.     OLED_DC=1;;;;         
  127.     OLED_D0=0;;;;          
  128.     ;;;;   
  129.     while(i--)
  130.     {
  131.         if(dat&0x80)
  132.         {
  133.             OLED_D1=1;
  134.         } //1.1
  135.         else
  136.         {
  137.             OLED_D1=0;
  138.         }
  139.         OLED_D0=1;
  140.         ;;;;;;
  141.         //;;            
  142.         OLED_D0=0;;;;   
  143.         dat<<=1;   
  144.     }
  145. }

  146. /************************************************************************************
  147.           函数名称:  void OLED_Set_Pos(unsigned char x, unsigned char y)
  148.           函数功能: 确定点亮显示屏的起始位置
  149.           调用函数:  OLED_WrCmd
  150.           入口参数:  x、y分别为起始位置的横纵坐标
  151.           出口参数:  无
  152.           返回值:    无
  153.           其他:      
  154. *************************************************************************************/
  155. void OLED_Set_Pos(unsigned char x, unsigned char y)
  156. {
  157.     OLED_WrCmd(0xb0+y);
  158.     OLED_WrCmd(((x&0xf0)>>4)|0x10);
  159.     OLED_WrCmd((x&0x0f)|0x01);
  160. }

  161. /***********************************************************************************
  162.     函数名称: void Show_En_small(unsigned charx,unsigned char y,unsigned char En[])
  163.     函数功能: 写数字或字母,但建议用此函数写字母或冒号等符号,调用例子见main函数,
  164.                    后面有专门写数字的函数。
  165.     调用函数: OLED_WrDat ();     OLED_Set_Pos();
  166.     入口参数: x、y确定横纵坐标,En[]确定显示内容
  167.     出口参数: 无
  168.     返回值:   无
  169.     其他:
  170. *************************************************************************************/

  171. void Show_En_small (unsigned char x,unsigned char y,unsigned char En[])
  172. {
  173.     unsigned char e=0,i=0,j=0;
  174.    
  175.     while (En[j] != '\0')
  176.     {
  177.         e = En[j] - 32;
  178.         if(x>120)
  179.             {x=0;y++;}
  180.         OLED_Set_Pos(x,y);
  181.         for (i=0; i<6; i++)
  182.                 {
  183.             OLED_WrDat(EnSmallWord[e*6+i]);
  184.         }
  185.                 x+=6;
  186.         j++;
  187.     }
  188. }
  189. ……………………

  190. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
OLED_base.rar (34.23 KB, 下载次数: 457)



评分

参与人数 1黑币 +30 收起 理由
sad520ljh + 30 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:224299 发表于 2017-8-3 10:37 | 只看该作者
学习
回复

使用道具 举报

板凳
ID:368227 发表于 2018-7-17 15:17 | 只看该作者
可以直接按照定义的引脚插到单片机上吗?用5V的还是3.3V的。
回复

使用道具 举报

地板
ID:428235 发表于 2018-11-20 17:59 | 只看该作者
大佬好厉害,非常有用
回复

使用道具 举报

5#
ID:371527 发表于 2018-12-27 18:20 | 只看该作者
void OLED_Set_Pos(unsigned char x, unsigned char y)中的OLED_WrCmd((x&0x0f)|0x01);只能找到奇数列,改为OLED_WrCmd((x&0x0f));
回复

使用道具 举报

6#
ID:371250 发表于 2019-7-10 09:28 | 只看该作者
请问SSD1306如何实现在128单片机上画点
网上32的程序不可以直接拿过来用,因为32 的方法是创建一个【128】【8】的数组,对于128单片机来说这个字节太大了
回复

使用道具 举报

7#
ID:334202 发表于 2019-8-15 09:14 | 只看该作者
什么协议的啊
回复

使用道具 举报

8#
ID:604085 发表于 2019-8-26 23:50 | 只看该作者

谢谢分享
回复

使用道具 举报

9#
ID:601357 发表于 2019-8-31 20:08 | 只看该作者
谢谢 大佬分享   
回复

使用道具 举报

10#
ID:588724 发表于 2019-9-1 00:01 | 只看该作者
软件包一个个写起来,51生态哪天就可以比得上32了,不过51跑oled还是有些吃力,个人认为中等偏大项目最好不要用oled显示,因为stc的片子很容易会卡。
回复

使用道具 举报

11#
ID:64765 发表于 2019-9-30 10:44 | 只看该作者
学习了,谢谢分享。望多介绍一些OLED的资料与程序,切切!
回复

使用道具 举报

12#
ID:475993 发表于 2019-12-30 17:20 | 只看该作者
谢谢,正在找。之前一直都是用stm32使用oled的,碰巧要用c51使用oled。以为改改接口就可以了,没想到一堆要改的。学习一下
回复

使用道具 举报

13#
ID:630615 发表于 2020-3-5 22:40 | 只看该作者
十分感谢,代码直接就能用
回复

使用道具 举报

14#
ID:595218 发表于 2020-3-6 22:25 | 只看该作者
非常感谢,我也在我的stc89c52rc上使用成功
回复

使用道具 举报

15#
ID:505400 发表于 2020-3-7 11:27 | 只看该作者
新手学习
回复

使用道具 举报

16#
ID:814956 发表于 2021-1-27 09:06 | 只看该作者
OLED屏显示数字是对的,就是屏幕一直在闪要怎么整?
回复

使用道具 举报

17#
ID:824148 发表于 2021-4-24 16:45 | 只看该作者
很棒,可以省了很多功夫,可惜是7线的spi协议,我买的全是4线的iic
回复

使用道具 举报

18#
ID:863864 发表于 2023-2-10 15:56 | 只看该作者
在proteus能仿真吗?
回复

使用道具 举报

19#
ID:1063532 发表于 2023-2-19 22:32 | 只看该作者
正在找OLED 的资料,开源的大佬,顶礼膜拜。
回复

使用道具 举报

20#
ID:433219 发表于 2023-2-20 09:01 | 只看该作者
小明1573 发表于 2021-4-24 16:45
很棒,可以省了很多功夫,可惜是7线的spi协议,我买的全是4线的iic

  简单的处理: tb买的时候,就向卖家要程序,,,如果不能提供的,就不要买。
回复

使用道具 举报

21#
ID:688008 发表于 2023-2-20 10:20 | 只看该作者
还是用io仿真的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表