一、OLED简介
OLED是开发时常用的显示器件,这里介绍的是0.96寸的四针脚OLED,IIC控制。
OLED图片
二、数据手册分析
2.1 供电电压
供电电压介绍
供电电压在3V~5V,用3.3V即可。
2.2 引脚定义
OLED引脚定义
2.3 原理图介绍
OLED原理图
I2C通信接口由从地址位DC、I2C总线数据信号SDA(输出SDAOUT/D2输出,SDAIN/D1输入)和I2C总线时钟信号SCL(D0)组成。数据信号和时钟信号都必须连接到上拉电阻器上。
从属地址位(SA0)必须在通过I2C总线传输或接收任何信息之前,先识别该从属地址。设备将响应从地址,后面是从地址位(“SA0”位)和读/写选择位(“R/W#”,具有以下字节格式的位)
字节格式
“SA0”位为从属地址提供了一个扩展位。可以选择“0111100”或“0111101”作为OLED的从属地址。D/C# pin作为SA0进行从属地址的选择”。“收发#”位用于确定I2c总线接口的操作模式。R/W#=1,它处于读取模式。R/W#=0,它处于写模式。
2.4 数据手册程序
数据手册中会给出一些底层程序,可以通过这写程序快速的了解到如何使用。后面的程序设计中会详细介绍这部分,这里就不再做介绍了。
三、IIC通信
3.1 什么是IIC
IIC(Inter-Integrated Circuit)其实是IICBus简称,中文是集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。IIC支持一主多从,主机通过寻址的方式呼叫从机,然后进行数据传输。
I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有从设备的SDA和SLK都接到总线上。
3.2 IIC通信协议
IIC协议中有两种帧,一种是地址帧,用来寻找从设备。一种是数据帧,用来作主从机之间的数据交互。IIC协议还规定了起始信号,终止信号和应答信号。
IIC总线协议
• 空闲状态 I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
• 起始信号 SCL为高电平期间,SDA信号线由高电平向低电平的变化表示起始信号
• 终止信号 SCL为高电平期间,SDA由低电平向高电平的变化表示终止信号
起始信号和终止信号都是由主机发送的,起始信号产生之后,总线处于被占用的状态,在终止信号产生之后,总线就处于空闲状态。
当从机接收完一帧时,会发送一个应答信号。应答信号为低电平时,规定为有效应答(ACK,简称应答位),表示接收器已经成功地接受了该字节应答位为高电平时,规定为非应答信号(NACK),一般表示接收器接收该字节没有成功。
IIC通信协议有自己的数据格式,每一个字节必须保证是8bit长度。数据传送时,先传送最高位,每一个被传送的字节后面都必须跟随1bit的应答位(即每一帧数据一共有9bit)。
3.3 IIC主从通信过程
3.3.1 写入数据
主设备往从设备写入数据需要有下面的过程
• 主设备发送一个起始信号(START)
• 主设备在数据线上广播从设备地址
• 确定数据传输方向(R/W)
• 等待从设备应答信号(ACK)
• 主设备发送数据到从设备,从设备接收到后,会返回给主设备一个应答信号,直到主设备发送完数据,或者从设备返回一个NACK信号,表示从设备不再接收数据
• 数据发送完毕,主设备发送终止信号(STOP)
主设备往从设备写入数据
3.3.2 读取数据
• 主设备发送起始信号(START)
• 主设备在数据线上广播从设备地址
• 确定数据传输方向(R/W)
• 等待从设备应答信号(ACK)
• 从机向主机发送需要读取的数据
• 主设备每接收到一个字节数据,后面就会跟着向从设备发送一个应答信号
• 接收完最后一个数据后,主机会发送一个无效应答信号(NACK)
• 主设备发送终止信号,数据读取完毕
IIC主设备读取数据
四、OLED程序设计
44.1 OLED初始化
OLED初始化包括两部分,一部分是初始化STM32的GPIO,另一部分是根据数据手册提供的程序初始化OLED。STM32F103ZET6提供了两个IIC接口
实际使用软件模拟IIC时,使用任意的GPIO即可,不必要使用上面规定的IIC引脚。这里只是使用了IIC1的引脚而已。
首先是数据手册提供的IIC相关函数
- /*
- *==============================================================================
- *函数名称:IIC_delay
- *函数功能:IIC延时
- *输入参数:无
- *返回值:无
- *备 注:数据手册提供
- *==============================================================================
- */
- void IIC_delay (void)
- {
- u8 t = 1;
- while (t--);
- }
- /*
- *==============================================================================
- *函数名称:I2C_Start
- *函数功能:IIC起始信号
- *输入参数:无
- *返回值:无
- *备 注:数据手册提供
- *==============================================================================
- */
- void I2C_Start (void)
- {
- OLED_SDA_Set();
- OLED_SCL_Set();
- IIC_delay();
- OLED_SDA_Clr();
- IIC_delay();
- OLED_SCL_Clr();
- IIC_delay();
- }
- /*
- *==============================================================================
- *函数名称:I2C_Stop
- *函数功能:IIC终止信号
- *输入参数:无
- *返回值:无
- *备 注:数据手册提供
- *==============================================================================
- */
- void I2C_Stop (void)
- {
- OLED_SDA_Clr();
- OLED_SCL_Set();
- IIC_delay();
- OLED_SDA_Set();
- }
- /*
- *==============================================================================
- *函数名称:I2C_WaitAck
- *函数功能:IIC等待应答
- *输入参数:无
- *返回值:无
- *备 注:数据手册提供
- *==============================================================================
- */
- void I2C_WaitAck (void)
- {
- OLED_SDA_Set();
- IIC_delay();
- OLED_SCL_Set();
- IIC_delay();
- OLED_SCL_Clr();
- IIC_delay();
- }
- /*
- *==============================================================================
- *函数名称:Send_Byte
- *函数功能:写入一个字节
- *输入参数:dat:需要写入的数据
- *返回值:无
- *备 注:数据手册提供
- *==============================================================================
- */
- void Send_Byte (u8 dat)
- {
- u8 i;
- for (i = 0;i < 8;i ++)
- {
- // 发送数据时,从高位依次写入
- if (dat & 0x80)
- {
- OLED_SDA_Set();
- }
- else
- {
- OLED_SDA_Clr();
- }
- IIC_delay();
- OLED_SCL_Set();
- IIC_delay();
- OLED_SCL_Clr();
-
- // dat左移1位
- dat <<= 1;
- }
- }
- /*
- *==============================================================================
- *函数名称:OLED_WR_Byte
- *函数功能:IIC发送一个字节数据
- *输入参数:dat:要发送的数据;mode:0是指令,1是数据
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- void OLED_WR_Byte (u8 dat,u8 mode)
- {
- I2C_Start();
- Send_Byte(0x78); // 寻址
- I2C_WaitAck();
-
- // 发送数据
- if (mode)
- {
- Send_Byte(0x40);
- }
- // 发送指令
- else
- {
- Send_Byte(0x00);
- }
- I2C_WaitAck();
- Send_Byte(dat);
- I2C_WaitAck();
- I2C_Stop();
- }
- /*
- *==============================================================================
- *函数名称:Drv_Oled_Init
- *函数功能:初始化OLED
- *输入参数:无
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- void Drv_Oled_Init (void)
- {
- // 结构体定义
- GPIO_InitTypeDef GPIO_InitStructure;
-
- // 开启时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
-
- // 初始化GPIO结构体
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽式输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- // 全部拉高,IIC处于空闲状态
- GPIO_SetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7);
-
- // 根据数据手册提供的例程,初始化OLED
- delay_ms(200); // 延时200ms
- OLED_WR_Byte(0xAE,OLED_CMD);//--display off
- OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
- OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
- OLED_WR_Byte(0x40,OLED_CMD);//--set start line address
- OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
- OLED_WR_Byte(0x81,OLED_CMD); // contract control
- OLED_WR_Byte(0xFF,OLED_CMD);//--128
- OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
- OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
- OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
- OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
- OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
- OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
- OLED_WR_Byte(0x00,OLED_CMD);//
- OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
- OLED_WR_Byte(0x80,OLED_CMD);//
- OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
- OLED_WR_Byte(0x05,OLED_CMD);//
- OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
- OLED_WR_Byte(0xF1,OLED_CMD);//
- OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
- OLED_WR_Byte(0x12,OLED_CMD);//
- OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
- OLED_WR_Byte(0x30,OLED_CMD);//
- OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
- OLED_WR_Byte(0x14,OLED_CMD);//
- OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
- }
复制代码
下面是相关宏定义
- // SCL
- #define OLED_SCL_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_6)
- #define OLED_SCL_Set() GPIO_SetBits(GPIOB,GPIO_Pin_6)
- // SDA
- #define OLED_SDA_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_7)
- #define OLED_SDA_Set() GPIO_SetBits(GPIOB,GPIO_Pin_7)
- #define OLED_CMD 0 //写命令
- #define OLED_DATA 1 //写数据
复制代码
4.2 OLED控制函数编写
数据手册中提供了一些指令,在编写OLED控制函数时可以参考。
数据手册指令
4.2.1 OLED显示开/关程序
根据数据手册描述,发送指令“1010 111x0”,其中x0为0时,显示关闭,x0为1时,显示开启。因此,显示开关程序如下
- /*
- *==============================================================================
- *函数名称:Med_Oled_Display_On
- *函数功能:开启OLED显示
- *输入参数:无
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- void Med_Oled_Display_On(void)
- {
- OLED_WR_Byte(0X8D,OLED_CMD); // 设置充电泵启用/禁用
- OLED_WR_Byte(0X14,OLED_CMD); // 设置(0x10)禁用
- OLED_WR_Byte(0XAF,OLED_CMD); // DISPLAY ON
- }
- /*
- *==============================================================================
- *函数名称:Med_Oled_Display_Off
- *函数功能:关闭OLED显示
- *输入参数:无
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- void OLED_Display_Off(void)
- {
- OLED_WR_Byte(0X8D,OLED_CMD); // 设置充电泵启用/禁用
- OLED_WR_Byte(0X10,OLED_CMD); // 设置高列地址
- OLED_WR_Byte(0XAE,OLED_CMD); // DISPLAY OFF
- }
复制代码
4.2.2 OLED显示一组汉字程序
想要显示汉字,需要先创建字库。汉字取模使用PCtoLCD2002完美版,取模时的配置已经标注
- // 汉字字模数据结构定义
- struct Cn16CharTypeDef // 汉字字模数据结构
- {
- unsigned char Index[2]; // 汉字内码索引,一个汉字占两个字节
- unsigned char Msk[32]; // 点阵码数据(16*16/8)
- };
- // 汉字取模要求
- // 阴码,逆向,列行式,16X16
- struct Cn16CharTypeDef const CnChar16x16[]=
- {
- "太",0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
- 0x80,0x80,0x40,0x20,0x10,0x0C,0x13,0x60,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00,/*"太",0*/
- "陈",0x00,0xFE,0x22,0x5A,0x86,0x08,0x88,0x68,0x18,0x0F,0xE8,0x08,0x08,0x08,0x08,0x00,
- 0x00,0xFF,0x04,0x08,0x07,0x20,0x11,0x0D,0x41,0x81,0x7F,0x01,0x05,0x09,0x30,0x00,/*"陈",1*/
- "抱",0x10,0x10,0x10,0xFF,0x90,0x20,0x10,0xEC,0x27,0x24,0x24,0xE4,0x04,0xFC,0x00,0x00,
- 0x02,0x42,0x81,0x7F,0x00,0x00,0x00,0x3F,0x42,0x42,0x4A,0x53,0x48,0x47,0x70,0x00,/*"抱",2*/
- "不",0x00,0x02,0x02,0x02,0x02,0x82,0x42,0xF2,0x0E,0x42,0x82,0x02,0x02,0x02,0x00,0x00,
- 0x10,0x08,0x04,0x02,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x01,0x02,0x0C,0x00,0x00,/*"不",3*/
- "动",0x40,0x44,0xC4,0x44,0x44,0x44,0x40,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00,
- 0x10,0x3C,0x13,0x10,0x14,0xB8,0x40,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00,/*"动",4*/
- };
复制代码
汉字显示函数如下
- /*
- *==============================================================================
- *函数名称:Med_Oled_ShowCHinese16x16
- *函数功能:显示一组16*16的汉字
- *输入参数:x:横坐标;y:纵坐标(0~3);cn:要显示的汉字
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- void Med_Oled_ShowCHinese16x16 (u8 x,u8 y,u8 *cn)
- {
- u8 i,num;
-
- while (*cn != '\0')
- {
- // 扫描字库
- // 这里的100,是字库所能容纳的汉字上限,可修改
- for (num = 0;num < 100;num ++)
- {
- // 如果找到匹配的汉字
- if ((CnChar16x16[num].Index[0]==*cn)
- &&(CnChar16x16[num].Index[1]==*(cn+1)))
- {
- // 显示前16个点
- Med_Oled_Set_Pos(x,y);
- for(i=0;i<16;i++)
- {
- OLED_WR_Byte(CnChar16x16[num].Msk[i],OLED_DATA);
- }
- // 显示后16个点
- Med_Oled_Set_Pos(x,y+1);
- for(i=16;i<32;i++)
- {
- OLED_WR_Byte(CnChar16x16[num].Msk[i],OLED_DATA);
- }
- }
- }
- cn += 2;
- x += 16; //若改字号,需要改
- }
- }
复制代码
当需要显示汉字时,只需要写下面的程序,即可直接显示一组汉字
- Med_Oled_ShowCHinese16x16(1,2,"太陈抱不动"); // 显示一组汉字
复制代码
4.2.3 OLED显示一串字符串
要显示字符串,也要有对应的字库,这里提供了8号和16号字库,就不再列出了。想要显示一串字符串,需要先编写显示字符函数
- /*
- *==============================================================================
- *函数名称:Med_Oled_ShowChar
- *函数功能:显示一个字符
- *输入参数:x:横坐标;y:纵坐标;chr:要显示的字符串;Char_Size:大小(8/16)
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- void Med_Oled_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
- {
- u8 c=0,i=0;
- c=chr-' ';//得到偏移后的值
- if(x > Max_Column-1){x=0;y=y+2;}
- if(Char_Size ==16)
- {
- Med_Oled_Set_Pos(x,y);
- for(i=0;i<8;i++)
- OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
- Med_Oled_Set_Pos(x,y+1);
- for(i=0;i<8;i++)
- OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
- }
- else
- {
- Med_Oled_Set_Pos(x,y);
- for(i=0;i<6;i++)
- OLED_WR_Byte(F6x8[c][i],OLED_DATA);
- }
- }
复制代码
显示一串字符串函数如下
- /*
- *==============================================================================
- *函数名称:Med_Oled_ShowString
- *函数功能:显示一串字符串
- *输入参数:x:横坐标;y:纵坐标;chr:要显示的字符串;Char_Size:大小(8/16)
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- void Med_Oled_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
- {
- while (*chr!='\0')
- {
- Med_Oled_ShowChar(x,y,*chr,Char_Size);
- x+=8;
- if(x>120)
- {
- x=0;
- y+=2;
- }
- chr++;
- }
- }
复制代码
需要显示一串字符串时,添加下面程序
- Med_Oled_ShowString(2,6,"ertu-20230621",8); // 在OLED上显示字符串
复制代码
4.2.3 OLED显示图片
下面提供了显示图片的函数
- /*
- *==============================================================================
- *函数名称:Med_Oled_DrawBMP
- *函数功能:显示一张BMP图片
- *输入参数:x0:起始横坐标;y:起始纵坐标;x1:终止横坐标;y1:终止纵坐标;
- BMP[]:要显示的图片
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- void Med_Oled_DrawBMP(u8 x0, u8 y0, u8 x1, u8 y1,u8 BMP[])
- {
- u32 j=0;
- u8 x,y;
-
- if (y1%8==0)
- {
- y = y1 / 8;
- }
- else
- {
- y = y1 / 8 + 1;
- }
- for (y = y0;y < y1;y ++)
- {
- Med_Oled_Set_Pos(x0,y);
- for(x = x0;x < x1;x ++)
- {
- OLED_WR_Byte(BMP[j++],OLED_DATA);
- }
- }
- }
复制代码
下面是图片取模后的存储文件,其中标注了取模软件,以及取模时的配置
- #ifndef __BMP_H
- #define __BMP_H
- // 图片取模时,首先将图片另存为.bmp格式
- // 用Image2Lcd软件取模
- // 扫描模式设置为数据水平,字节垂直
- // 输出灰度为单色
- // 40*40
- // 只勾选字节内像素数据反序
- unsigned char BMP1[] =
- { /* 0X22,0X01,0X28,0X00,0X28,0X00, */
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,
- 0XC0,0X60,0X30,0X10,0X10,0X30,0X20,0X20,0X20,0X00,0X40,0X40,0X40,0X40,0X00,0X00,
- 0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0XC0,0X60,0X30,0X18,0X0C,0X06,0X03,0X01,0X08,0X04,0X02,0X12,0X02,0X04,0X24,0X24,
- 0X24,0X20,0X08,0X08,0X28,0X10,0X00,0X00,0X80,0X40,0X71,0X09,0XC7,0X00,0X00,0X00,
- 0X00,0X00,0X00,0XE0,0X18,0X04,0X82,0X40,0X00,0X80,0X80,0X80,0X80,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0X60,0X30,0X18,0X8C,0X44,0X11,
- 0X08,0X87,0X60,0X30,0X0F,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X20,0X43,0X44,0X00,
- 0X90,0X90,0X90,0X20,0X20,0X20,0X41,0X41,0X03,0X82,0X82,0X80,0X84,0X04,0X04,0X42,
- 0X21,0X10,0X84,0X06,0X23,0X10,0X08,0X02,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X00,0X02,0X02,
- 0X02,0X02,0X00,0X04,0X04,0X0C,0X08,0X0C,0X06,0X03,0X01,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};
- #endif
复制代码
主程序中添加如下程序,最终显示结果如下
- Med_Oled_DrawBMP(10,1,50,6,BMP1); // 显示图片
复制代码
OLED显示图片
五、OLED画点/画线
使用OLED时,也常用到画点或者画线,这里给出画点和画线的函数。
- /*
- *==============================================================================
- *函数名称:Med_Oled_Refresh_Gram
- *函数功能:更新缓存显示内容
- *输入参数:无
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- u8 OLED_GRAM[128][8];
- void Med_Oled_Refresh_Gram(void)
- {
- u8 i,n;
- for(i=0;i<8;i++)
- {
- OLED_WR_Byte (0xb0+i,OLED_CMD);
- OLED_WR_Byte (0x00,OLED_CMD);
- OLED_WR_Byte (0x10,OLED_CMD);
- for(n=0;n<128;n++)
- OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
- }
- }
- /*
- *==============================================================================
- *函数名称:Med_Oled_DrawPoint
- *函数功能:画点
- *输入参数:x:横坐标;y:纵坐标;t:清除(0)/填充(1)
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- void Med_Oled_DrawPoint(u8 x,u8 y,u8 t)
- {
- u8 pos,bx,temp=0;
- if(x>127||y>63) return;
- pos=(y)/8;
- bx=y%8;
- temp=1<<(bx);
- if(t)
- OLED_GRAM[x][pos]|=temp; //第bx位,置1,其他位值不变
- else
- OLED_GRAM[x][pos]&=~temp; //第bx位,置0,其他位值不变
-
- // 更新缓存
- Med_Oled_Refresh_Gram();
- }
- /*
- *==============================================================================
- *函数名称:Med_Oled_DrawLine
- *函数功能:画线
- *输入参数:x1:起始点横坐标;y1:起始点纵坐标;x2:结束点横坐标;
- y2:结束点纵坐标;x:0~128;y:0~64
- *返回值:无
- *备 注:无
- *==============================================================================
- */
- void Med_Oled_DrawLine(u8 x1, u8 y1, u8 x2,u8 y2)
- {
- unsigned int t;
- int xerr=0,yerr=0,delta_x,delta_y,distance;
- int incx,incy,uRow,uCol;
- delta_x=x2-x1; //计算坐标增量
- delta_y=y2-y1;
- uRow=x1;
- uCol=y1;
- if(delta_x>0)incx=1; //设置单步方向
- else if(delta_x==0)incx=0;//垂直线
- else {incx=-1;delta_x=-delta_x;}
- if(delta_y>0)incy=1;
- else if(delta_y==0)incy=0;//水平线
- else{incy=-1;delta_y=-delta_y;}
- if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
- else distance=delta_y;
- for(t=0;t<=distance+1;t++ )//画线输出
- {
- Med_Oled_DrawPoint(uRow,uCol,1);//画点
- xerr+=delta_x ;
- yerr+=delta_y ;
- if(xerr>distance)
- {
- xerr-=distance;
- uRow+=incx;
- }
- if(yerr>distance)
- {
- yerr-=distance;
- uCol+=incy;
- }
- }
- }
复制代码 main函数添加如下代码
- Med_Oled_DrawPoint(10,20,1); // 画点
- Med_Oled_DrawLine(0,30,100,30); // 画线
复制代码
显示内容如下
OLED画点画线函数展示
转载自:二土电子
如有侵权请联系删除
|