OLED.C
#include "driver_oled.h"`
`#include "oledfont.h"`
`#include "math.h"`
`uint8_t OLED_GRAM[128][8];`
`//OLED的显存`
`//存放格式如下.`
`//[0]0 1 2 3 ... 127`
`//[1]0 1 2 3 ... 127`
`//[2]0 1 2 3 ... 127`
`//[3]0 1 2 3 ... 127`
`//[4]0 1 2 3 ... 127`
`//[5]0 1 2 3 ... 127`
`//[6]0 1 2 3 ... 127`
`//[7]0 1 2 3 ... 127
/**********************************************`
`//IIC Start`
`**********************************************/`
`/**********************************************`
`//IIC Start`
`**********************************************/`
`void IIC_Start()`
`{`
`OLED_SCLK_Set();`
`OLED_SDIN_Set();`
`OLED_SDIN_Clr();`
`OLED_SCLK_Clr();`
`}`
`/**********************************************`
`//IIC Stop`
`**********************************************/`
`void IIC_Stop()`
`{`
`OLED_SCLK_Set();`
`OLED_SDIN_Clr();`
`OLED_SDIN_Set();`
``
`}`
`void IIC_Wait_Ack()`
`{`
`OLED_SCLK_Set();`
`OLED_SCLK_Clr();`
`}`
`/**********************************************`
`// IIC Write byte`
`**********************************************/`
`void Write_IIC_Byte(uint8_t IIC_Byte)`
`{`
`uint8_t i;`
`uint8_t m,da;`
`da=IIC_Byte;`
`OLED_SCLK_Clr();`
`for(i=0;i<8;i++)`
`{`
`m=da;`
`m=m&0x80;`
`if(m==0x80)`
`OLED_SDIN_Set();`
`else`
`OLED_SDIN_Clr();`
`da=da<<1;`
`OLED_SCLK_Set();`
`OLED_SCLK_Clr();`
`}`
`}`
`/**********************************************`
`// IIC Write Command`
`**********************************************/`
`void Write_IIC_Command(uint8_t IIC_Command)`
`{`
`IIC_Start();`
`Write_IIC_Byte(0x78); //Slave address,SA0=0`
`IIC_Wait_Ack();`
`Write_IIC_Byte(0x00); //write command`
`IIC_Wait_Ack();`
`Write_IIC_Byte(IIC_Command);`
`IIC_Wait_Ack();`
`IIC_Stop();`
`}`
`/**********************************************`
`// IIC Write Data`
`**********************************************/`
`void Write_IIC_Data(uint8_t IIC_Data)`
`{`
`IIC_Start();`
`Write_IIC_Byte(0x78); //D/C#=0; R/W#=0`
`IIC_Wait_Ack();`
`Write_IIC_Byte(0x40); //write data`
`IIC_Wait_Ack();`
`Write_IIC_Byte(IIC_Data);`
`IIC_Wait_Ack();`
`IIC_Stop();`
`}`
`void OLED_WR_Byte(unsigned dat,unsigned cmd)`
`{`
`if(cmd)`
`{`
`Write_IIC_Data(dat);
}`
`else`
`{`
`Write_IIC_Command(dat);`
`}`
`}`
`/********************************************`
`// fill_Picture`
`********************************************/`
`void fill_picture(uint8_t fill_Data)`
`{`
`uint8_t m,n;`
`for(m=0;m<8;m++)`
`{`
`OLED_WR_Byte(0xb0+m,0); //page0-page1`
`OLED_WR_Byte(0x02,0); //low column start address`
`OLED_WR_Byte(0x10,0); //high column start address`
`for(n=0;n<128;n++)`
`{`
`OLED_WR_Byte(fill_Data,1);`
`}`
`}`
`}`
``
`//坐标设置`
`void OLED_Set_Pos(uint8_t x, uint8_t y)`
`{`
`OLED_WR_Byte(0xb0+y,OLED_CMD);`
`OLED_WR_Byte((((x+2)&0xf0)>>4)|0x10,OLED_CMD);`
`OLED_WR_Byte(((x+2)&0x0f),OLED_CMD);`
`}`
`//画点`
`//x:0~127`
`//y:0~63`
`//t:1 填充 0,清空
void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t t) //用此函数后需要将点更新到LCD,,即OLED_Refresh_Gram();`
`{`
`uint8_t pos,bx,temp=0;`
`if(x>127||y>63)`
`return;//超出范围了.`
`pos = 7-y/8; //第几页 其实是反过来,然后 然后会翻转`
`bx = y%8;`
`temp = 1<<(7-bx); //这里使这个 1 与具体的y相匹配`
`if(t)`
`OLED_GRAM[x][pos] |= temp;`
`else`
`OLED_GRAM[x][pos] &= ~temp;`
`}`
`//更新显存到LCD`
`void OLED_Refresh_Gram(void)`
`{`
`uint8_t i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)`
`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); //将数据写入O_LED的GRAM中`
`}
}`
`//画线`
`void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2,uint16_t y2)//用此函数后需要将点更新到LCD,,即OLED_Refresh_Gram();`
`{`
`uint16_t 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++ )//画线输出`
`{
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;`
`}`
`}
}`
`//画圆`
`void draw_circle(uint8_t x0,uint8_t y0,uint8_t r) //圆心(x0,y0),半径r`
`{`
`uint8_t x,y;`
`for(x=x0-r;x<=x0+r;x++)`
`{`
`uint8_t y_old;`
`y_old=sqrt(pow(r,2)-pow(x-x0,2));
OLED_DrawPoint(x,y_old+y0,1); //上圆`
`OLED_DrawPoint(x,y0-y_old,1); //下圆`
`}`
`}`
`//写画实心圆心(x0,y0),半径r`
`void draw_fill_circle(uint8_t x0,uint8_t y0,uint8_t r,uint8_t dot)`
`{`
`uint8_t x = 0,y = 0,R = 0;`
`for(x = x0-r;x <= x0+r;x++)`
`{`
`for(y = y0-r; y <= y0+r ;y++ )`
`{`
`R = sqrt(pow(r,2)-pow(x-x0,2))+y0; //圆方程 x,y反置`
`if( (y >= y0 && y <= R) || (y < y0 && y >= 2*y0-R )|| dot == 0 ) //点限制在 圆方程内`
`{
OLED_DrawPoint(y,x,dot);`
`}`
`}`
`}`
`}`
`//开启OLED显示
void OLED_Displa