打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
2018 0612

内容:利用最小系统STM32f103CB点亮OLED液晶屏幕

OLED使用的是有7个引脚的分别为的:GND 、VCC、D0、D0、RES、DC、CS

其中OLED与STM32的硬件连接:

D0----PA5

D0----PA7

RES---PB0

DC---PB1

CS---PA1

以下为程序代码

OLED.h

  1. #ifndef __OLED_H
  2. #define __OLED_H
  3. #include "sys.h"
  4. #include "stdlib.h"
  5. //OLED模式设置
  6. //0:4线串行模式
  7. //1:并行8080模式
  8. #define OLED_MODE 0
  9. #define SIZE 16
  10. #define XLevelL 0x00
  11. #define XLevelH 0x10
  12. #define Max_Column 128
  13. #define Max_Row 64
  14. #define Brightness 0xFF
  15. #define X_WIDTH 128
  16. #define Y_WIDTH 64
  17. //-----------------测试LED端口定义----------------
  18. #define LED_ON GPIO_ResetBits(GPIOB,GPIO_Pin_8)//DC
  19. #define LED_OFF GPIO_SetBits(GPIOB,GPIO_Pin_8)
  20. //-----------------OLED端口定义----------------
  21. #define OLED_SCLK_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_5)//CLK
  22. #define OLED_SCLK_Set() GPIO_SetBits(GPIOA,GPIO_Pin_5)
  23. #define OLED_SDIN_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_7)//DIN
  24. #define OLED_SDIN_Set() GPIO_SetBits(GPIOA,GPIO_Pin_7)
  25. #define OLED_RST_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_0)//RES
  26. #define OLED_RST_Set() GPIO_SetBits(GPIOB,GPIO_Pin_0)
  27. #define OLED_DC_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_1)//DC
  28. #define OLED_DC_Set() GPIO_SetBits(GPIOB,GPIO_Pin_1)
  29. #define OLED_CS_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_1)//CS
  30. #define OLED_CS_Set() GPIO_SetBits(GPIOA,GPIO_Pin_1)
  31. #define OLED_CMD 0 //写命令
  32. #define OLED_DATA 1 //写数据
  33. //OLED控制用函数
  34. void OLED_WR_Byte(u8 dat,u8 cmd);
  35. void OLED_Display_On(void);
  36. void OLED_Display_Off(void);
  37. void OLED_Init(void);
  38. void OLED_Clear(void);
  39. void OLED_DrawPoint(u8 x,u8 y,u8 t);
  40. void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
  41. void OLED_ShowChar(u8 x,u8 y,u8 chr);
  42. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
  43. void OLED_ShowString(u8 x,u8 y, u8 *p);
  44. void OLED_Set_Pos(unsigned char x, unsigned char y);
  45. void OLED_ShowCHinese(u8 x,u8 y,u8 no);
  46. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
  47. #endif

OLED.c

  1. #include "oled.h"
  2. #include "stdlib.h"
  3. #include "oledfont.h"
  4. #include "delay.h"
  5. //OLED的显存
  6. //存放格式如下.
  7. //[0]0 1 2 3 ... 127
  8. //[1]0 1 2 3 ... 127
  9. //[2]0 1 2 3 ... 127
  10. //[3]0 1 2 3 ... 127
  11. //[4]0 1 2 3 ... 127
  12. //[5]0 1 2 3 ... 127
  13. //[6]0 1 2 3 ... 127
  14. //[7]0 1 2 3 ... 127
  15. #if OLED_MODE==1
  16. //向SSD1106写入一个字节。
  17. //dat:要写入的数据/命令
  18. //cmd:数据/命令标志 0,表示命令;1,表示数据;
  19. void OLED_WR_Byte(u8 dat,u8 cmd)
  20. {
  21. DATAOUT(dat);
  22. if(cmd)
  23. OLED_DC_Set();
  24. else
  25. OLED_DC_Clr();
  26. OLED_CS_Clr();
  27. OLED_WR_Clr();
  28. OLED_WR_Set();
  29. OLED_CS_Set();
  30. OLED_DC_Set();
  31. }
  32. #else
  33. //向SSD1106写入一个字节。
  34. //dat:要写入的数据/命令
  35. //cmd:数据/命令标志 0,表示命令;1,表示数据;
  36. void OLED_WR_Byte(u8 dat,u8 cmd)
  37. {
  38. u8 i;
  39. if(cmd)
  40. OLED_DC_Set();
  41. else
  42. OLED_DC_Clr();
  43. OLED_CS_Clr();
  44. for(i=0;i<8;i++)
  45. {
  46. OLED_SCLK_Clr();
  47. if(dat&0x80)
  48. OLED_SDIN_Set();
  49. else
  50. OLED_SDIN_Clr();
  51. OLED_SCLK_Set();
  52. dat<<=1;
  53. }
  54. OLED_CS_Set();
  55. OLED_DC_Set();
  56. }
  57. #endif
  58. void OLED_Set_Pos(unsigned char x, unsigned char y)
  59. {
  60. OLED_WR_Byte(0xb0+y,OLED_CMD);
  61. OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  62. OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);
  63. }
  64. //开启OLED显示
  65. void OLED_Display_On(void)
  66. {
  67. OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
  68. OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON
  69. OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON
  70. }
  71. //关闭OLED显示
  72. void OLED_Display_Off(void)
  73. {
  74. OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
  75. OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF
  76. OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF
  77. }
  78. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
  79. void OLED_Clear(void)
  80. {
  81. u8 i,n;
  82. for(i=0;i<8;i++)
  83. {
  84. OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)
  85. OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址
  86. OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址
  87. for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  88. } //更新显示
  89. }
  90. //在指定位置显示一个字符,包括部分字符
  91. //x:0~127
  92. //y:0~63
  93. //mode:0,反白显示;1,正常显示
  94. //size:选择字体 16/12
  95. void OLED_ShowChar(u8 x,u8 y,u8 chr)
  96. {
  97. unsigned char c=0,i=0;
  98. c=chr-' ';//得到偏移后的值
  99. if(x>Max_Column-1){x=0;y=y+2;}
  100. if(SIZE ==16)
  101. {
  102. OLED_Set_Pos(x,y);
  103. for(i=0;i<8;i++)
  104. OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  105. OLED_Set_Pos(x,y+1);
  106. for(i=0;i<8;i++)
  107. OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  108. }
  109. else {
  110. OLED_Set_Pos(x,y+1);
  111. for(i=0;i<6;i++)
  112. OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  113. }
  114. }
  115. //m^n函数
  116. u32 oled_pow(u8 m,u8 n)
  117. {
  118. u32 result=1;
  119. while(n--)result*=m;
  120. return result;
  121. }
  122. //显示2个数字
  123. //x,y :起点坐标
  124. //len :数字的位数
  125. //size:字体大小
  126. //mode:模式 0,填充模式;1,叠加模式
  127. //num:数值(0~4294967295);
  128. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
  129. {
  130. u8 t,temp;
  131. u8 enshow=0;
  132. for(t=0;t<len;t++)
  133. {
  134. temp=(num/oled_pow(10,len-t-1))%10;
  135. if(enshow==0&&t<(len-1))
  136. {
  137. if(temp==0)
  138. {
  139. OLED_ShowChar(x+(size/2)*t,y,' ');
  140. continue;
  141. }else enshow=1;
  142. }
  143. OLED_ShowChar(x+(size/2)*t,y,temp+'0');
  144. }
  145. }
  146. //显示一个字符号串
  147. void OLED_ShowString(u8 x,u8 y,u8 *chr)
  148. {
  149. unsigned char j=0;
  150. while (chr[j]!='\0')
  151. { OLED_ShowChar(x,y,chr[j]);
  152. x+=8;
  153. if(x>120){x=0;y+=2;}
  154. j++;
  155. }
  156. }
  157. //显示汉字
  158. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  159. {
  160. u8 t,adder=0;
  161. OLED_Set_Pos(x,y);
  162. for(t=0;t<16;t++)
  163. {
  164. OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
  165. adder+=1;
  166. }
  167. OLED_Set_Pos(x,y+1);
  168. for(t=0;t<16;t++)
  169. {
  170. OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
  171. adder+=1;
  172. }
  173. }
  174. /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
  175. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  176. {
  177. unsigned int j=0;
  178. unsigned char x,y;
  179. if(y1%8==0) y=y1/8;
  180. else y=y1/8+1;
  181. for(y=y0;y<y1;y++)
  182. {
  183. OLED_Set_Pos(x0,y);
  184. for(x=x0;x<x1;x++)
  185. {
  186. OLED_WR_Byte(BMP[j++],OLED_DATA);
  187. }
  188. }
  189. }
  190. //初始化SSD1306
  191. void OLED_Init(void)
  192. {
  193. GPIO_InitTypeDef GPIO_InitStructure;
  194. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能A端口时钟
  195. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_5|GPIO_Pin_7;
  196. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  197. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  198. GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOD3,6
  199. GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_1);
  200. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能B端口时钟
  201. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8;
  202. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  203. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  204. GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOD3,6
  205. GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8);
  206. OLED_RST_Set();
  207. delay_ms(100);
  208. OLED_RST_Clr();
  209. delay_ms(200);
  210. OLED_RST_Set();
  211. OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
  212. OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  213. OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  214. OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
  215. OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
  216. OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
  217. OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
  218. OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
  219. OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
  220. OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  221. OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
  222. OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
  223. OLED_WR_Byte(0x00,OLED_CMD);//-not offset
  224. OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
  225. OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
  226. OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
  227. OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  228. OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
  229. OLED_WR_Byte(0x12,OLED_CMD);
  230. OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
  231. OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
  232. OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
  233. OLED_WR_Byte(0x02,OLED_CMD);//
  234. OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
  235. OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
  236. OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
  237. OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
  238. OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
  239. OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
  240. OLED_Clear();
  241. OLED_Set_Pos(0,0);
  242. }

main.c

  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "oled.h"
  4. int main(void)
  5. {
  6. delay_init(72); //延时函数初始化
  7. OLED_Init(); //初始化OLED
  8. OLED_Clear() ;
  9. OLED_ShowString(0,0,"Analog:");
  10. OLED_ShowString(0,3,"Digital:");
  11. }

在进行实验时出现当使用PA3口作为CS口时候出现花屏现象,而且即使出现图案也会不稳定只要动一下CS连接的那根线就会花屏,在将CS接地后或者使用PA1口就不会出现这种现象。目前还不能解决,应该是PA3口没有输出导致PA3引脚悬空了处于一个不稳定的状态。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
OLED SH1106通过I2C显示
单片机STM32的LCD12864显示(1)
高通字库芯片GT20L16S1Y驱动 0.96寸 OLED 任意显示中文
stm32驱动 LCD1602
STM32F429 使用 TCS34725 颜色传感器的驱动程序
物联网之RFID二
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服