找回密码
 立即注册
查看: 1104|回复: 4

成功点亮12832的OLED

[复制链接]

该用户从未签到

1

主题

4

回帖

23

积分

新手上路

积分
23
发表于 2023-5-12 11:31:50 | 显示全部楼层 |阅读模式
  1. #include "./comm/stc8h.h"
  2. #include <oled.h>
  3. #define MAIN_Fosc       24000000L   //定义主时钟
  4. void delay_ms(u8 ms)
  5. {
  6.     u16 i;
  7.     do{
  8.         i = MAIN_Fosc / 10000;
  9.         while(--i);   //10T per loop
  10.     }while(--ms);
  11. }
  12. void main(void)
  13. {
  14.         unsigned char i=0;
  15.        
  16.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  17.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  18.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  19.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  20.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  21.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  22.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  23.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  24.        
  25.        
  26.         OLED_Init();
  27.         OLED_ColorTurn(0);//0正常显示,1 反色显示
  28.   OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示       
  29.         OLED_Display_Off();
  30.         OLED_Display_On();
  31.         OLED_Clear_Left_To_Right();
  32.        
  33.         for(i=0;i<8;i++)
  34.                 NumberShow(i, 16*i, 0, 0) ;
  35.         OLED_Clear_Left_To_Right();
  36.         for(i=0;i<8;i++)
  37.                 NumberShow(i, 16*i, 0, 1) ;
  38.         OLED_Clear_Left_To_Right();       
  39.         while(1)
  40.         {
  41.     P20 = 0;                //LED On
  42.     delay_ms(250);
  43.     P20 = 1;                //LED Off
  44.     delay_ms(250);
  45.                
  46.                
  47.                 for(i=0;i<8;i++)
  48.                         NumberShow(i, 16*i, 0, 0) ;
  49.                 for(i=0;i<8;i++)
  50.                         NumberShow(i, 16*i, 2, 1) ;
  51.                 delay_ms(500);
  52.                 OLED_Clear_Left_To_Right();       
  53.                
  54.         for(i=0;i<8;i++)
  55.         {
  56.                 OLED_Set_Pos(i,3);               
  57.                 OLED_WR_Byte(0xFF,OLED_DATA);
  58.                 OLED_Set_Pos(i,2);               
  59.                 OLED_WR_Byte(0xF0,OLED_DATA);
  60.         }
  61.                 for(i=10;i<18;i++)
  62.         {
  63.                 OLED_Set_Pos(i,3);               
  64.                 OLED_WR_Byte(0xFF,OLED_DATA);
  65.                 OLED_Set_Pos(i,2);               
  66.                 OLED_WR_Byte(0xFF,OLED_DATA);
  67.         }
  68.         }
  69. }
复制代码



  1. #ifndef __OLED_H
  2. #define __OLED_H
  3. #include "./comm/stc8h.h"
  4.                    
  5. #define  u8 unsigned char
  6. #define  u16 unsigned int
  7. #define  u32 unsigned int
  8.        
  9. #define OLED_CMD  0        //写命令
  10. #define OLED_DATA 1        //写数据
  11. #define OLED_SCL P30 //SCL
  12. #define OLED_SDA P31 //SDA
  13. //-----------------OLED端口定义----------------
  14. #define OLED_SCL_Clr() OLED_SCL=0
  15. #define OLED_SCL_Set() OLED_SCL=1
  16. #define OLED_SDA_Clr() OLED_SDA=0
  17. #define OLED_SDA_Set() OLED_SDA=1
  18. //OLED控制用函数
  19. void OLED_ColorTurn(u8 i);
  20. void OLED_DisplayTurn(u8 i);
  21. void OLED_WR_Byte(u8 dat,u8 cmd);
  22. void OLED_Set_Pos(u8 x, u8 y);
  23. void OLED_Display_On(void);
  24. void OLED_Display_Off(void);
  25. void OLED_Clear(void);
  26. void OLED_Clear_Left_To_Right(void);
  27. void OLED_Init(void);
  28. void NumberShow(unsigned char numb, unsigned char x, unsigned char y, unsigned char flag);
  29. #endif  
复制代码


  1. #include "oled.h"
  2. //#include "oledfont.h"           
  3. /*
  4.     OLED的显存存放格式如下
  5.     PAGE[0]     0   1   2   3   ……  127
  6.     PAGE[1]     0   1   2   3   ……  127
  7.     PAGE[2]     0   1   2   3   ……  127
  8.     PAGE[3]     0   1   2   3   ……  127
  9.     PAGE[4]     0   1   2   3   ……  127
  10.     PAGE[5]     0   1   2   3   ……  127
  11.     PAGE[6]     0   1   2   3   ……  127
  12.     PAGE[7]     0   1   2   3   ……  127
  13. */
  14.                   
  15. unsigned char code num[][16]={
  16. {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",0*/
  17. {0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00},/*"1",1*/
  18. {0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",2*/
  19. {0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00},/*"3",3*/
  20. {0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24},/*"4",4*/
  21. {0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00},/*"5",5*/
  22. {0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00},/*"6",6*/
  23. {0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00},/*"7",7*/
  24. {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",8*/
  25. {0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00},/*"9",9*/
  26. };
  27. //反显函数
  28. void OLED_ColorTurn(u8 i)
  29. {
  30.         if(i==0)
  31.                 {
  32.                         OLED_WR_Byte(0xA6,OLED_CMD);//正常显示
  33.                 }
  34.         if(i==1)
  35.                 {
  36.                         OLED_WR_Byte(0xA7,OLED_CMD);//反色显示
  37.                 }
  38. }
  39. //屏幕旋转180度
  40. void OLED_DisplayTurn(u8 i)
  41. {
  42.         if(i==0)
  43.                 {
  44.                         OLED_WR_Byte(0xC8,OLED_CMD);//正常显示
  45.                         OLED_WR_Byte(0xA1,OLED_CMD);
  46.                 }
  47.         if(i==1)
  48.                 {
  49.                         OLED_WR_Byte(0xC0,OLED_CMD);//反转显示
  50.                         OLED_WR_Byte(0xA0,OLED_CMD);
  51.                 }
  52. }
  53. //延时
  54. void IIC_delay(void)
  55. {
  56.         u8 t=1;
  57.         while(t--);
  58. }
  59. //起始信号
  60. void I2C_Start(void)
  61. {
  62.         OLED_SDA_Set();
  63.         OLED_SCL_Set();
  64.         IIC_delay();
  65.         OLED_SDA_Clr();
  66.         IIC_delay();
  67.         OLED_SCL_Clr();
  68.          
  69. }
  70. //结束信号
  71. void I2C_Stop(void)
  72. {
  73.         OLED_SDA_Clr();
  74.         OLED_SCL_Set();
  75.         IIC_delay();
  76.         OLED_SDA_Set();
  77. }
  78. //等待信号响应
  79. void I2C_WaitAck(void) //测数据信号的电平
  80. {
  81.         OLED_SDA_Set();
  82.         IIC_delay();
  83.         OLED_SCL_Set();
  84.         IIC_delay();
  85.         OLED_SCL_Clr();
  86.         IIC_delay();
  87. }
  88. //写入一个字节
  89. void Send_Byte(u8 dat)
  90. {
  91.         u8 i;
  92.         for(i=0;i<8;i++)
  93.         {
  94.                 OLED_SCL_Clr();//将时钟信号设置为低电平
  95.                 if(dat&0x80)//将dat的8位从最高位依次写入
  96.                 {
  97.                         OLED_SDA_Set();
  98.     }
  99.                 else
  100.                 {
  101.                         OLED_SDA_Clr();
  102.     }
  103.                 IIC_delay();
  104.                 OLED_SCL_Set();
  105.                 IIC_delay();
  106.                 OLED_SCL_Clr();
  107.                 dat<<=1;
  108.   }
  109. }
  110. //发送一个字节
  111. //向SSD1306写入一个字节。
  112. //mode:数据/命令标志 0,表示命令;1,表示数据;
  113. void OLED_WR_Byte(u8 dat,u8 mode)
  114. {
  115.         I2C_Start();
  116.         Send_Byte(0x78);
  117.         I2C_WaitAck();
  118.         if(mode){Send_Byte(0x40);}
  119.   else{Send_Byte(0x00);}
  120.         I2C_WaitAck();
  121.         Send_Byte(dat);
  122.         I2C_WaitAck();
  123.         I2C_Stop();
  124. }
  125. /*
  126. 坐标设置,对于128*32分辨率的OLED:x从127;y从0到3
  127. */
  128. void OLED_Set_Pos(u8 x, u8 y)
  129. {
  130.         OLED_WR_Byte(0xb0+y,OLED_CMD);
  131.         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  132.         OLED_WR_Byte((x&0x0f),OLED_CMD);
  133. }             
  134. //开启OLED显示   
  135. void OLED_Display_On(void)
  136. {
  137.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  138.         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  139.         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  140. }
  141. //关闭OLED显示     
  142. void OLED_Display_Off(void)
  143. {
  144.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  145.         OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  146.         OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
  147. }                                            
  148. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!          
  149. void OLED_Clear(void)  
  150. {  
  151.         u8 i,n;                    
  152.         for(i=0;i<4;i++)  
  153.         {  
  154.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
  155.                 OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
  156.                 OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
  157.                 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  158.         } //更新显示
  159. }
  160. void OLED_Clear_Left_To_Right(void)
  161. {
  162.         u8 i,n;
  163.         for(i=0;i<128;i++)
  164.         {
  165.                 for(n=0;n<4;n++)
  166.                 {
  167.                         OLED_WR_Byte(0xb0+n,OLED_CMD);
  168.                         OLED_WR_Byte(((i&0xf0)>>4)|0x10,OLED_CMD);
  169.                         OLED_WR_Byte((i&0x0f),OLED_CMD);
  170.                         OLED_WR_Byte(0,OLED_DATA);
  171.                 }
  172.         }
  173. }
  174. //初始化                                    
  175. void OLED_Init(void)
  176. {
  177.        
  178.         OLED_WR_Byte(0xAE,OLED_CMD); /*display off*/
  179.         OLED_WR_Byte(0x00,OLED_CMD); /*set lower column address*/
  180.         OLED_WR_Byte(0x10,OLED_CMD); /*set higher column address*/
  181.         OLED_WR_Byte(0x00,OLED_CMD); /*set display start line*/
  182.         OLED_WR_Byte(0xB0,OLED_CMD); /*set page address*/
  183.         OLED_WR_Byte(0x81,OLED_CMD); /*contract control*/
  184.         OLED_WR_Byte(0xff,OLED_CMD); /*128*/
  185.         OLED_WR_Byte(0xA1,OLED_CMD); /*set segment remap*/
  186.         OLED_WR_Byte(0xA6,OLED_CMD); /*normal / reverse*/
  187.         OLED_WR_Byte(0xA8,OLED_CMD); /*multiplex ratio*/
  188.         OLED_WR_Byte(0x1F,OLED_CMD); /*duty = 1/32*/
  189.         OLED_WR_Byte(0xC8,OLED_CMD); /*Com scan direction*/
  190.         OLED_WR_Byte(0xD3,OLED_CMD); /*set display offset*/
  191.         OLED_WR_Byte(0x00,OLED_CMD);
  192.         OLED_WR_Byte(0xD5,OLED_CMD); /*set osc division*/
  193.         OLED_WR_Byte(0x80,OLED_CMD);
  194.         OLED_WR_Byte(0xD9,OLED_CMD); /*set pre-charge period*/
  195.         OLED_WR_Byte(0x1f,OLED_CMD);
  196.         OLED_WR_Byte(0xDA,OLED_CMD); /*set COM pins*/
  197.         OLED_WR_Byte(0x00,OLED_CMD);
  198.         OLED_WR_Byte(0xdb,OLED_CMD); /*set vcomh*/
  199.         OLED_WR_Byte(0x40,OLED_CMD);
  200.         OLED_WR_Byte(0x8d,OLED_CMD); /*set charge pump enable*/
  201.         OLED_WR_Byte(0x14,OLED_CMD);
  202.         OLED_Clear();
  203.         OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
  204. }
  205. /*
  206. numb:显示的数字,0-9
  207. x:坐标:0-127
  208. y:坐标:0-3
  209. flag:0为正显示,1为反显示
  210. */
  211. void NumberShow(unsigned char numb, unsigned char x, unsigned char y, unsigned char flag) {
  212.     unsigned char i;
  213.     for (i = 0; i < 16; i++) {
  214.         if (i == 0 || i == 15) {
  215.             OLED_Set_Pos(x + i, y + 0);
  216.             OLED_WR_Byte(flag ? ~0xFF : 0xFF, OLED_DATA);
  217.             OLED_Set_Pos(x + i, y + 1);
  218.             OLED_WR_Byte(flag ? ~0xFF : 0xFF, OLED_DATA);
  219.         } else if ((i > 0 && i < 4) || (i > 12 && i < 16)) {
  220.             OLED_Set_Pos(x + i, y + 0);
  221.             OLED_WR_Byte(flag ? ~0x01 : 0x01, OLED_DATA);
  222.             OLED_Set_Pos(x + i, y + 1);
  223.             OLED_WR_Byte(flag ? ~0x80 : 0x80, OLED_DATA);
  224.         } else {
  225.             OLED_Set_Pos(x + i, y + 0);
  226.             OLED_WR_Byte(flag ? ~(0x01 | num[numb][i - 4]) : (0x01 | num[numb][i - 4]), OLED_DATA);
  227.             OLED_Set_Pos(x + i, y + 1);
  228.             OLED_WR_Byte(flag ? ~(0x80 | num[numb][i + 4]) : (0x80 | num[numb][i + 4]), OLED_DATA);
  229.         }
  230.     }
  231. }
复制代码


回复 送花

使用道具 举报

该用户从未签到

1

主题

4

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2023-5-12 11:32:47 | 显示全部楼层
有个问题,我用P1的端口的,怎么都不行,这个P1有什么特殊的吗、
用的板子是免费申请的 开天斧3.1
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

4

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2023-5-12 11:43:33 | 显示全部楼层
微信图片_20230512114306.jpg
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 101 天

    [LV.6]常住居民II

    41

    主题

    1016

    回帖

    6971

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6971
    QQ
    发表于 2023-5-12 14:24:28 | 显示全部楼层
    P1端口没问题的,这个IIC的屏幕要注意以下几点
    1.选择的引脚记得对照下原理图,是不是接到了什么别的元器件或者芯片上
    2.IIC需要上啦电阻,没有外部的上啦可以使能模块内部上啦
    3.不要接错线
    肯定能点亮的
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    回帖

    23

    积分

    新手上路

    积分
    23
     楼主| 发表于 2023-5-18 14:37:15 | 显示全部楼层
    本帖最后由 gaoyang9992006 于 2023-5-18 15:07 编辑
    电子DIY小家 发表于 2023-5-12 14:24
    P1端口没问题的,这个IIC的屏幕要注意以下几点
    1.选择的引脚记得对照下原理图,是不是接到了什么别的元器件 ...

    不好意思,我接到其他端口都是可以正常工作的,就接到这个P1对应的上没反应,我再看看是不是端口模式没设置好。
    嗯,设置成推挽输出就可以了。搞定
    回复 支持 1 反对 0 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-20 03:22 , Processed in 0.064965 second(s), 48 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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