找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32F103C8T6-OLED屏幕显示程序,截取自其他项目

[复制链接]
跳转到指定楼层
楼主
ID:928738 发表于 2021-10-21 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "OLED_I2C.h"
  2. #include "delay.h"
  3. #include "codetab.h"

  4. void I2C_Configuration(void)
  5. {
  6.         I2C_InitTypeDef  I2C_InitStructure;
  7.         GPIO_InitTypeDef  GPIO_InitStructure;

  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  10.         /*STM32F103C8T6芯片的硬件I2C: PB6 -- SCL; PB7 -- SDA */
  11.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C必须开漏输出
  14.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  15.         I2C_DeInit(I2C1);//使用I2C1
  16.         I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  17.         I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  18.         I2C_InitStructure.I2C_OwnAddress1 = 0x30;//主机的I2C地址,随便写的
  19.         I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  20.         I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  21.         I2C_InitStructure.I2C_ClockSpeed = 400000;//400K

  22.         I2C_Cmd(I2C1, ENABLE);
  23.         I2C_Init(I2C1, &I2C_InitStructure);
  24. }

  25. void I2C_WriteByte(uint8_t addr,uint8_t data)
  26. {
  27.   while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
  28.        
  29.         I2C_GenerateSTART(I2C1, ENABLE);//开启I2C1
  30.         while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

  31.         I2C_Send7bitAddress(I2C1, OLED_ADDRESS, I2C_Direction_Transmitter);//器件地址 -- 默认0x78
  32.         while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  33.         I2C_SendData(I2C1, addr);//寄存器地址
  34.         while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  35.         I2C_SendData(I2C1, data);//发送数据
  36.         while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  37.        
  38.         I2C_GenerateSTOP(I2C1, ENABLE);//关闭I2C1总线
  39. }

  40. void WriteCmd(unsigned char I2C_Command)//写命令
  41. {
  42.         I2C_WriteByte(0x00, I2C_Command);
  43. }

  44. void WriteDat(unsigned char I2C_Data)//写数据
  45. {
  46.         I2C_WriteByte(0x40, I2C_Data);
  47. }

  48. void OLED_Init(void)
  49. {
  50.         DelayMs(100); //这里的延时很重要
  51.        
  52.         WriteCmd(0xAE); //display off
  53.         WriteCmd(0x20);        //Set Memory Addressing Mode       
  54.         WriteCmd(0x10);        //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
  55.         WriteCmd(0xb0);        //Set Page Start Address for Page Addressing Mode,0-7
  56.         WriteCmd(0xc8);        //Set COM Output Scan Direction
  57.         WriteCmd(0x00); //---set low column address
  58.         WriteCmd(0x10); //---set high column address
  59.         WriteCmd(0x40); //--set start line address
  60.         WriteCmd(0x81); //--set contrast control register
  61.         WriteCmd(0xff); //亮度调节 0x00~0xff
  62.         WriteCmd(0xa1); //--set segment re-map 0 to 127
  63.         WriteCmd(0xa6); //--set normal display
  64.         WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
  65.         WriteCmd(0x3F); //
  66.         WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  67.         WriteCmd(0xd3); //-set display offset
  68.         WriteCmd(0x00); //-not offset
  69.         WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
  70.         WriteCmd(0xf0); //--set divide ratio
  71.         WriteCmd(0xd9); //--set pre-charge period
  72.         WriteCmd(0x22); //
  73.         WriteCmd(0xda); //--set com pins hardware configuration
  74.         WriteCmd(0x12);
  75.         WriteCmd(0xdb); //--set vcomh
  76.         WriteCmd(0x20); //0x20,0.77xVcc
  77.         WriteCmd(0x8d); //--set DC-DC enable
  78.         WriteCmd(0x14); //
  79.         WriteCmd(0xaf); //--turn on oled panel
  80. }

  81. void OLED_SetPos(unsigned char x, unsigned char y) //设置起始点坐标
  82. {
  83.         WriteCmd(0xb0+y);
  84.         WriteCmd(((x&0xf0)>>4)|0x10);
  85.         WriteCmd((x&0x0f)|0x01);
  86. }

  87. void OLED_Fill(unsigned char fill_Data,u8 start,u8 final)//全屏填充
  88. {
  89.         unsigned char m,n;
  90.         for(m=start;m<final;m++)
  91.         {
  92.                 WriteCmd(0xb0+m);                //page0-page1
  93.                 WriteCmd(0x00);                //low column start address
  94.                 WriteCmd(0x10);                //high column start address
  95.                 for(n=0;n<128;n++)
  96.                         {
  97.                                 WriteDat(fill_Data);
  98.                         }
  99.         }
  100. }


  101. void OLED_Clear_Pag(unsigned char fill_Data)//全屏填充
  102. {
  103.         unsigned char n;

  104.         WriteCmd(0xb0+4);                //page0-page1
  105.         WriteCmd(0x00);                //low column start address
  106.         WriteCmd(0x10);                //high column start address
  107.         for(n=0;n<128;n++)
  108.         {
  109.                 WriteDat(fill_Data);
  110.         }
  111.        
  112. }



  113. void OLED_CLS(void)//清屏
  114. {
  115.         OLED_Fill(0x00,0,8);
  116. }

  117. //--------------------------------------------------------------
  118. // Prototype      : void OLED_ON(void)
  119. // Calls          :
  120. // Parameters     : none
  121. // Description    : 将OLED从休眠中唤醒
  122. //--------------------------------------------------------------
  123. void OLED_ON(void)
  124. {
  125.         WriteCmd(0X8D);  //设置电荷泵
  126.         WriteCmd(0X14);  //开启电荷泵
  127.         WriteCmd(0XAF);  //OLED唤醒
  128. }

  129. //--------------------------------------------------------------
  130. // Prototype      : void OLED_OFF(void)
  131. // Calls          :
  132. // Parameters     : none
  133. // Description    : 让OLED休眠 -- 休眠模式下,OLED功耗不到10uA
  134. //--------------------------------------------------------------
  135. void OLED_OFF(void)
  136. {
  137.         WriteCmd(0X8D);  //设置电荷泵
  138.         WriteCmd(0X10);  //关闭电荷泵
  139.         WriteCmd(0XAE);  //OLED休眠
  140. }

  141. //--------------------------------------------------------------
  142. // Prototype      : void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
  143. // Calls          :
  144. // Parameters     : x,y -- 起始点坐标(x:0~127, y:0~7); ch[] -- 要显示的字符串; TextSize -- 字符大小(1:6*8 ; 2:8*16)
  145. // Description    : 显示codetab.h中的ASCII字符,有6*8和8*16可选择
  146. //--------------------------------------------------------------
  147. void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
  148. {
  149.         unsigned char c = 0,i = 0,j = 0;
  150.         switch(TextSize)
  151.         {
  152.                 case 1:
  153.                 {
  154.                         while(ch[j] != '\0')
  155.                         {
  156.                                 c = ch[j] - 32;
  157.                                 if(x > 126)
  158.                                 {
  159.                                         x = 0;
  160.                                         y++;
  161.                                 }
  162.                                 OLED_SetPos(x,y);
  163.                                 for(i=0;i<6;i++)
  164.                                         WriteDat(F6x8[c][i]);
  165.                                 x += 6;
  166.                                 j++;
  167.                         }
  168.                 }break;
  169.                 case 2:
  170.                 {
  171.                         while(ch[j] != '\0')
  172.                         {
  173.                                 c = ch[j] - 32;
  174.                                 if(x > 120)
  175.                                 {
  176.                                         x = 0;
  177.                                         y++;
  178.                                 }
  179.                                 OLED_SetPos(x,y);
  180.                                 for(i=0;i<8;i++)
  181.                                         WriteDat(F8X16[c*16+i]);
  182.                                 OLED_SetPos(x,y+1);
  183.                                 for(i=0;i<8;i++)
  184.                                         WriteDat(F8X16[c*16+i+8]);
  185.                                 x += 8;
  186.                                 j++;
  187.                         }
  188.                 }break;
  189.         }
  190. }

  191. //--------------------------------------------------------------
  192. // Prototype      : void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
  193. // Calls          :
  194. // Parameters     : x,y -- 起始点坐标(x:0~127, y:0~7); N:汉字在codetab.h中的索引
  195. // Description    : 显示codetab.h中的汉字,16*16点阵
  196. //--------------------------------------------------------------
  197. void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
  198. {
  199.         unsigned char wm=0;
  200.         unsigned int  adder=32*N;
  201.         OLED_SetPos(x , y);
  202.         for(wm = 0;wm < 16;wm++)
  203.         {
  204.                 WriteDat(F16x16[adder]);
  205.                 adder += 1;
  206.         }
  207.         OLED_SetPos(x,y + 1);
  208.         for(wm = 0;wm < 16;wm++)
  209.         {
  210.                 WriteDat(F16x16[adder]);
  211.                 adder += 1;
  212.         }
  213. }

  214. //--------------------------------------------------------------
  215. // Prototype      : void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]);
  216. // Calls          :
  217. // Parameters     : x0,y0 -- 起始点坐标(x0:0~127, y0:0~7); x1,y1 -- 起点对角线(结束点)的坐标(x1:1~128,y1:1~8)
  218. // Description    : 显示BMP位图
  219. //--------------------------------------------------------------
  220. void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
  221. {
  222.         unsigned int j=0;
  223.         unsigned char x,y;

  224.   if(y1%8==0)
  225.                 y = y1/8;
  226.   else
  227.                 y = y1/8 + 1;
  228.         for(y=y0;y<y1;y++)
  229.         {
  230.                 OLED_SetPos(x0,y);
  231.     for(x=x0;x<x1;x++)
  232.                 {
  233.                         WriteDat(BMP[j++]);
  234.                 }
  235.         }
  236. }
复制代码


STM32F103C8T6-OLED屏幕显示.7z

3.2 MB, 下载次数: 51, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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