四脚oled源码

.c

#include <OLED.H>

#define Uchar unsigned char
#define Uint  unsigned int
#define Ulong unsigned long
#define uchar unsigned char
#define uint  unsigned int

unsigned char OLED_GRAM[128][8]={0};

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

void delay_ms(unsigned int t)
{
	Uchar i,j;
	while(--t)
	{
	i=50;	
	j=100;

		while(--j)
			while(--i);
	}
}
void uDelay(unsigned char l)
{
	while(l--);
}


void Delay(unsigned char n)
{
unsigned char i,j,k;

	for(k=0;k<n;k++)
	{
		for(i=0;i<131;i++)
		{
			for(j=0;j<15;j++)
			{
				uDelay(203);	
			}
		}
	}
}
void I2C_SendByte(u8 txd)
{
	unsigned char Idex;
	SCL3_0;
	for (Idex = 0; Idex < 8; Idex++)
	{
		if (txd & (0x80))
		SDA3_1;
		else
		SDA3_0;
		SCL3_1;
		SCL3_0;
		txd<<=1; // 高位先行
	}
}
	
u8 I2C_WaitAck()
{
	u8 time = 0;
	SCL3_1;
	uDelay(1);
	SDA3_1;
	uDelay(1);
	while(READ_SDA)
	{
	time++;
		if(time>250)
		{
		 I2C_Stop();
			return 1;
		}
	}
	SCL3_0;
	return 0;  
}
	
	
void I2C_Ack3()
{
	SCL3_0;
	SDA3_0;
	SCL3_1;
    SCL3_0;
}

void I2C_NAck3()
{
    SCL3_0;
	SDA3_1;
	SCL3_1;
    SCL3_0;
	
}


void I2C_Start()
{
	SCL3_1;
	SDA3_1;
	SDA3_0;
    SCL3_0;

}


void I2C_Stop()
{
	
	SCL3_0;
	SDA3_0;
	SCL3_1;
	SDA3_1;

}


void Write_Command3(unsigned char Data)
{

	I2C_Start();
	I2C_SendByte(0x78);
	I2C_WaitAck();
	I2C_SendByte(0x00);
    I2C_WaitAck();
    I2C_SendByte(Data);
	I2C_WaitAck();
	I2C_Stop();
	
}


void Write_Data3(unsigned char Data)
{

	I2C_Start();
	I2C_SendByte(0x78);
	I2C_WaitAck();
	I2C_SendByte(0x40);
    I2C_WaitAck();
    I2C_SendByte(Data);
	I2C_WaitAck();
	I2C_Stop();

}
void  LCD_Init3(void)
{
	
  GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  ,ENABLE);
 

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);  
 

	delay_ms(300);
	delay_ms(300);
	delay_ms(300);
	Write_Command3(0xae);	//--turn off oled panel

		Write_Command3(0x00);	//--set low column address
		Write_Command3(0x10);	//--set high column address

		Write_Command3(0x40);	//--set start line address

		Write_Command3(0xb0);	//--set page address

		Write_Command3(0x81);	//--set contrast control register
		Write_Command3(0xff);

		Write_Command3(0xa1);	//--set segment re-map 127 to 0   a0:0 to seg127
		Write_Command3(0xa6);	//--set normal display


		//切换显示角度 上下颠倒显示
		//Write_Command3(0xc0);	//--set com(N-1)to com0  c0:com0 to com(N-1)
		
		//切换显示角度
		Write_Command3(0xc0);	//--set com(N-1)to com0  c0:com0 to com(N-1)

		Write_Command3(0xa8);	//--set multiples ratio(1to64)
		Write_Command3(0x3f);	//--1/64 duty

		Write_Command3(0xd3);	//--set display offset
		Write_Command3(0x00);	//--not offset

		Write_Command3(0xd5);	//--set display clock divide ratio/oscillator frequency
		Write_Command3(0x80);	//--set divide ratio

		Write_Command3(0xd9);	//--set pre-charge period
		Write_Command3(0xf1);

		Write_Command3(0xda);	//--set com pins hardware configuration
		Write_Command3(0x12);

		Write_Command3(0xdb);	//--set vcomh
		Write_Command3(0x40);

		Write_Command3(0x8d);	//--set chare pump enable/disable
		Write_Command3(0x14);	//--set(0x10) disable
		//Write_Command3(0x10);	//--set(0x10) disable
		Write_Command3(0xaf);	//--turn on oled panel
		//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=void 	LCD_Init(void)
		
				
//		OLED_ShowString(0, 0,  "CH1_OFF");
//		OLED_ShowString(0, 16, "CH2_OFF");
//		OLED_ShowString(0, 32, "CH3_OFF");
//		OLED_ShowString(0, 48, "CH4_OFF");
//		
//		OLED_ShowString(72, 0, "CH5_OFF");

		OLED_Clear();
		OLED_Refresh_Gram();
		
//		pic13();
//		while(1);
		
}




//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	  
void OLED_Clear(void)  
{  
	u8 i,n;  
	for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n][i]=0X00;  
	//OLED_Refresh_Gram();//更新显示
}

//更新显存到LCD		 
void OLED_Refresh_Gram(void)
{
	u8 j,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(j=0;j<8;j++)
	{
		Write_Command3(0x22);//--set page1
		Write_Command3(j);//--set start page
		Write_Command3(0x07);//--set end page

		
		for(n=0;n<128;n++)Write_Data3(OLED_GRAM[n][j]); 
		
	}
	
}


//画点 
//x:0~127
//y:0~63
//t:1 填充 0,清空				   
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
	u8 pos,bx,temp=0;
	if(x>127||y>63)return;//超出范围了.
	pos=7-y/8;
	bx=y%8;
	temp=1<<(7-bx);
	if(t)OLED_GRAM[x][pos]|=temp;
	else OLED_GRAM[x][pos]&=~temp;	    
}

	//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示				 
//size:选择字体 16/12 
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{      			    
	u8 temp,t,t1;
	u8 y0=y;
	chr=chr-' ';//得到偏移后的值				   
    for(t=0;t<size;t++)
    {   
		if(size==12)temp=asc2_1206[chr][t];  //调用1206字体
		else temp=asc2_1608[chr][t];		 //调用1608字体 	                          
        for(t1=0;t1<8;t1++)
		{
			if(temp&0x80)OLED_DrawPoint(x,y,mode);
			else OLED_DrawPoint(x,y,!mode);
			temp<<=1;
			y++;
			if((y-y0)==size)
			{
				y=y0;
				x++;
				break;
			}
		}  	 
    }          
}



//显示字符串
//x,y:起点坐标  
//*p:字符串起始地址
//用16字体
void OLED_ShowString(u8 x,u8 y,const u8 *p)
{
#define MAX_CHAR_POSX 122
#define MAX_CHAR_POSY 58          
    while(*p!='\0')
    {       
        if(x>MAX_CHAR_POSX){x=0;y+=16;}
        if(y>MAX_CHAR_POSY){y=x=0;OLED_Clear();}
        OLED_ShowChar(x,y,*p,16,1);	 
        x+=8;
        p++;
    }  
}





//画点 
//x:0~575
//y:0~32
//t:1 填充 0,清空				   
void LED_DrawPoint(unsigned short x,unsigned short y,u8 t)
{
	unsigned short pos,bx,temp=0;
	
	if(x>575||y>31)return;//超出范围了.
	
	pos = y;
	bx  = x%8;
	
	temp=1<<(bx);
	
	if(t)
	{
		OLED_GRAM[x/8][pos] |=  temp;
	}
	else 
	{
		OLED_GRAM[x/8][pos] &= ~temp;	 
	}
	
}


//画点 
//x:0~144
//y:0~32
//t:1 填充 0,清空				   
void LED_12_DrawPoint(unsigned short x,unsigned short y,u8 t)
{
	unsigned short bx,temp=0;
	unsigned short x_add,y_add;
		
	if(x>127 ||y>63)return;//超出范围了.
	
	x_add = (x/8)*4 + 3-y/4;
	
	
	y_add =  y%4;
	
	
	bx  = x%8;
	
	temp=1<<(bx);
	
	if(t)
	{
		OLED_GRAM[x_add][y_add] |=  temp;
	}
	else 
	{
		OLED_GRAM[x_add][y_add] &= ~temp;	 
	}
	
}


	//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示				 
//size:选择字体 16/12 
void OLED_ShowPos(unsigned short x,unsigned short y,u8 chr,u8 size,u8 mode)
{      			    
	unsigned short temp,t,t1;
	unsigned short y0=y;
	 
    for(t=0;t<size;t++)
    {   
			if(size==12)temp=asc2_1206[chr][t];  //调用1206字体
			else temp=asc2_1608[chr][t];		 //调用1608字体 	  
			
			for(t1=0;t1<8;t1++)
			{
				if(temp&0x80)LED_DrawPoint(x,y,mode);
				else LED_DrawPoint(x,y,!mode);
				temp<<=1;
				y++;
				if((y-y0)==size)
				{
					y=y0;
					x++;
					break;
				}
			}  	 
    }          
}
void OLED_ShowGBK(u8 x, u8 y,  u8 num, u8 size,u8 mode)
{
    u8 temp,t,t1;
    u8 y0=y;
	//u8 size = 16;
    u8 csize=(size/8 + ((size%8)?1:0)) * size;     //得到字体一个字符对应点阵集所占的字节数
              
    for(t=0;t<csize;t++)
    {  
		   if(size==16) temp = font_1616[num][t];    //调用1616字体
//      else if(size==24)temp=asc2_2412[chr][t];    //调用2412字体
        else return;                                //没有的字库
		   for(t1=0;t1<8;t1++)
        {
            if(temp&0x80)OLED_DrawPoint(x,y,mode);
            else OLED_DrawPoint(x,y,!mode);
            temp<<=1;
            y++;
            if((y-y0)==size)
            {
                y=y0;
                x++;
                break;
            }
        }    
    } 	

	}

.h

#ifndef _OLED_H
#define _OLED_H

//#define SDA_IN()  {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=0x40;}	
//#define SDA_OUT() {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=0x70;}

#include <main.h> 
#define SCL3_0	GPIO_ResetBits(GPIOB,GPIO_Pin_8)			// Serial Clock Input
#define SDA3_0	GPIO_ResetBits(GPIOB,GPIO_Pin_9)				// Serial Data Input


#define SCL3_1	GPIO_SetBits(GPIOB,GPIO_Pin_8)					// Serial Clock Input
#define SDA3_1	GPIO_SetBits(GPIOB,GPIO_Pin_9)					// Serial Data Input

#define READ_SDA  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)



extern volatile unsigned char Error_Flag;

void OLED_ShowGBK(u8 x, u8 y,  u8 num, u8 size,u8 mode);
void LED_12_show_font(uint16_t x,uint16_t y,const uint8_t *font,uint8_t mode);
void I2C_Stop();
void LCD_Init3(void);
void OLED_Refresh_Gram(void);
void OLED_Clear(void);
void OLED_ShowString(u8 x,u8 y,const u8 *p);
void OLED_Processing(void);

void LED_DrawPoint(unsigned short x,unsigned short y,u8 t);

void OLED_ShowGBK12x8(u8 x, u8 y,  u8 num, u8 size,u8 mode);

#endif
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴凯你在想啥呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值