HAL库模拟IIC写四针OLED

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值