6053|2

1462

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

STM32F413开发板上实现OLED屏显示 [复制链接]

对于STM32F413开发板来说,它就像一张可供你实现各种可能的白纸,你总是需要为它配上些什么才好使用。这里我们就为它配上一个使用IIC接口的OLED屏来进行人机交互,
其使用效果如图所示。
OLED
屏显示效果图
    OLED屏与STM32F413的连接关系为SCKPA5SDAPA6,故程序的初始定义如下:
  1. //   STM32F413+IIC_OLED
  2. #include "main.h"
  3. #include "oledfont.h"
  4. #include "bmp.h"
  5. #define OLED_MODE 0
  6. #define SIZE 8
  7. #define XLevelL                0x00
  8. #define XLevelH                0x10
  9. #define Max_Column        128
  10. #define Max_Row                64
  11. #define        Brightness        0xFF
  12. #define X_WIDTH             128
  13. #define Y_WIDTH           64

  14. #define OLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)  
  15. #define OLED_SCLK_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)   

  16. #define OLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET)  
  17. #define OLED_SDIN_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET)   

  18. #define OLED_CMD  0       
  19. #define OLED_DATA 1
复制代码
为了使OLED屏工作,其初始化的函数为:
  1. //  SSD1306                                            
  2. void OLED_Init(void)
  3. {        
  4.         GPIO_InitTypeDef  GPIO_InitStruct;
  5.         __HAL_RCC_GPIOA_CLK_ENABLE();
  6.         GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;          
  7.         GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  8.     GPIO_InitStruct.Pull  = GPIO_PULLUP;
  9.         GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  10.         HAL_GPIO_Init(GPIOA,   &GPIO_InitStruct);
  11.     OLED_SCLK_Set();
  12.     OLED_SDIN_Set();       
  13.     Delay_1ms(800);             //delay_ms(800);
  14.     OLED_WR_Byte(0xAE,OLED_CMD);//--display off
  15.         OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  16.         OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  17.         OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
  18.         OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
  19.         OLED_WR_Byte(0x81,OLED_CMD); // contract control
  20.         OLED_WR_Byte(0xFF,OLED_CMD);//--128   
  21.         OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
  22.         OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
  23.         OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  24.         OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
  25.         OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
  26.         OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
  27.         OLED_WR_Byte(0x00,OLED_CMD);//
  28.        
  29.         OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
  30.         OLED_WR_Byte(0x80,OLED_CMD);//
  31.        
  32.         OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
  33.         OLED_WR_Byte(0x05,OLED_CMD);//
  34.        
  35.         OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
  36.         OLED_WR_Byte(0xF1,OLED_CMD);//
  37.        
  38.         OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
  39.         OLED_WR_Byte(0x12,OLED_CMD);//
  40.        
  41.         OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
  42.         OLED_WR_Byte(0x30,OLED_CMD);//
  43.        
  44.         OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
  45.         OLED_WR_Byte(0x14,OLED_CMD);//
  46.        
  47.         OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
  48. }
复制代码
要使OLED屏进行显示,只有初始化函数当然是不行的,它还需要以下基本函数的支持,它们是:
  1. void IIC_Start()
  2. {

  3.         OLED_SCLK_Set();
  4.         OLED_SDIN_Set();
  5.         OLED_SDIN_Clr();
  6.         OLED_SCLK_Clr();
  7. }

  8. void IIC_Stop()
  9. {
  10.     OLED_SCLK_Set();
  11.         OLED_SDIN_Clr();
  12.         OLED_SDIN_Set();
  13. }

  14. void IIC_Wait_Ack()
  15. {
  16.         OLED_SCLK_Set() ;
  17.         OLED_SCLK_Clr();
  18. }

  19. void Write_IIC_Byte(unsigned char IIC_Byte)
  20. {
  21.         unsigned char i;
  22.         unsigned char m,da;
  23.         da=IIC_Byte;
  24.         OLED_SCLK_Clr();
  25.         for(i=0;i<8;i++)               
  26.         {
  27.                 m=da;
  28.                 m=m&0x80;
  29.                 if(m==0x80)
  30.                 {OLED_SDIN_Set();}
  31.                 else OLED_SDIN_Clr();
  32.                 da=da<<1;
  33.                 OLED_SCLK_Set();
  34.                 OLED_SCLK_Clr();
  35.         }
  36. }

  37. void Write_IIC_Command(unsigned char IIC_Command)
  38. {
  39.      IIC_Start();
  40.      Write_IIC_Byte(0x78);      
  41.          IIC_Wait_Ack();       
  42.      Write_IIC_Byte(0x00);                       
  43.          IIC_Wait_Ack();       
  44.      Write_IIC_Byte(IIC_Command);
  45.          IIC_Wait_Ack();       
  46.      IIC_Stop();
  47. }

  48. void Write_IIC_Data(unsigned char IIC_Data)
  49. {
  50.      IIC_Start();
  51.      Write_IIC_Byte(0x78);                       
  52.          IIC_Wait_Ack();       
  53.      Write_IIC_Byte(0x40);                       
  54.          IIC_Wait_Ack();       
  55.      Write_IIC_Byte(IIC_Data);
  56.          IIC_Wait_Ack();       
  57.      IIC_Stop();
  58. }

  59. void OLED_WR_Byte(unsigned dat,unsigned cmd)
  60. {
  61.         if(cmd)
  62.         {
  63.     Write_IIC_Data(dat);
  64.         }
  65.         else
  66.         {
  67.     Write_IIC_Command(dat);
  68.         }
  69. }


  70. void Delay_50ms(unsigned int Del_50ms)
  71. {
  72.         unsigned int m;
  73.         for(;Del_50ms>0;Del_50ms--)
  74.         for(m=6245;m>0;m--);
  75. }

  76. void Delay_1ms(unsigned int Del_1ms)
  77. {
  78.         unsigned char j;
  79.         while(Del_1ms--)
  80.         {       
  81.                 for(j=0;j<123;j++);
  82.         }
  83. }

  84. void OLED_Set_Pos(unsigned char x, unsigned char y)
  85. {        
  86.         OLED_WR_Byte(0xb0+y,OLED_CMD);
  87.         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  88.         OLED_WR_Byte((x&0x0f),OLED_CMD);
  89. }
  90. void OLED_Clear(void)  
  91. {  
  92.         unsigned char i,n;                    
  93.         for(i=0;i<8;i++)  
  94.         {  
  95.                 OLED_WR_Byte (0xb0+i,OLED_CMD);   
  96.                 OLED_WR_Byte (0x00,OLED_CMD);      
  97.                 OLED_WR_Byte (0x10,OLED_CMD);        
  98.                 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  99.         }
  100. }
复制代码
此外,要实现字符、数值及字符串的显示,你还需要以下几个函数的配合:
  1. void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size)
  2. {             
  3.         unsigned char c=0,i=0;       
  4.                 c=chr-' ';               
  5.                 if(x>Max_Column-1){x=0;y=y+2;}
  6.                   if(Char_Size ==16)
  7.                         {
  8.                           OLED_Set_Pos(x,y);       
  9.                           for(i=0;i<8;i++)
  10.                           OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  11.                           OLED_Set_Pos(x,y+1);
  12.                           for(i=0;i<8;i++)
  13.                           OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  14.                         }
  15.                         else
  16.                         {       
  17.                                 OLED_Set_Pos(x,y);
  18.                                 for(i=0;i<6;i++)
  19.                                 OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  20.                         }
  21. }

  22. uint32_t oled_pow(unsigned char m,unsigned char n)
  23. {
  24.         uint32_t result=1;         
  25.         while(n--)result*=m;   
  26.         return result;
  27. }                                  

  28. void OLED_ShowNum(unsigned char x,unsigned char y,uint32_t num,unsigned char len,unsigned char size2)
  29. {                
  30.         unsigned char t,temp;
  31.         unsigned char enshow=0;                                                  
  32.         for(t=0;t<len;t++)
  33.         {
  34.                 temp=(num/oled_pow(10,len-t-1))%10;
  35.                 if(enshow==0&&t<(len-1))
  36.                 {
  37.                         if(temp==0)
  38.                         {
  39.                                 OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  40.                                 continue;
  41.                         }else enshow=1;
  42.                           
  43.                 }
  44.                  OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  45.         }
  46. }

  47. void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr,unsigned char Char_Size)
  48. {
  49.         unsigned char j=0;
  50.         while (chr[j]!='\0')
  51.         {                OLED_ShowChar(x,y,chr[j],Char_Size);
  52.                         x+=8;
  53.                     if(x>120){x=0;y+=2;}
  54.                         j++;
  55.         }
  56. }
复制代码
到现在你才可用主函数来制作出上图的显示效果,主函数的内容如下:
  1. int main(void)
  2. {
  3.     HAL_Init();  
  4.     /* Configure the system clock to 84 MHz */
  5.     SystemClock_Config();
  6.     /* -1- Enable GPIOA Clock (to be able to program the configuration registers) */
  7.         __HAL_RCC_GPIOB_CLK_ENABLE();
  8.     /* -2- Configure PA05 IO in output push-pull mode to drive external LED */
  9.         GPIO_InitStruct.Pin = GPIO_PIN_7;  //  LD2  PB7
  10.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  11.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  12.     GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  13.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  14.         OLED_Init();                         
  15.         OLED_Clear();
  16.         OLED_ShowString(2,0,"STM32F413",16);
  17.         OLED_ShowString(2,2,"Nucleo-144",16);
  18.         OLED_ShowString(2,4,"1.5MB Flash",16);
  19.         OLED_ShowString(2,6,"320-KB SRAM",16);

  20.   /* -3- Toggle PA05 IO in an infinite loop */  
  21.   while (1)
  22.   {
  23.     HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
  24.     /* Insert delay 100 ms */
  25.     HAL_Delay(100);
  26.   }
  27. }
复制代码


此帖出自stm32/stm8论坛

最新回复

能分享下你的这个源程序参考下吗?  详情 回复 发表于 2017-3-9 22:32

赞赏

1

查看全部赞赏

点赞 关注(1)
 

回复
举报

30

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
能分享下你的这个源程序参考下吗?
此帖出自stm32/stm8论坛

点评

这是相对用到的,其它的在商家的网址上可自行下载的。  详情 回复 发表于 2017-3-10 13:45
 
 

回复

1462

帖子

1

TA的资源

五彩晶圆(初级)

板凳
 
chengnnan 发表于 2017-3-9 22:32
能分享下你的这个源程序参考下吗?

这是相对用到的,其它的在商家的网址上可自行下载的。
此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表