野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10505|回复: 6

求火哥的IIC 接口的OLED显示屏显示数字的程序

[复制链接]
发表于 2017-3-31 23:54:48 | 显示全部楼层 |阅读模式
求火哥的IIC 接口的OLED显示屏显示数字的程序,数字大小是8*16的,求程序
回复

使用道具 举报

发表于 2017-4-1 08:51:43 | 显示全部楼层



野火【OLED-IIC-黄蓝双色0.96寸】OLED屏幕模块资料

注意,本资料配套的是 IIC 通讯协议的OLED屏

百度网盘 下载链接:http://pan.baidu.com/s/1nvO06HN
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-4-1 13:26:07 | 显示全部楼层
fire 发表于 2017-4-1 08:51
野火【OLED-IIC-黄蓝双色0.96寸】OLED屏幕模块资料

注意,本资料配套的是 IIC 通讯协议的OLED屏

火哥,这个只有现实字符串的,没有显示数字的啊,我要的是能显示8*16那么大的数字的程序,谢谢啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-1 13:37:26 | 显示全部楼层
fire 发表于 2017-4-1 08:51
野火【OLED-IIC-黄蓝双色0.96寸】OLED屏幕模块资料

注意,本资料配套的是 IIC 通讯协议的OLED屏
  1. /**
  2.   * @brief   128*64点阵的OLED显示屏驱动文件,仅适用于SD1306驱动IIC通信方式显示屏
  3.        
  4.         * Function List:
  5.         *  1. void I2C_Configuration(void) -- 配置CPU的硬件I2C
  6.         * 2. void I2C_WriteByte(uint8_t addr,uint8_t data) -- 向寄存器地址写一个byte的数据
  7.         * 3. void WriteCmd(unsigned char I2C_Command) -- 写命令
  8.         * 4. void WriteDat(unsigned char I2C_Data) -- 写数据
  9.         * 5. void OLED_Init(void) -- OLED屏初始化
  10.         * 6. void OLED_SetPos(unsigned char x, unsigned char y) -- 设置起始点坐标
  11.         * 7. void OLED_Fill(unsigned char fill_Data) -- 全屏填充
  12.         * 8. void OLED_CLS(void) -- 清屏
  13.         * 9. void OLED_ON(void) -- 唤醒
  14.         * 10. void OLED_OFF(void) -- 睡眠
  15.         * 11. void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize) -- 显示字符串(字体大小有6*8和8*16两种)
  16.         * 12. void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N) -- 显示中文(中文需要先取模,然后放到codetab.h中)
  17.         * 13. void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]) -- BMP图片
  18.         *
  19.   *
  20.   ******************************************************************************
  21.   */


  22. #include "oled.h"
  23. #include "delay.h"
  24. #include "codetab.h"

  25. //I2C_Configuration,初始化硬件IIC1引脚
  26. void I2C_Configuration(void)
  27. {
  28.         I2C_InitTypeDef   I2C_InitStructure;
  29.         GPIO_InitTypeDef  GPIO_InitStructure;

  30.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
  31.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  32.         /*STM32F103C8T6芯片的硬件I2C: PB6 -- SCL; PB7 -- SDA */
  33.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  35.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C必须开漏输出
  36.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  37.         I2C_DeInit(I2C1);//使用I2C1
  38.         I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  39.         I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  40.         I2C_InitStructure.I2C_OwnAddress1 = 0x30;//主机的I2C地址,随便写的
  41.         I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  42.         I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  43.         I2C_InitStructure.I2C_ClockSpeed = 400000;//400K

  44.         I2C_Cmd(I2C1, ENABLE);
  45.         I2C_Init(I2C1, &I2C_InitStructure);
  46. }


  47. /**
  48.   * @brief  I2C_WriteByte,向OLED寄存器地址写一个byte的数据
  49.   * @param  addr:寄存器地址
  50.   *                        data:要写入的数据

  51.   */
  52. void I2C_WriteByte(uint8_t addr,uint8_t data)
  53. {
  54.   while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
  55.        
  56.         I2C_GenerateSTART(I2C1, ENABLE);//开启I2C1
  57.         while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

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

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

  62.         I2C_SendData(I2C1, data);//发送数据
  63.         while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  64.        
  65.         I2C_GenerateSTOP(I2C1, ENABLE);//关闭I2C1总线
  66. }


  67. /**
  68.   * @brief  WriteCmd,向OLED写入命令
  69.   * @param  I2C_Command:命令代码
  70.   * @retval 无
  71.   */
  72. void WriteCmd(unsigned char I2C_Command)//写命令
  73. {
  74.         I2C_WriteByte(0x00, I2C_Command);
  75. }


  76. /**
  77.   * @brief  WriteDat,向OLED写入数据
  78.   * @param  I2C_Data:数据
  79.   * @retval 无
  80.   */
  81. void WriteDat(unsigned char I2C_Data)//写数据
  82. {
  83.         I2C_WriteByte(0x40, I2C_Data);
  84. }


  85. /**
  86.   * @brief  OLED_Init,初始化OLED
  87.   * @param  无
  88.   * @retval 无
  89.   */
  90. void OLED_Init(void)
  91. {
  92.         delay_ms(100); //这里的延时很重要
  93.        
  94.         WriteCmd(0xAE); //display off
  95.         WriteCmd(0x20);        //Set Memory Addressing Mode       
  96.         WriteCmd(0x10);        //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
  97.         WriteCmd(0xb0);        //Set Page Start Address for Page Addressing Mode,0-7
  98.         WriteCmd(0xc8);        //Set COM Output Scan Direction
  99.         WriteCmd(0x00); //---set low column address
  100.         WriteCmd(0x10); //---set high column address
  101.         WriteCmd(0x40); //--set start line address
  102.         WriteCmd(0x81); //--set contrast control register
  103.         WriteCmd(0xff); //亮度调节 0x00~0xff
  104.         WriteCmd(0xa1); //--set segment re-map 0 to 127
  105.         WriteCmd(0xa6); //--set normal display
  106.         WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
  107.         WriteCmd(0x3F); //
  108.         WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  109.         WriteCmd(0xd3); //-set display offset
  110.         WriteCmd(0x00); //-not offset
  111.         WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
  112.         WriteCmd(0xf0); //--set divide ratio
  113.         WriteCmd(0xd9); //--set pre-charge period
  114.         WriteCmd(0x22); //
  115.         WriteCmd(0xda); //--set com pins hardware configuration
  116.         WriteCmd(0x12);
  117.         WriteCmd(0xdb); //--set vcomh
  118.         WriteCmd(0x20); //0x20,0.77xVcc
  119.         WriteCmd(0x8d); //--set DC-DC enable
  120.         WriteCmd(0x14); //
  121.         WriteCmd(0xaf); //--turn on oled panel
  122. }


  123. /**
  124.   * @brief  OLED_SetPos,设置光标
  125.   * @param  x,光标x位置
  126.         *                y,光标y位置
  127.   * @retval 无
  128.   */
  129. void OLED_SetPos(unsigned char x, unsigned char y) //设置起始点坐标
  130. {
  131.         WriteCmd(0xb0+y);
  132.         WriteCmd(((x&0xf0)>>4)|0x10);
  133.         WriteCmd((x&0x0f)|0x01);
  134. }

  135. /**
  136.   * @brief  OLED_Fill,填充整个屏幕
  137.   * @param  fill_Data:要填充的数据
  138.   * @retval 无
  139.   */
  140. void OLED_Fill(unsigned char fill_Data)//全屏填充
  141. {
  142.         unsigned char m,n;
  143.         for(m=0;m<8;m++)
  144.         {
  145.                 WriteCmd(0xb0+m);                //page0-page1
  146.                 WriteCmd(0x00);                //low column start address
  147.                 WriteCmd(0x10);                //high column start address
  148.                 for(n=0;n<128;n++)
  149.                         {
  150.                                 WriteDat(fill_Data);
  151.                         }
  152.         }
  153. }

  154. /**
  155.   * @brief  OLED_CLS,清屏
  156.   * @param  无
  157.         * @retval 无
  158.   */
  159. void OLED_CLS(void)//清屏
  160. {
  161.         OLED_Fill(0x00);
  162. }


  163. /**
  164.   * @brief  OLED_ON,将OLED从休眠中唤醒
  165.   * @param  无
  166.         * @retval 无
  167.   */
  168. void OLED_ON(void)
  169. {
  170.         WriteCmd(0X8D);  //设置电荷泵
  171.         WriteCmd(0X14);  //开启电荷泵
  172.         WriteCmd(0XAF);  //OLED唤醒
  173. }


  174. /**
  175.   * @brief  OLED_OFF,让OLED休眠 -- 休眠模式下,OLED功耗不到10uA
  176.   * @param  无
  177.         * @retval 无
  178.   */
  179. void OLED_OFF(void)
  180. {
  181.         WriteCmd(0X8D);  //设置电荷泵
  182.         WriteCmd(0X10);  //关闭电荷泵
  183.         WriteCmd(0XAE);  //OLED休眠
  184. }


  185. /**
  186.   * @brief  OLED_ShowStr,显示codetab.h中的ASCII字符,有6*8和8*16可选择
  187.   * @param  x,y : 起始点坐标(x:0~127, y:0~7);
  188.         *                                        ch[] :- 要显示的字符串;
  189.         *                                        TextSize : 字符大小(1:6*8 ; 2:8*16)
  190.         * @retval 无
  191.   */
  192. void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
  193. {
  194.         unsigned char c = 0,i = 0,j = 0;
  195.         switch(TextSize)
  196.         {
  197.                 case 1:
  198.                 {
  199.                         while(ch[j] != '\0')
  200.                         {
  201.                                 c = ch[j] - 32;
  202.                                 if(x > 126)
  203.                                 {
  204.                                         x = 0;
  205.                                         y++;
  206.                                 }
  207.                                 OLED_SetPos(x,y);
  208.                                 for(i=0;i<6;i++)
  209.                                         WriteDat(F6x8[c][i]);
  210.                                 x += 6;
  211.                                 j++;
  212.                         }
  213.                 }break;
  214.                 case 2:
  215.                 {
  216.                         while(ch[j] != '\0')
  217.                         {
  218.                                 c = ch[j] - 32;
  219.                                 if(x > 120)
  220.                                 {
  221.                                         x = 0;
  222.                                         y++;
  223.                                 }
  224.                                 OLED_SetPos(x,y);
  225.                                 for(i=0;i<8;i++)
  226.                                         WriteDat(F8X16[c*16+i]);
  227.                                 OLED_SetPos(x,y+1);
  228.                                 for(i=0;i<8;i++)
  229.                                         WriteDat(F8X16[c*16+i+8]);
  230.                                 x += 8;
  231.                                 j++;
  232.                         }
  233.                 }break;
  234.         }
  235. }

  236. /**
  237.   * @brief  OLED_ShowCN,显示codetab.h中的汉字,16*16点阵
  238.   * @param  x,y: 起始点坐标(x:0~127, y:0~7);
  239.         *                                        N:汉字在codetab.h中的索引
  240.         * @retval 无
  241.   */
  242. void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
  243. {
  244.         unsigned char wm=0;
  245.         unsigned int  adder=32*N;
  246.         OLED_SetPos(x , y);
  247.         for(wm = 0;wm < 16;wm++)
  248.         {
  249.                 WriteDat(F16x16[adder]);
  250.                 adder += 1;
  251.         }
  252.         OLED_SetPos(x,y + 1);
  253.         for(wm = 0;wm < 16;wm++)
  254.         {
  255.                 WriteDat(F16x16[adder]);
  256.                 adder += 1;
  257.         }
  258. }



  259. /**
  260.   * @brief  OLED_DrawBMP,显示BMP位图
  261.   * @param  x0,y0 :起始点坐标(x0:0~127, y0:0~7);
  262.         *                                        x1,y1 : 起点对角线(结束点)的坐标(x1:1~128,y1:1~8)
  263.         * @retval 无
  264.   */
  265. void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
  266. {
  267.         unsigned int j=0;
  268.         unsigned char x,y;

  269.   if(y1%8==0)
  270.                 y = y1/8;
  271.   else
  272.                 y = y1/8 + 1;
  273.         for(y=y0;y<y1;y++)
  274.         {
  275.                 OLED_SetPos(x0,y);
  276.     for(x=x0;x<x1;x++)
  277.                 {
  278.                         WriteDat(BMP[j++]);
  279.                 }
  280.         }
  281. }

  282. //显示数字
  283. /**
  284.   * @brief  OLED_ShowNum,显示codetab.h中的ASCII数字,有6*8和8*16可选择
  285.   * @param  x,y : 起始点坐标(x:0~127, y:0~7);
  286.         *                                        num : 要显示的整形数字;
  287.         *                                        TextSize : 字符大小(1:6*8 ; 2:8*16)
  288.         * @retval 无
  289.   */
  290. void OLED_ShowintNum(u8 x,u8 y,int32_t num,int32_t TextSize)
  291. {
  292.         unsigned char number[10];
  293.         unsigned char i,j,k,l;
  294.         unsigned char a,c;
  295.         int32_t b;
  296.        
  297.         if(num<0)       
  298.         {
  299.                 a=0;
  300.                 b=-num;
  301.         }
  302.         else
  303.         {
  304.                 a=1;
  305.                 b=num;
  306.         }               
  307.                
  308.         for(i=0;i<10;i++)
  309.         {
  310.                 number[i]=b%10;
  311.                 b=b/10;
  312.         }
  313.         for(j=1,i=10;i>0&&j<2;i--)
  314.         {
  315.                 j+=number[i-1];
  316.         }
  317.         k=i+1;
  318.         switch(TextSize)
  319.         {
  320.                 case 1:
  321.                 {
  322.                         if(a==0)//写符号
  323.                         {
  324.                                 OLED_SetPos(x,y);
  325.                                 for(l=0;l<6;l++)
  326.                                 {
  327.                                         WriteDat(F6x8[13][l]);
  328.                                 }
  329.                                 x+=6;
  330.                         }
  331.                         for(i=k;i>0;i--)
  332.                         {
  333.                                 c = number[i-1]+16;
  334.                                 if(x > 126)
  335.                                 {
  336.                                         x = 0;
  337.                                         y++;
  338.                                 }
  339.                                 OLED_SetPos(x,y);
  340.                                 for(l=0;l<6;l++)
  341.                                 {
  342.                                         WriteDat(F6x8[c][l]);
  343.                                 }
  344.                                 x += 6;
  345.                         }
  346.                         for(i=0;i<11-k;i++)
  347.                         {
  348.                                 if(x > 126)
  349.                                 {
  350.                                         x = 0;
  351.                                         y++;
  352.                                 }
  353.                                 OLED_SetPos(x,y);
  354.                                 for(l=0;l<6;l++)
  355.                                 {
  356.                                         WriteDat(F6x8[0][l]);
  357.                                 }
  358.                                 x += 6;
  359.                         }
  360.                 }break;
  361.                 case 2:
  362.                 {
  363.                         if(x > 120)
  364.                         {
  365.                                 x = 0;
  366.                                 y++;
  367.                         }
  368.                         if(a==0)//写符号
  369.                         {
  370.                                 OLED_SetPos(x,y);
  371.                                 for(l=0;l<8;l++)
  372.                                 WriteDat(F8X16[13*16+l]);
  373.                                 OLED_SetPos(x,y+1);
  374.                                 for(l=0;l<8;l++)
  375.                                         WriteDat(F8X16[13*16+l+8]);
  376.                                 x+=8;
  377.                         }
  378.                         for(i=k;i>0;i--)
  379.                         {
  380.                                 c = number[i-1]+16;
  381.                                 if(x > 120)
  382.                                 {
  383.                                         x = 0;
  384.                                         y++;
  385.                                 }
  386.                                 OLED_SetPos(x,y);
  387.                                 for(i=0;i<8;i++)
  388.                                         WriteDat(F8X16[c*16+i]);
  389.                                 OLED_SetPos(x,y+1);
  390.                                 for(i=0;i<8;i++)
  391.                                         WriteDat(F8X16[c*16+i+8]);
  392.                         }
  393.                         for(i=0;i<11-k;i++)
  394.                         {
  395.                                 c = number[i-1]+16;
  396.                                 if(x > 120)
  397.                                 {
  398.                                         x = 0;
  399.                                         y++;
  400.                                 }
  401.                                 OLED_SetPos(x,y);
  402.                                 for(i=0;i<8;i++)
  403.                                         WriteDat(F8X16[i]);
  404.                                 OLED_SetPos(x,y+1);
  405.                                 for(i=0;i<8;i++)
  406.                                         WriteDat(F8X16[i+8]);
  407.                         }
  408.                 }break;
  409.         }
  410. }
复制代码



这是我的显示数字的代码,显示6*8的可以,但是显示8*16就不能显示了,火哥,给看看
回复 支持 反对

使用道具 举报

发表于 2017-4-1 15:42:35 | 显示全部楼层
哈哈哈哈 发表于 2017-4-1 13:37
这是我的显示数字的代码,显示6*8的可以,但是显示8*16就不能显示了,火哥,给看看

可以使用这种方法,把数字格式化成字符串再显示

如何使用液晶显示整型、浮点型变量
http://www.firebbs.cn/forum.php? ... 2851&fromuid=64
(出处: 野火论坛)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-2 21:45:53 | 显示全部楼层
随风 发表于 2017-4-1 15:42
可以使用这种方法,把数字格式化成字符串再显示

如何使用液晶显示整型、浮点型变量

你给链接有问题,你试试?打开有问题
回复 支持 反对

使用道具 举报

发表于 2017-11-25 21:15:07 | 显示全部楼层
HAL 库版本, 根据火哥给的例程改编的



  1. //File oled.h

  2. #include "i2c.h"
  3. #include "stm32f407xx.h"

  4. /* defines */
  5. #define OLED_ADDR       0x78

  6. /* functions */
  7. void IIC_WriteByte(uint8_t addr, uint8_t data);
  8. void WriteCmd(uint8_t cmd);
  9. void WriteData(uint8_t data);
  10. void oledInit(void);
  11. void oledSetPos(uint8_t x, uint8_t y);    // set cursor
  12. void oledFill(uint8_t fillData);
  13. void oledClearScreen(void);               // clear screen
  14. void oledON(void);
  15. void oledOFF(void);
  16. void oledShowStr(uint8_t x, uint8_t y, uint8_t ch[], uint8_t size);
  17. void oledShowCN(uint8_t x, uint8_t y, uint8_t N);
  18. void oledDrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t BMP[]);





  19. // File oled.c

  20. #include "oled.h"
  21. #include "codetab.h"

  22. /*
  23. * brief : IIC_WriteByte. write a byte data to oled register
  24. * param :  addr        address of register
  25. *          data        the data will be write in
  26. * retval:  none
  27. */
  28. void IIC_WriteByte(uint8_t addr, uint8_t Data)
  29. {
  30.       uint8_t data[2];

  31.       data[0] = addr;
  32.       data[1] = Data;

  33.       HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDR, data, 2, 0xFFFF);
  34. }

  35. /*
  36. * brief : WriteCmd. write cmd to oled
  37. * param : cmd
  38. * retval: none
  39. */
  40. void WriteCmd(uint8_t cmd)
  41. {
  42.       IIC_WriteByte(0x00, cmd);
  43. }

  44. /*
  45. * brief : WriteData. write data to oled
  46. * param : data   the data will write to OLED
  47. * retval: none
  48. */
  49. void WriteData(uint8_t data)
  50. {
  51.       IIC_WriteByte(0x40, data);
  52. }

  53. /*
  54. * brief : oledInit. initialize OLED
  55. * param : none
  56. * retval: none
  57. */
  58. void oledInit(void)
  59. {
  60.       HAL_Delay(1000);

  61.       WriteCmd(0xAE);   //display off
  62.         WriteCmd(0x20);   //Set Memory Addressing Mode       
  63.         WriteCmd(0x10);   //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
  64.         WriteCmd(0xb0);   //Set Page Start Address for Page Addressing Mode,0-7
  65.         WriteCmd(0xc8);   //Set COM Output Scan Direction
  66.         WriteCmd(0x00);   //---set low column address
  67.         WriteCmd(0x10);   //---set high column address
  68.         WriteCmd(0x40);   //--set start line address
  69.         WriteCmd(0x81);   //--set contrast control register
  70.         WriteCmd(0xff);   //亮度调节 0x00~0xff
  71.         WriteCmd(0xa1);   //--set segment re-map 0 to 127
  72.         WriteCmd(0xa6);   //--set normal display
  73.         WriteCmd(0xa8);   //--set multiplex ratio(1 to 64)
  74.         WriteCmd(0x3F);   //
  75.         WriteCmd(0xa4);   //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  76.         WriteCmd(0xd3);   //-set display offset
  77.         WriteCmd(0x00);   //-not offset
  78.         WriteCmd(0xd5);   //--set display clock divide ratio/oscillator frequency
  79.         WriteCmd(0xf0);   //--set divide ratio
  80.         WriteCmd(0xd9);   //--set pre-charge period
  81.         WriteCmd(0x22);   //
  82.         WriteCmd(0xda);   //--set com pins hardware configuration
  83.         WriteCmd(0x12);
  84.         WriteCmd(0xdb);   //--set vcomh
  85.         WriteCmd(0x20);   //0x20,0.77xVcc
  86.         WriteCmd(0x8d);   //--set DC-DC enable
  87.         WriteCmd(0x14);   //
  88.         WriteCmd(0xaf);   //--turn on oled panel
  89. }

  90. /*
  91. * brief : oledSetpos.  set cursor
  92. * param :  x           cursor place of x
  93. *          y           cursor place of y
  94. * retval; none
  95. */
  96. void oledSetPos(uint8_t x, uint8_t y)
  97. {
  98.         WriteCmd(0xb0+y);
  99.         WriteCmd(((x&0xf0)>>4)|0x10);
  100.         WriteCmd((x&0x0f)|0x01);
  101. }

  102. /*
  103. * brief : oledFill.    fill the all screen
  104. * param : fillData     the data will fill in screen
  105. * retval: none
  106. */
  107. void oledFill(uint8_t fillData)
  108. {
  109.       uint8_t m,n;

  110.       for(m = 0; m < 8; m++)
  111.       {
  112.             WriteCmd(0xB0 + m);     // page0-page1
  113.             WriteCmd(0x00);         // low column start address
  114.             WriteCmd(0x10);         // high column start address

  115.             for(n = 0; n < 128; n++)
  116.             {
  117.                   WriteData(fillData);
  118.             }
  119.       }
  120. }

  121. /*
  122. * brief : void oledClearScreen. clear screen
  123. * param : none
  124. * retval: none
  125. */
  126. void oledClearScreen(void)
  127. {
  128.       oledFill(0x00);
  129. }

  130. /*
  131. * brief : oledON       Open OLED screen
  132. * param : none
  133. * retval: none
  134. */
  135. void oledON(void)
  136. {
  137.       WriteCmd(0x8D);   // 设置电荷泵
  138.       WriteCmd(0x14);   // 开启电荷泵
  139.       WriteCmd(0xAF);   // OLED wake up
  140. }

  141. /*
  142. * brief : oledOFF      let oled sleep -- under the sleep mode, the power of oled is only 10uA
  143. * param : none
  144. * retval: none  
  145. */
  146. void oledOFF(void)
  147. {
  148.       WriteCmd(0x8D);   // 设置电荷泵
  149.       WriteCmd(0x10);   // 关闭电荷泵
  150.       WriteCmd(0xAE);   // let OLED sleep
  151. }

  152. /**
  153.   * @brief  OLED_ShowStr,显示codetab.h中的ASCII字符,有6*8和8*16可选择
  154.   * @param  x,y : 起始点坐标(x:0~127, y:0~7);
  155.         *                                        ch[] :- 要显示的字符串;
  156.         *                                        TextSize : 字符大小(1:6*8 ; 2:8*16)
  157.         * @retval 无
  158.   */
  159. void oledShowStr(uint8_t x, uint8_t y, uint8_t ch[], uint8_t size)
  160. {
  161.       uint8_t c = 0, i = 0, j = 0;

  162.       switch(size)
  163.       {
  164.             case 1:
  165.             {
  166.                   while(ch[j] != '\0')
  167.                   {
  168.                         c = ch[j] - 32;
  169.                         if(x > 126)
  170.                         {
  171.                               x = 0;
  172.                               y++;
  173.                         }
  174.                         oledSetPos(x, y);
  175.                         for(i = 0; i < 6; i++)
  176.                         {
  177.                               WriteData(F6x8[c][i]);
  178.                         }
  179.                         x += 6;
  180.                         j++;
  181.                   }
  182.             }break;

  183.             case 2:
  184.             {
  185.                   while(ch[j] != '\0')
  186.                   {
  187.                         c = ch[j] -32;
  188.                         if(x > 120)
  189.                         {
  190.                               x = 0;
  191.                               y++;
  192.                         }
  193.                         oledSetPos(x,y);
  194.                         for(i = 0; i < 8; i++)
  195.                         {
  196.                               WriteData(F8X16[c*16+i]);
  197.                         }
  198.                         oledSetPos(x, y+1);
  199.                         for(i = 0; i < 8; i++)
  200.                         {
  201.                               WriteData(F8X16[c*16+i+8]);
  202.                         }
  203.                         x += 8;
  204.                         j++;
  205.                   }
  206.             }break;

  207.       }
  208. }

  209. /**
  210.   * @brief  OLED_ShowCN,显示codetab.h中的汉字,16*16点阵
  211.   * @param  x,y: 起始点坐标(x:0~127, y:0~7);
  212.         *                                        N:汉字在codetab.h中的索引
  213.         * @retval 无
  214.   */
  215. void oledShowCN(uint8_t x, uint8_t y, uint8_t N)
  216. {
  217.       uint8_t wm = 0;
  218.       uint16_t adder = 32*N;

  219.       oledSetPos(x,y);

  220.       for(wm = 0; wm < 16; wm++)
  221.       {
  222.             WriteData(F16x16[adder]);
  223.             adder += 1;
  224.       }

  225.       oledSetPos(x, y+1);

  226.       for(wm = 0; wm < 16; wm++)
  227.       {
  228.             WriteData(F16x16[adder]);
  229.             adder += 1;
  230.       }
  231. }

  232. /**
  233.   * @brief  OLED_DrawBMP,显示BMP位图
  234.   * @param  x0,y0 : 起始点坐标(x0:0~127, y0:0~7);
  235.   *              x1,y1 : 起点对角线(结束点)的坐标(x1:1~128,y1:1~8)
  236.   * @retval 无
  237.   */
  238. void oledDrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t BMP[])
  239. {
  240.       uint16_t j = 0;
  241.       uint8_t x,y;

  242.       if(y1 % 8 == 0)
  243.       {
  244.             y = y1 / 8;
  245.       }
  246.       else
  247.       {
  248.             y = y1 / 8 + 1;
  249.       }

  250.       for(y = y0; y < y1; y++)
  251.       {
  252.             oledSetPos(x0, y);
  253.             for(x = x0; x < x1; x++)
  254.             {
  255.                   WriteData(BMP[j++]);
  256.             }
  257.       }
  258. }






复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 08:13 , Processed in 0.041070 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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