打开APP
userphoto
未登录

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

开通VIP
高通字库芯片GT20L16S1Y驱动 0.96寸 OLED 任意显示中文

连续两个月的加班,给ODM客户生产温控器订单,今天终于顺利发货,对于工程师出身的我,终于可以对着电脑,消停几天,研究技术,分享技术了,闲话少说,直接进入正题:

半年前有个老客户介绍个中央某院的项目,我主业是做各种温控器的,老客户介绍的新客户,没法推脱,就干吧,项目需求具体细节不方便公开,说说本次要分享的部分,要实现的功能是一个OLED任意显示一段中文句子

项目的硬件组成比较简单:STM8L051+ KEY + OLED + GT20L16S1Y

软件平台:IAR

整个项目没什么难点,但没做过这个的,也需要一番折腾,在这里,我把项目的主要代码贴出来供电友们参考,也感谢之前版本的电友。做个靠谱的电友,除了分享单独的.c.h驱动文件,最后还会有调用伪代码,也就是整个代码的调用过程。

一:高通字库芯片驱动程序:

  1. // .c文件
  2. #include "stm8l15x.h"//STM8L051/151等系列共用库函数
  3. #include "GT20L16S1Y.h"
  4. #define S1Y_CLK_L (GPIO_ResetBits(GPIOB,GPIO_Pin_4))
  5. #define S1Y_CLK_H (GPIO_SetBits(GPIOB,GPIO_Pin_4))
  6. #define S1Y_CS_L (GPIO_ResetBits(GPIOB,GPIO_Pin_5))
  7. #define S1Y_CS_H (GPIO_SetBits(GPIOB,GPIO_Pin_5))
  8. #define S1Y_SI_L (GPIO_ResetBits(GPIOB,GPIO_Pin_6))
  9. #define S1Y_SI_H (GPIO_SetBits(GPIOB,GPIO_Pin_6))
  10. #define S1Y_SO GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)
  11. void GT20L16_init(void)
  12. {
  13. /* GT20L16S1Y 引脚配置 */
  14. GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_Low_Fast); //高速推挽输出低电平[SCLK]
  15. GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_Low_Fast); //高速推挽输出低电平[CS]
  16. GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_Low_Fast); //高速推挽输出低电平[SI]
  17. GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); //上拉输入[SO]
  18. }
  19. /***************************************
  20. ASCII 调用
  21. ASCIICode:表示ASCII 码(8bits)
  22. BaseAdd:说明该套字库在芯片中的起始地址。
  23. r_dat_bat: 是读点阵数据函数。
  24. DZ_Data:是保存读出的点阵数据的数组。
  25. ****************************************/
  26. u8 S1Y_ASCII_GetData( u8 ASCIICode, u32 BaseAdd, u8* S1YDZ_Data )
  27. {
  28. if( ( ASCIICode >= 0x20 ) && ( ASCIICode <= 0x7e ) )
  29. {
  30. switch( BaseAdd )
  31. {
  32. case 0x3bfc0:
  33. S1Y_rdat_bat( ( ASCIICode - 0x20 ) * 8 + BaseAdd, 8, S1YDZ_Data ); //5X7
  34. break ;
  35. case 0x66c0:
  36. S1Y_rdat_bat( ( ASCIICode - 0x20 ) * 8 + BaseAdd, 8, S1YDZ_Data ); //7X8
  37. break ;
  38. case 0x3b7c0:
  39. S1Y_rdat_bat( ( ASCIICode - 0x20 ) * 16 + BaseAdd, 16, S1YDZ_Data ); //8X16 A
  40. break ;
  41. case 0x3cf80:
  42. S1Y_rdat_bat( ( ASCIICode - 0x20 ) * 26 + BaseAdd, 16, S1YDZ_Data ); //8X16 F
  43. break ;
  44. case 0x3c2c0:
  45. S1Y_rdat_bat( ( ASCIICode - 0x20 ) * 34 + BaseAdd + 2, 32, S1YDZ_Data ); //16X16 Arial
  46. break ;
  47. case 0x3d580:
  48. S1Y_rdat_bat( ( ASCIICode - 0x20 ) * 34 + BaseAdd + 2, 32, S1YDZ_Data ); //16X16 T
  49. break ;
  50. default:
  51. break;
  52. }
  53. return 1;
  54. }
  55. else
  56. {
  57. return 0;
  58. }
  59. }
  60. /***************************************************
  61. 16 点GB2312 标准点阵字库
  62. 参数说明:
  63. GBCode表示汉字内码。
  64. MSB 表示汉字内码GBCode 的高8bits。
  65. LSB 表示汉字内码GBCode 的低8bits。
  66. Address 表示汉字或ASCII字符点阵在芯片中的字节地址。
  67. BaseAdd:说明点阵数据在字库芯片中的起始地址。
  68. r_dat_bat 是读点阵数据函数。
  69. DZ_Data是保存读出的点阵数据的数组。
  70. *****************************************************/
  71. void S1Y_gt16_GetData( u8 MSB, u8 LSB, u8* S1YDZ_Data )
  72. {
  73. u32 temp = ( MSB - 0xB0 ) * 94 + LSB - 0xA1;
  74. u32 BaseAdd = 0, Address;
  75. if( MSB == 0xA9 && LSB >= 0xA1 )
  76. {
  77. Address = ( 282 + ( LSB - 0xA1 ) ) * 32 + BaseAdd;
  78. }
  79. else if( MSB >= 0xA1 && MSB <= 0xA3 && LSB >= 0xA1 )
  80. {
  81. Address = ( ( MSB - 0xA1 ) * 94 + ( LSB - 0xA1 ) ) * 32 + BaseAdd;
  82. }
  83. else if( MSB >= 0xB0 && MSB <= 0xF7 && LSB >= 0xA1 )
  84. {
  85. Address = ( 846 + temp ) * 32 + BaseAdd;
  86. }
  87. S1Y_rdat_bat( Address, 32, S1YDZ_Data );
  88. }
  89. //Address=((MSB-0xB0)*94+(LSB-0xA1)+846)*32+BaseAdd;
  90. /****************************************************
  91. 8X16 点国标扩展字符
  92. 说明:
  93. BaseAdd:说明本套字库在字库芯片中的起始字节地址。
  94. FontCode:表示字符内码(16bits).
  95. Address:表示字符点阵在芯片中的字节地址。
  96. r_dat_bat 是读点阵数据函数。
  97. DZ_Data是保存读出的点阵数据的数组。
  98. *****************************************************/
  99. void S1Y_GB_EXT_816( u16 FontCode, u8* S1YDZ_Data )
  100. {
  101. u32 BaseAdd = 0x3b7d0, Address;
  102. u32 temp1 = ( FontCode - 0xAAA1 );
  103. u32 temp2 = ( FontCode - 0xABA1 + 95 );
  104. if( FontCode >= 0xAAA1 && FontCode <= 0xAAFE )
  105. {
  106. Address = temp1 * 16 + BaseAdd;
  107. }
  108. else if( FontCode >= 0xABA1 && FontCode <= 0xABC0 )
  109. {
  110. Address = temp2 * 16 + BaseAdd;
  111. }
  112. S1Y_rdat_bat( Address, 16, S1YDZ_Data );
  113. }
  114. /****************************************************
  115. 从字库中读数据函数
  116. 说明:
  117. Address : 表示字符点阵在芯片中的字节地址。
  118. byte_long: 是读点阵数据字节数。
  119. *p_arr : 是保存读出的点阵数据的数组。
  120. *****************************************************/
  121. u8 S1Y_rdat_bat( u32 address, u8 byte_long, u8* p_arr )
  122. {
  123. unsigned int j = 0;
  124. S1Y_CS_L;
  125. S1Y_SendByte( address );
  126. for( j = 0; j < byte_long; j++ )
  127. {
  128. p_arr[j] = S1Y_ReadByte();
  129. }
  130. S1Y_CS_H;
  131. return p_arr[0];
  132. }
  133. void S1Y_SendByte( u32 cmd )
  134. {
  135. u8 i;
  136. cmd = cmd | 0x03000000;
  137. for( i = 0; i < 32; i++ )
  138. {
  139. S1Y_CLK_L;
  140. if( cmd & 0x80000000 )
  141. {
  142. S1Y_SI_H;
  143. }
  144. else
  145. {
  146. S1Y_SI_L;
  147. }
  148. S1Y_CLK_H;
  149. cmd = cmd << 1;
  150. }
  151. }
  152. u8 S1Y_ReadByte( void )
  153. {
  154. u8 i;
  155. u8 dat = 0;
  156. S1Y_CLK_H;
  157. for( i = 0; i < 8; i++ )
  158. {
  159. S1Y_CLK_L;
  160. dat = dat << 1;
  161. if( S1Y_SO )
  162. {
  163. dat = dat | 0x01;
  164. }
  165. else
  166. {
  167. dat &= 0xfe;
  168. }
  169. S1Y_CLK_H ;
  170. }
  171. return dat;
  172. }
  173. //-------------------------------------分割线---------------------------------
  174. //.h 文件
  175. #ifndef _GT20L16S1Y_H_
  176. #define _GT20L16S1Y_H_
  177. void S1Y_SendByte(u32 cmd);
  178. u8 S1Y_ReadByte(void);
  179. u8 S1Y_rdat_bat(u32 address,u8 byte_long,u8 *p_arr);
  180. u8 S1Y_ASCII_GetData(u8 ASCIICode,u32 BaseAdd,u8 *S1YDZ_Data);
  181. void S1Y_gt16_GetData (u8 MSB,u8 LSB,u8 *S1YDZ_Data);
  182. void S1Y_GB_EXT_816(u16 FontCode,u8 *S1YDZ_Data);
  183. void GT20L16_init(void);
  184. #endif

OLED显示就比较简单了,显示任意汉字字符串,也折腾了我几根头发,下面也贴出来分享一下:

  1. // .c文件
  2. #include "oled.h"
  3. #include "oledfont.h"
  4. #include "GT20L16S1Y.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. void delay_ms( unsigned int ms )
  16. {
  17. unsigned int a;
  18. while( ms )
  19. {
  20. a = 1800;
  21. while( a-- );
  22. ms--;
  23. }
  24. return;
  25. }
  26. //反显函数
  27. void OLED_ColorTurn( u8 i )
  28. {
  29. if( i == 0 )
  30. {
  31. OLED_WR_Byte( 0xA6, OLED_CMD ); //正常显示
  32. }
  33. if( i == 1 )
  34. {
  35. OLED_WR_Byte( 0xA7, OLED_CMD ); //反色显示
  36. }
  37. }
  38. //屏幕旋转180度
  39. void OLED_DisplayTurn( u8 i )
  40. {
  41. if( i == 0 )
  42. {
  43. OLED_WR_Byte( 0xC8, OLED_CMD ); //正常显示
  44. OLED_WR_Byte( 0xA1, OLED_CMD );
  45. }
  46. if( i == 1 )
  47. {
  48. OLED_WR_Byte( 0xC0, OLED_CMD ); //反转显示
  49. OLED_WR_Byte( 0xA0, OLED_CMD );
  50. }
  51. }
  52. //延时
  53. void IIC_delay( void )
  54. {
  55. u8 t = 1;
  56. while( t-- );
  57. }
  58. //起始信号
  59. void I2C_Start( void )
  60. {
  61. OLED_SDA_Set();
  62. OLED_SCL_Set();
  63. IIC_delay();
  64. OLED_SDA_Clr();
  65. IIC_delay();
  66. OLED_SCL_Clr();
  67. }
  68. //结束信号
  69. void I2C_Stop( void )
  70. {
  71. OLED_SDA_Clr();
  72. OLED_SCL_Set();
  73. IIC_delay();
  74. OLED_SDA_Set();
  75. }
  76. //等待信号响应
  77. void I2C_WaitAck( void ) //测数据信号的电平
  78. {
  79. OLED_SDA_Set();
  80. IIC_delay();
  81. OLED_SCL_Set();
  82. IIC_delay();
  83. OLED_SCL_Clr();
  84. IIC_delay();
  85. }
  86. //写入一个字节
  87. void Send_Byte( u8 dat )
  88. {
  89. u8 i;
  90. for( i = 0; i < 8; i++ )
  91. {
  92. OLED_SCL_Clr();//将时钟信号设置为低电平
  93. if( dat & 0x80 ) //将dat的8位从最高位依次写入
  94. {
  95. OLED_SDA_Set();
  96. }
  97. else
  98. {
  99. OLED_SDA_Clr();
  100. }
  101. IIC_delay();
  102. OLED_SCL_Set();
  103. IIC_delay();
  104. OLED_SCL_Clr();
  105. dat <<= 1;
  106. }
  107. }
  108. //发送一个字节
  109. //向SSD1306写入一个字节。
  110. //mode:数据/命令标志 0,表示命令;1,表示数据;
  111. void OLED_WR_Byte( u8 dat, u8 mode )
  112. {
  113. I2C_Start();
  114. Send_Byte( 0x78 );
  115. I2C_WaitAck();
  116. if( mode )
  117. {
  118. Send_Byte( 0x40 );
  119. }
  120. else
  121. {
  122. Send_Byte( 0x00 );
  123. }
  124. I2C_WaitAck();
  125. Send_Byte( dat );
  126. I2C_WaitAck();
  127. I2C_Stop();
  128. }
  129. //坐标设置
  130. void OLED_Set_Pos( u8 x, u8 y )
  131. {
  132. OLED_WR_Byte( 0xb0 + y, OLED_CMD );
  133. OLED_WR_Byte( ( ( x & 0xf0 ) >> 4 ) | 0x10, OLED_CMD );
  134. OLED_WR_Byte( ( x & 0x0f ), OLED_CMD );
  135. }
  136. //开启OLED显示
  137. void OLED_Display_On( void )
  138. {
  139. OLED_WR_Byte( 0X8D, OLED_CMD ); //SET DCDC命令
  140. OLED_WR_Byte( 0X14, OLED_CMD ); //DCDC ON
  141. OLED_WR_Byte( 0XAF, OLED_CMD ); //DISPLAY ON
  142. }
  143. //关闭OLED显示
  144. void OLED_Display_Off( void )
  145. {
  146. OLED_WR_Byte( 0X8D, OLED_CMD ); //SET DCDC命令
  147. OLED_WR_Byte( 0X10, OLED_CMD ); //DCDC OFF
  148. OLED_WR_Byte( 0XAE, OLED_CMD ); //DISPLAY OFF
  149. }
  150. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
  151. void OLED_Clear( void )
  152. {
  153. u8 i, n;
  154. for( i = 0; i < 4; i++ )
  155. {
  156. OLED_WR_Byte( 0xb0 + i, OLED_CMD ); //设置页地址(0~7)
  157. OLED_WR_Byte( 0x00, OLED_CMD ); //设置显示位置—列低地址
  158. OLED_WR_Byte( 0x10, OLED_CMD ); //设置显示位置—列高地址
  159. for( n = 0; n < 128; n++ )
  160. {
  161. OLED_WR_Byte( 0, OLED_DATA );
  162. }
  163. } //更新显示
  164. }
  165. //在指定位置显示一个字符,包括部分字符
  166. //x:0~127
  167. //y:0~63
  168. //sizey:选择字体 6x8 8x16
  169. void OLED_ShowChar( u8 x, u8 y, u8 chr, u8 sizey )
  170. {
  171. u8 c = 0, sizex = sizey / 2;
  172. u16 i = 0, size1;
  173. if( sizey == 8 )
  174. {
  175. size1 = 6;
  176. }
  177. else
  178. {
  179. size1 = ( sizey / 8 + ( ( sizey % 8 ) ? 1 : 0 ) ) * ( sizey / 2 );
  180. }
  181. c = chr - ' '; //得到偏移后的值
  182. OLED_Set_Pos( x, y );
  183. for( i = 0; i < size1; i++ )
  184. {
  185. if( i % sizex == 0 && sizey != 8 )
  186. {
  187. OLED_Set_Pos( x, y++ );
  188. }
  189. if( sizey == 8 )
  190. {
  191. OLED_WR_Byte( asc2_0806[c][i], OLED_DATA ); //6X8字号
  192. }
  193. else if( sizey == 16 )
  194. {
  195. OLED_WR_Byte( asc2_1608[c][i], OLED_DATA ); //8x16字号
  196. }
  197. // else if(sizey==xx) OLED_WR_Byte(asc2_xxxx[c][i],OLED_DATA);//用户添加字号
  198. else
  199. {
  200. return;
  201. }
  202. }
  203. }
  204. //m^n函数
  205. u32 oled_pow( u8 m, u8 n )
  206. {
  207. u32 result = 1;
  208. while( n-- )
  209. {
  210. result *= m;
  211. }
  212. return result;
  213. }
  214. //显示数字
  215. //x,y :起点坐标
  216. //num:要显示的数字
  217. //len :数字的位数
  218. //sizey:字体大小
  219. void OLED_ShowNum( u8 x, u8 y, u32 num, u8 len, u8 sizey )
  220. {
  221. u8 t, temp, m = 0;
  222. u8 enshow = 0;
  223. if( sizey == 8 )
  224. {
  225. m = 2;
  226. }
  227. for( t = 0; t < len; t++ )
  228. {
  229. temp = ( num / oled_pow( 10, len - t - 1 ) ) % 10;
  230. if( enshow == 0 && t < ( len - 1 ) )
  231. {
  232. if( temp == 0 )
  233. {
  234. OLED_ShowChar( x + ( sizey / 2 + m )*t, y, ' ', sizey );
  235. continue;
  236. }
  237. else
  238. {
  239. enshow = 1;
  240. }
  241. }
  242. OLED_ShowChar( x + ( sizey / 2 + m )*t, y, temp + '0', sizey );
  243. }
  244. }
  245. //显示一个字符号串
  246. void OLED_ShowString( u8 x, u8 y, u8* chr, u8 sizey )
  247. {
  248. u8 j = 0;
  249. while( chr[j] != '\0' )
  250. {
  251. OLED_ShowChar( x, y, chr[j++], sizey );
  252. if( sizey == 8 )
  253. {
  254. x += 6;
  255. }
  256. else
  257. {
  258. x += sizey / 2;
  259. }
  260. }
  261. }
  262. //显示汉字
  263. void OLED_ShowChinese( u8 x, u8 y, u8 *temp, u8 sizey )
  264. {
  265. u16 i, size1 = ( sizey / 8 + ( ( sizey % 8 ) ? 1 : 0 ) ) * sizey;
  266. for( i = 0; i < size1; i++ )
  267. {
  268. if( i % sizey == 0 )
  269. {
  270. OLED_Set_Pos( x, y++ );
  271. }
  272. if( sizey == 16 )
  273. {
  274. OLED_WR_Byte( temp[i], OLED_DATA ); //16x16字号
  275. }
  276. // else if(sizey==xx) OLED_WR_Byte(xxx[c][i],OLED_DATA);//用户添加字号
  277. else
  278. {
  279. return;
  280. }
  281. }
  282. }
  283. //----------------------------------------------------------
  284. //显示一个gb2312汉字(从字库读数据)
  285. void OLED_ShowGB2312(unsigned char x,unsigned char y,unsigned char textH,unsigned char textL)
  286. {
  287. unsigned char fontbuf[32];
  288. S1Y_gt16_GetData(textH,textL,fontbuf);
  289. OLED_ShowChinese( x, y, fontbuf, 16 );
  290. // OLED_Set_Pos(x,y);
  291. // for(t=0;t<16;t++)
  292. // OLED_WR_Byte(fontbuf[t],OLED_DATA);
  293. // OLED_Set_Pos(x,y+1);
  294. // for(t=0;t<16;t++)
  295. // OLED_WR_Byte(fontbuf[t+16],OLED_DATA);
  296. }
  297. void OLED_ShowStr(unsigned char x,unsigned char y,unsigned char* text)
  298. {
  299. unsigned char i=0;
  300. while((text[i]>0x00))
  301. {
  302. if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1))
  303. {
  304. OLED_ShowGB2312(x,y,text[i],text[i+1]);
  305. i+=2;
  306. x+=16;
  307. }
  308. else if((text[i]>=0x20) && (text[i]<=0x7e))
  309. {
  310. //OLED_ShowASCII(x,y,text[i]);
  311. i+=1;
  312. x+=8;
  313. }
  314. else
  315. i++;
  316. }
  317. }
  318. //--------------------------------------------------------------------
  319. //显示图片
  320. //x,y显示坐标
  321. //sizex,sizey,图片长宽
  322. //BMP:要显示的图片
  323. void OLED_DrawBMP( u8 x, u8 y, u8 sizex, u8 sizey, u8 BMP[] )
  324. {
  325. u16 j = 0;
  326. u8 i, m;
  327. sizey = sizey / 8 + ( ( sizey % 8 ) ? 1 : 0 );
  328. for( i = 0; i < sizey; i++ )
  329. {
  330. OLED_Set_Pos( x, i + y );
  331. for( m = 0; m < sizex; m++ )
  332. {
  333. OLED_WR_Byte( BMP[j++], OLED_DATA );
  334. }
  335. }
  336. }
  337. //初始化
  338. void OLED_Init( void )
  339. {
  340. GPIO_Init( OLED_PORT,OLED_SCL,GPIO_Mode_Out_PP_High_Fast );
  341. GPIO_Init( OLED_PORT,OLED_SDA,GPIO_Mode_Out_PP_High_Fast );
  342. OLED_WR_Byte( 0xAE, OLED_CMD ); /*display off*/
  343. OLED_WR_Byte( 0x00, OLED_CMD ); /*set lower column address*/
  344. OLED_WR_Byte( 0x10, OLED_CMD ); /*set higher column address*/
  345. OLED_WR_Byte( 0x00, OLED_CMD ); /*set display start line*/
  346. OLED_WR_Byte( 0xB0, OLED_CMD ); /*set page address*/
  347. OLED_WR_Byte( 0x81, OLED_CMD ); /*contract control*/
  348. OLED_WR_Byte( 0xff, OLED_CMD ); /*128*/
  349. OLED_WR_Byte( 0xA1, OLED_CMD ); /*set segment remap*/
  350. OLED_WR_Byte( 0xA6, OLED_CMD ); /*normal / reverse*/
  351. OLED_WR_Byte( 0xA8, OLED_CMD ); /*multiplex ratio*/
  352. OLED_WR_Byte( 0x1F, OLED_CMD ); /*duty = 1/32*/
  353. OLED_WR_Byte( 0xC8, OLED_CMD ); /*Com scan direction*/
  354. OLED_WR_Byte( 0xD3, OLED_CMD ); /*set display offset*/
  355. OLED_WR_Byte( 0x00, OLED_CMD );
  356. OLED_WR_Byte( 0xD5, OLED_CMD ); /*set osc division*/
  357. OLED_WR_Byte( 0x80, OLED_CMD );
  358. OLED_WR_Byte( 0xD9, OLED_CMD ); /*set pre-charge period*/
  359. OLED_WR_Byte( 0x1f, OLED_CMD );
  360. OLED_WR_Byte( 0xDA, OLED_CMD ); /*set COM pins*/
  361. OLED_WR_Byte( 0x00, OLED_CMD );
  362. OLED_WR_Byte( 0xdb, OLED_CMD ); /*set vcomh*/
  363. OLED_WR_Byte( 0x40, OLED_CMD );
  364. OLED_WR_Byte( 0x8d, OLED_CMD ); /*set charge pump enable*/
  365. OLED_WR_Byte( 0x14, OLED_CMD );
  366. OLED_Clear();
  367. OLED_WR_Byte( 0xAF, OLED_CMD ); /*display ON*/
  368. }
  369. //-----------------------------------分割线------------------------------------------
  370. // .h文件
  371. #ifndef __OLED_H
  372. #define __OLED_H
  373. #include "stm8l15x.h"//STM8L051/151等系列共用库函数
  374. #define u8 unsigned char
  375. #define u16 unsigned int
  376. #define u32 unsigned int
  377. #define OLED_CMD 0//写命令
  378. #define OLED_DATA 1//写数据
  379. #define OLED_PORT GPIOC//SCL
  380. 老板子线:
  381. //#define OLED_SCL GPIO_Pin_1//SCL
  382. //#define OLED_SDA GPIO_Pin_0//SDA
  383. // 新板子线:
  384. #define OLED_SCL GPIO_Pin_0//SCL
  385. #define OLED_SDA GPIO_Pin_1//SDA
  386. //-----------------OLED端口定义----------------
  387. #define OLED_SCL_Clr() GPIO_ResetBits(OLED_PORT, OLED_SCL)//SCL IIC接口的数据信号
  388. #define OLED_SCL_Set() GPIO_SetBits(OLED_PORT, OLED_SCL)
  389. #define OLED_SDA_Clr() GPIO_ResetBits(OLED_PORT, OLED_SDA )//SDA IIC接口的时钟信号
  390. #define OLED_SDA_Set() GPIO_SetBits(OLED_PORT, OLED_SDA )
  391. //--------------------------------------------------
  392. //OLED控制用函数
  393. void delay_ms(unsigned int ms);
  394. void OLED_ColorTurn(u8 i);
  395. void OLED_DisplayTurn(u8 i);
  396. void OLED_WR_Byte(u8 dat,u8 cmd);
  397. void OLED_Set_Pos(u8 x, u8 y);
  398. void OLED_Display_On(void);
  399. void OLED_Display_Off(void);
  400. void OLED_Clear(void);
  401. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 sizey);
  402. u32 oled_pow(u8 m,u8 n);
  403. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 sizey);
  404. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 sizey);
  405. //void OLED_ShowChinese(u8 x,u8 y,u8 no,u8 sizey);
  406. void OLED_ShowChinese( u8 x, u8 y, u8 *temp, u8 sizey );
  407. void OLED_DrawBMP(u8 x,u8 y,u8 sizex, u8 sizey,u8 BMP[]);
  408. void OLED_Init(void);
  409. void OLED_ShowStr(unsigned char x,unsigned char y,unsigned char* text);
  410. #endif

最后是调用过程伪代码:

  1. // 调用显示任意汉字字符串伪代码段
  2. void main(void)
  3. {
  4. if(key.code == true)
  5. {
  6. OLED_Clear();
  7. OLED_ShowStr( 0, 0, tab[HZ] );// tab[]里面存放的是汉字字符串,例如:"华温冷链巴拉巴拉"
  8. Delay( 100 );
  9. }
  10. }

最后的最后,刚忙完,写博客的时候有点累,有任何不明白的地方,欢迎一起探讨 QQ741684134。PS:遇到很多网友找我聊很基础的单片机应用问题,请自行百度,因为实在很忙。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【新提醒】基于HC32L110开发板的OLED屏显示
【单片机笔记】OLED控制器SSD1306及驱动代码
OLED SH1106通过I2C显示
06 洋桃开发板笔记(六 ) STM32自带的Flash闪存使用,主要配合其他外设
【青风带你学stm32f051系列教程】第13课 通过SPI读写SD卡 | 爱板网
关于SPI调节数字电位器MCP41010 求大家帮忙分析下程序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服