本帖最后由 用户3948101 于 2023-11-12 01:32 编辑

1.如果正在使用STM32,然后想使用MM32芯片,下载并安装MM32 Series Keil pack,安装完成后可以选择MM32芯片。
2.下载官例程
下载完成后解压就可以看到下面这三个文件夹。
explorer_QUwaB5CTf1.png

后随便打开一个工程,是不是感觉工程文件夹看着眼熟,跟正点原子例程的工程文件夹很像。


3.采用模拟iic的方式驱动0.91 oled定义GPIO
  1. /* Files include */
  2. #include "hal_conf.h"
  3. //-----------------OLED¶Ë¿Ú¶¨Òå----------------

  4. #define OLED_SCL_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_0)//SCL
  5. #define OLED_SCL_Set() GPIO_SetBits(GPIOA,GPIO_Pin_0)

  6. #define OLED_SDA_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_4)//DIN
  7. #define OLED_SDA_Set() GPIO_SetBits(GPIOA,GPIO_Pin_4)

  8. #define OLED_CMD  0        //дÃüÁî
  9. #define OLED_DATA 1        //дÊý¾Ý

  10. void OLED_Refresh(void);
  11. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode);
  12. void OLED_Init(void);
驱动代码
  1. /* Files include */
  2. #include <stdio.h>
  3. #include "oled.h"
  4. #include "oledfont.h"

  5. u8 OLED_GRAM[144][4];

  6. //延时
  7. void IIC_delay(void)
  8. {
  9.         u8 t=3;
  10.         while(t--);
  11. }

  12. //起始信号
  13. void I2C_Start(void)
  14. {
  15.         OLED_SDA_Set();
  16.         OLED_SCL_Set();
  17.         IIC_delay();
  18.         OLED_SDA_Clr();
  19.         IIC_delay();
  20.         OLED_SCL_Clr();
  21.         IIC_delay();
  22. }

  23. //结束信号
  24. void I2C_Stop(void)
  25. {
  26.         OLED_SDA_Clr();
  27.         OLED_SCL_Set();
  28.         IIC_delay();
  29.         OLED_SDA_Set();
  30. }

  31. //等待信号响应
  32. void I2C_WaitAck(void) //测数据信号的电平
  33. {
  34.         OLED_SDA_Set();
  35.         IIC_delay();
  36.         OLED_SCL_Set();
  37.         IIC_delay();
  38.         OLED_SCL_Clr();
  39.         IIC_delay();
  40. }

  41. //写入一个字节
  42. void Send_Byte(u8 dat)
  43. {
  44.         u8 i;
  45.         for(i=0;i<8;i++)
  46.         {
  47.                 if(dat&0x80)//将dat的8位从最高位依次写入
  48.                 {
  49.                         OLED_SDA_Set();
  50.     }
  51.                 else
  52.                 {
  53.                         OLED_SDA_Clr();
  54.     }
  55.                 IIC_delay();
  56.                 OLED_SCL_Set();
  57.                 IIC_delay();
  58.                 OLED_SCL_Clr();//将时钟信号设置为低电平
  59.                 dat<<=1;
  60.   }
  61. }

  62. //发送一个字节
  63. //mode:数据/命令标志 0,表示命令;1,表示数据;
  64. void OLED_WR_Byte(u8 dat,u8 mode)
  65. {
  66.         I2C_Start();
  67.         Send_Byte(0x78);
  68.         I2C_WaitAck();
  69.         if(mode){Send_Byte(0x40);}
  70.   else{Send_Byte(0x00);}
  71.         I2C_WaitAck();
  72.         Send_Byte(dat);
  73.         I2C_WaitAck();
  74.         I2C_Stop();
  75. }

  76. //更新显存到OLED        
  77. void OLED_Refresh(void)
  78. {
  79.         u8 i,n;
  80.         for(i=0;i<4;i++)
  81.         {
  82.                 OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址
  83.                 OLED_WR_Byte(0x00,OLED_CMD);   //设置低列起始地址
  84.                 OLED_WR_Byte(0x10,OLED_CMD);   //设置高列起始地址
  85.                 I2C_Start();
  86.                 Send_Byte(0x78);
  87.                 I2C_WaitAck();
  88.                 Send_Byte(0x40);
  89.                 I2C_WaitAck();
  90.                 for(n=0;n<128;n++)
  91.                 {
  92.                         Send_Byte(OLED_GRAM[n][i]);
  93.                         I2C_WaitAck();
  94.                 }
  95.                 I2C_Stop();
  96.   }
  97. }
  98. //清屏函数
  99. void OLED_Clear(void)
  100. {
  101.         u8 i,n;
  102.         for(i=0;i<4;i++)
  103.         {
  104.            for(n=0;n<128;n++)
  105.                         {
  106.                          OLED_GRAM[n][i]=0;//清除所有数据
  107.                         }
  108.   }
  109.         OLED_Refresh();//更新显示
  110. }

  111. //画点
  112. //x:0~127
  113. //y:0~63
  114. //t:1 填充 0,清空        
  115. void OLED_DrawPoint(u8 x,u8 y,u8 t)
  116. {
  117.         u8 i,m,n;
  118.         i=y/8;
  119.         m=y%8;
  120.         n=1<<m;
  121.         if(t){OLED_GRAM[x][i]|=n;}
  122.         else
  123.         {
  124.                 OLED_GRAM[x][i]=~OLED_GRAM[x][i];
  125.                 OLED_GRAM[x][i]|=n;
  126.                 OLED_GRAM[x][i]=~OLED_GRAM[x][i];
  127.         }
  128. }

  129. //在指定位置显示一个字符,包括部分字符
  130. //x:0~127
  131. //y:0~63
  132. //size1:选择字体 6x8/6x12/8x16/12x24
  133. //mode:0,反色显示;1,正常显示
  134. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode)
  135. {
  136.         u8 i,m,temp,size2,chr1;
  137.         u8 x0=x,y0=y;
  138.         if(size1==8)size2=6;
  139.         else size2=(size1/8+((size1%8)?1:0))*(size1/2);  //得到字体一个字符对应点阵集所占的字节数
  140.         chr1=chr-' ';  //计算偏移后的值
  141.         for(i=0;i<size2;i++)
  142.         {
  143.                 if(size1==8)
  144.                           {temp=asc2_0806[chr1][i];} //调用0806字体
  145.                 else if(size1==12)
  146.         {temp=asc2_1206[chr1][i];} //调用1206字体
  147.                 else if(size1==16)
  148.         {temp=asc2_1608[chr1][i];} //调用1608字体
  149.                 else if(size1==24)
  150.         {temp=asc2_2412[chr1][i];} //调用2412字体
  151.                 else return;
  152.                 for(m=0;m<8;m++)
  153.                 {
  154.                         if(temp&0x01)OLED_DrawPoint(x,y,mode);
  155.                         else OLED_DrawPoint(x,y,!mode);
  156.                         temp>>=1;
  157.                         y++;
  158.                 }
  159.                 x++;
  160.                 if((size1!=8)&&((x-x0)==size1/2))
  161.                 {x=x0;y0=y0+8;}
  162.                 y=y0;
  163.   }
  164. }


  165. //显示字符串
  166. //x,y:起点坐标  
  167. //size1:字体大小
  168. //*chr:字符串起始地址
  169. //mode:0,反色显示;1,正常显示
  170. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode)
  171. {
  172.         while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符!
  173.         {
  174.                 OLED_ShowChar(x,y,*chr,size1,mode);
  175.                 if(size1==8)x+=6;
  176.                 else x+=size1/2;
  177.                 chr++;
  178.   }
  179. }

  180. //OLED的初始化
  181. void OLED_Init(void)
  182. {
  183.         GPIO_InitTypeDef  GPIO_InitStructure;
  184.         RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);         //使能A端口时钟
  185.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_3);
  186.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_3);
  187.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_4;         
  188.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
  189.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  190.          GPIO_Init(GPIOA, &GPIO_InitStructure);         
  191.          GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_4);
  192.         
  193.         
  194.         OLED_WR_Byte(0xAE,OLED_CMD); /*display off*/
  195.         OLED_WR_Byte(0x00,OLED_CMD); /*set lower column address*/
  196.         OLED_WR_Byte(0x10,OLED_CMD); /*set higher column address*/
  197.         OLED_WR_Byte(0x00,OLED_CMD); /*set display start line*/
  198.         OLED_WR_Byte(0xB0,OLED_CMD); /*set page address*/
  199.         OLED_WR_Byte(0x81,OLED_CMD); /*contract control*/
  200.         OLED_WR_Byte(0xff,OLED_CMD); /*128*/
  201.         OLED_WR_Byte(0xA1,OLED_CMD); /*set segment remap*/
  202.         OLED_WR_Byte(0xA6,OLED_CMD); /*normal / reverse*/
  203.         OLED_WR_Byte(0xA8,OLED_CMD); /*multiplex ratio*/
  204.         OLED_WR_Byte(0x1F,OLED_CMD); /*duty = 1/32*/
  205.         OLED_WR_Byte(0xC8,OLED_CMD); /*Com scan direction*/
  206.         OLED_WR_Byte(0xD3,OLED_CMD); /*set display offset*/
  207.         OLED_WR_Byte(0x00,OLED_CMD);
  208.         OLED_WR_Byte(0xD5,OLED_CMD); /*set osc division*/
  209.         OLED_WR_Byte(0x80,OLED_CMD);
  210.         OLED_WR_Byte(0xD9,OLED_CMD); /*set pre-charge period*/
  211.         OLED_WR_Byte(0x1f,OLED_CMD);
  212.         OLED_WR_Byte(0xDA,OLED_CMD); /*set COM pins*/
  213.         OLED_WR_Byte(0x00,OLED_CMD);
  214.         OLED_WR_Byte(0xdb,OLED_CMD); /*set vcomh*/
  215.         OLED_WR_Byte(0x40,OLED_CMD);
  216.         OLED_WR_Byte(0x8d,OLED_CMD); /*set charge pump enable*/
  217.         OLED_WR_Byte(0x14,OLED_CMD);
  218.         OLED_Clear();
  219.         OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
  220. }
main函数


  1. int main(void)
  2. {
  3.         OLED_Init();

  4.         while(1)
  5.         {
  6.                 OLED_Refresh();
  7.                 OLED_ShowString(20,0,"2023/11/11",16,1);
  8.         }
  9. }
微信图片_20231112012301.jpg
驱动效果如图
代码在这
oled.zip (2.9 MB, 下载次数: 0)
全部回复 0
暂无评论,快来抢沙发吧