#include "oled.h"
#include "oledfont.h"
/*****************************************/
/**--- 延时函数 ---**/
/*****************************************/
void delay_ms(unsigned int ms)
{
unsigned int a;
while(ms)
{
a=1800;
while(a--);
ms--;
}
return;
}
#if OLED_MODE==1
//向SSD1106写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{
// DATAOUT(dat);
if(cmd) OLED_DC_Set();
else OLED_DC_Clr();
OLED_CS_Clr();
OLED_WR_Clr();
OLED_WR_Set();
OLED_CS_Set();
OLED_DC_Set();
}
#else
//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;
if(cmd) OLED_DC_Set();
else OLED_DC_Clr();
OLED_CS_Clr();
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();
if(dat&0x80) { OLED_SDIN_Set(); }
else OLED_SDIN_Clr();
OLED_SCLK_Set();
dat<<=1;
}
OLED_CS_Set();
OLED_DC_Set();
}
#endif
/**************************************************/
/**--- 坐标函数 ---**/
/**************************************************/
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_WR_Byte(0xb0+y,OLED_CMD);
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);
}
//开启OLED显示
//void OLED_Display_On(void)
//{
// OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
// OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON
// OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON
//}
////关闭OLED显示
//void OLED_Display_Off(void)
//{
// OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
// OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF
// OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF
//}
/******************************************************/
/**--- 清屏函数 ---**/
/******************************************************/
void OLED_Clear(void) //清屏函数,清完屏,整个屏幕是黑色的!
{
u8 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(0,OLED_DATA);
} //更新显示
}
/**************************************************/
/**--- 显示一个字符 ---**/
/**************************************************/
void OLED_ShowChar(u8 x,u8 y,u8 chr)
{
unsigned char c=0,i=0;
c=chr-' ';//得到偏移后的值
if(x>Max_Column-1){x=0;y=y+2;}
if(SIZE ==16) //改变SIZE的值便可以改变字符大小
{ //16时大小为8*16点阵显示
OLED_Set_Pos(x,y);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
}
else //SIZE不为16时字符大小为6*8点阵显示
{
OLED_Set_Pos(x,y+1);
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA);
}
}
/**********************************************/
/**--- 字符串显示 ---**/
/**********************************************/
void OLED_ShowString(u8 x,u8 y,u8 *chr)
{
unsigned char j=0;
while (chr[j]!='\0')
{
OLED_ShowChar(x,y,chr[j]);
x+=8;
if(x>120){x=0;y+=2;}
j++;
}
}
/**************************************************************************************/
/**/ /**--- 中文字符显示 ---**/ /**/
/**************************************************************************************/
/**/void OLED_printch(unsigned char x, unsigned char y,unsigned char code *h_dat) /**/
/**/{ /**/
/**/ unsigned char i, j; /**/
/**/ x <<= 4; /**/
/**/ y <<= 1; /**/
/**/ for(j = 0; j < 2; j++) /**/
/**/ { /**/
/**/ OLED_Set_Pos(x, (y + j)); /**/
/**/ for(i = 0; i < 16; i++) OLED_WR_Byte(h_dat[16 * j + i],1); /**/
/**/ } /**/
/**/} /**/
/**//***************************************************************/ /**/
/**/ /*******----- 单中文字符输出(16*16字体) -----*********/ /**/
/**//***************************************************************/ /**/
/**/void OLED_showch(unsigned char x, unsigned char y, unsigned char code *dat) /**/
/**/{ /**/
/**/ unsigned char i; /**/
/**/ for(i = 0; i < GB_16_num; i++) /**/
/**/ { /**/
/**/ if((GB_16[i].Index[0] == dat[0])&&(GB_16[i].Index[1] == dat[1]))break; /**/
/**/ } /**/
/**/ OLED_printch(x, y, &GB_16[i].Msk); /**/
/**/} /**/
/**//******************************************************************************//**/
/**//******************************************************************************//**/
/**/ /*******--- 中文词组输出(16*16字体) ---******/ /**/
/**//****************************************************************/ /**/
/**/void OLED_showsh(unsigned char x, unsigned char y, unsigned char code *dat) /**/
/**/{ /**/
/**/ while(*dat!='\0') {OLED_showch(x++, y, dat); dat+=2;} /**/
/**/} /**/
/**//******************************************************************************//**/
/**//******************************************************************************//**/
/*****************************************************/
/**--- 显示数字 ---**/
/*****************************************************/
void OLED_num(unsigned char x,unsigned char y, int number)
{
unsigned char lcd[5]={0x20,0x20,0x20,0x20,0x20};
int g,j,k,l,n;
if(number>0)
{
g=number/10000;
j=(number-10000*g)/1000;
k=(number-10000*g-1000*j)/100;
l=(number-10000*g-1000*j-100*k)/10;
n=number%10;
if(g!=0)lcd[0] = g + 0x30;
if((g!=0)||(j!=0))lcd[1] = j + 0x30;
if((g!=0)||(j!=0)||(k!=0))lcd[2] = k + 0x30;
if((g!=0)||(j!=0)||(k!=0)||(l!=0))lcd[3] = l + 0x30;
lcd[4] = n + 0x30;
OLED_ShowString(x,y,lcd);
}
else
{
number = -number;
g=number/10000;
j=(number-10000*g)/1000;
k=(number-10000*g-1000*j)/100;
l=(number-10000*g-1000*j-100*k)/10;
n=number%10;
if(g!=0)lcd[0] = g + 0x30;
if((g!=0)||(j!=0))lcd[1] = j + 0x30;
if((g!=0)||(j!=0)||(k!=0))lcd[2] = k + 0x30;
if((g!=0)||(j!=0)||(k!=0)||(l!=0))lcd[3] = l + 0x30;
lcd[4] = n + 0x30;
OLED_ShowString(x,y,lcd);
}
}
/*********************************************/
/**--- m^n函数 ---**/
/*********************************************/
//u32 oled_pow(u8 m,u8 n)
//{
// u32 result=1;
// while(n--)result*=m;
// return result;
//}
/***********************************************/
/**--- OLED初始化函数 ---**/
/***********************************************/
void OLED_Init(void)
{
OLED_RST_Set();
delay_ms(100);
OLED_RST_Clr();
delay_ms(100);
OLED_RST_Set();
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
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 Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xD3,OLED_CMD);//
stc8a8k64s4a12掉电保存
需积分: 50 81 浏览量
2019-01-23
23:40:53
上传
评论 2
收藏 65KB ZIP 举报
南城煮粥
- 粉丝: 2
- 资源: 3