乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      高通字庫芯片GT20L16S1Y驅(qū)動(dòng) 0.96寸 OLED 任意顯示中文

       rookie 2021-05-14

      連續(xù)兩個(gè)月的加班,給ODM客戶生產(chǎn)溫控器訂單,今天終于順利發(fā)貨,對(duì)于工程師出身的我,終于可以對(duì)著電腦,消停幾天,研究技術(shù),分享技術(shù)了,閑話少說,直接進(jìn)入正題:

      半年前有個(gè)老客戶介紹個(gè)中央某院的項(xiàng)目,我主業(yè)是做各種溫控器的,老客戶介紹的新客戶,沒法推脫,就干吧,項(xiàng)目需求具體細(xì)節(jié)不方便公開,說說本次要分享的部分,要實(shí)現(xiàn)的功能是一個(gè)OLED任意顯示一段中文句子

      項(xiàng)目的硬件組成比較簡單:STM8L051+ KEY + OLED + GT20L16S1Y

      軟件平臺(tái):IAR

      整個(gè)項(xiàng)目沒什么難點(diǎn),但沒做過這個(gè)的,也需要一番折騰,在這里,我把項(xiàng)目的主要代碼貼出來供電友們參考,也感謝之前版本的電友。做個(gè)靠譜的電友,除了分享單獨(dú)的.c.h驅(qū)動(dòng)文件,最后還會(huì)有調(diào)用偽代碼,也就是整個(gè)代碼的調(diào)用過程。

      一:高通字庫芯片驅(qū)動(dòng)程序:

      1. // .c文件
      2. #include "stm8l15x.h"http://STM8L051/151等系列共用庫函數(shù)
      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 調(diào)用
      21. ASCIICode:表示ASCII 碼(8bits)
      22. BaseAdd:說明該套字庫在芯片中的起始地址。
      23. r_dat_bat: 是讀點(diǎn)陣數(shù)據(jù)函數(shù)。
      24. DZ_Data:是保存讀出的點(diǎn)陣數(shù)據(jù)的數(shù)組。
      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 點(diǎn)GB2312 標(biāo)準(zhǔn)點(diǎn)陣字庫
      62. 參數(shù)說明:
      63. GBCode表示漢字內(nèi)碼。
      64. MSB 表示漢字內(nèi)碼GBCode 的高8bits。
      65. LSB 表示漢字內(nèi)碼GBCode 的低8bits。
      66. Address 表示漢字或ASCII字符點(diǎn)陣在芯片中的字節(jié)地址。
      67. BaseAdd:說明點(diǎn)陣數(shù)據(jù)在字庫芯片中的起始地址。
      68. r_dat_bat 是讀點(diǎn)陣數(shù)據(jù)函數(shù)。
      69. DZ_Data是保存讀出的點(diǎn)陣數(shù)據(jù)的數(shù)組。
      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 點(diǎn)國標(biāo)擴(kuò)展字符
      92. 說明:
      93. BaseAdd:說明本套字庫在字庫芯片中的起始字節(jié)地址。
      94. FontCode:表示字符內(nèi)碼(16bits).
      95. Address:表示字符點(diǎn)陣在芯片中的字節(jié)地址。
      96. r_dat_bat 是讀點(diǎn)陣數(shù)據(jù)函數(shù)。
      97. DZ_Data是保存讀出的點(diǎn)陣數(shù)據(jù)的數(shù)組。
      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. 從字庫中讀數(shù)據(jù)函數(shù)
      116. 說明:
      117. Address : 表示字符點(diǎn)陣在芯片中的字節(jié)地址。
      118. byte_long: 是讀點(diǎn)陣數(shù)據(jù)字節(jié)數(shù)。
      119. *p_arr : 是保存讀出的點(diǎn)陣數(shù)據(jù)的數(shù)組。
      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顯示就比較簡單了,顯示任意漢字字符串,也折騰了我?guī)赘^發(fā),下面也貼出來分享一下:

      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. //反顯函數(shù)
      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. //屏幕旋轉(zhuǎn)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 ); //反轉(zhuǎn)顯示
      49. OLED_WR_Byte( 0xA0, OLED_CMD );
      50. }
      51. }
      52. //延時(shí)
      53. void IIC_delay( void )
      54. {
      55. u8 t = 1;
      56. while( t-- );
      57. }
      58. //起始信號(hào)
      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. //結(jié)束信號(hào)
      69. void I2C_Stop( void )
      70. {
      71. OLED_SDA_Clr();
      72. OLED_SCL_Set();
      73. IIC_delay();
      74. OLED_SDA_Set();
      75. }
      76. //等待信號(hào)響應(yīng)
      77. void I2C_WaitAck( void ) //測數(shù)據(jù)信號(hào)的電平
      78. {
      79. OLED_SDA_Set();
      80. IIC_delay();
      81. OLED_SCL_Set();
      82. IIC_delay();
      83. OLED_SCL_Clr();
      84. IIC_delay();
      85. }
      86. //寫入一個(gè)字節(jié)
      87. void Send_Byte( u8 dat )
      88. {
      89. u8 i;
      90. for( i = 0; i < 8; i++ )
      91. {
      92. OLED_SCL_Clr();//將時(shí)鐘信號(hào)設(shè)置為低電平
      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. //發(fā)送一個(gè)字節(jié)
      109. //向SSD1306寫入一個(gè)字節(jié)。
      110. //mode:數(shù)據(jù)/命令標(biāo)志 0,表示命令;1,表示數(shù)據(jù);
      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. //坐標(biāo)設(shè)置
      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. //關(guān)閉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. //清屏函數(shù),清完屏,整個(gè)屏幕是黑色的!和沒點(diǎn)亮一樣!!!
      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 ); //設(shè)置頁地址(0~7)
      157. OLED_WR_Byte( 0x00, OLED_CMD ); //設(shè)置顯示位置—列低地址
      158. OLED_WR_Byte( 0x10, OLED_CMD ); //設(shè)置顯示位置—列高地址
      159. for( n = 0; n < 128; n++ )
      160. {
      161. OLED_WR_Byte( 0, OLED_DATA );
      162. }
      163. } //更新顯示
      164. }
      165. //在指定位置顯示一個(gè)字符,包括部分字符
      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字號(hào)
      192. }
      193. else if( sizey == 16 )
      194. {
      195. OLED_WR_Byte( asc2_1608[c][i], OLED_DATA ); //8x16字號(hào)
      196. }
      197. // else if(sizey==xx) OLED_WR_Byte(asc2_xxxx[c][i],OLED_DATA);//用戶添加字號(hào)
      198. else
      199. {
      200. return;
      201. }
      202. }
      203. }
      204. //m^n函數(shù)
      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. //顯示數(shù)字
      215. //x,y :起點(diǎn)坐標(biāo)
      216. //num:要顯示的數(shù)字
      217. //len :數(shù)字的位數(shù)
      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. //顯示一個(gè)字符號(hào)串
      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字號(hào)
      275. }
      276. // else if(sizey==xx) OLED_WR_Byte(xxx[c][i],OLED_DATA);//用戶添加字號(hào)
      277. else
      278. {
      279. return;
      280. }
      281. }
      282. }
      283. //----------------------------------------------------------
      284. //顯示一個(gè)gb2312漢字(從字庫讀數(shù)據(jù))
      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顯示坐標(biāo)
      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"http://STM8L051/151等系列共用庫函數(shù)
      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//寫數(shù)據(jù)
      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接口的數(shù)據(jù)信號(hào)
      388. #define OLED_SCL_Set() GPIO_SetBits(OLED_PORT, OLED_SCL)
      389. #define OLED_SDA_Clr() GPIO_ResetBits(OLED_PORT, OLED_SDA )//SDA IIC接口的時(shí)鐘信號(hào)
      390. #define OLED_SDA_Set() GPIO_SetBits(OLED_PORT, OLED_SDA )
      391. //--------------------------------------------------
      392. //OLED控制用函數(shù)
      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

      最后是調(diào)用過程偽代碼:

      1. // 調(diào)用顯示任意漢字字符串偽代碼段
      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. }

      最后的最后,剛忙完,寫博客的時(shí)候有點(diǎn)累,有任何不明白的地方,歡迎一起探討 QQ741684134。PS:遇到很多網(wǎng)友找我聊很基礎(chǔ)的單片機(jī)應(yīng)用問題,請(qǐng)自行百度,因?yàn)閷?shí)在很忙。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多