📄 oled12864.c
字号:
// Default => 0xC0
// 0xC0 (0x00) => Scan from COM0 to 63
// 0xC8 (0x08) => Scan from COM63 to 0
}
void Set_Display_Offset(unsigned char d)
{
LCD_WrCmd(0xD3); // Set Display Offset
LCD_WrCmd(d); // Default => 0x00
}
void Set_Display_Clock(unsigned char d)
{
LCD_WrCmd(0xD5); // Set Display Clock Divide Ratio / Oscillator Frequency
LCD_WrCmd(d); // Default => 0x80
// D[3:0] => Display Clock Divider
// D[7:4] => Oscillator Frequency
}
void Set_Precharge_Period(unsigned char d)
{
LCD_WrCmd(0xD9); // Set Pre-Charge Period
LCD_WrCmd(d); // Default => 0x22 (2 Display Clocks [Phase 2] / 2 Display Clocks [Phase 1])
// D[3:0] => Phase 1 Period in 1~15 Display Clocks
// D[7:4] => Phase 2 Period in 1~15 Display Clocks
}
void Set_Common_Config(unsigned char d)
{
LCD_WrCmd(0xDA); // Set COM Pins Hardware Configuration
LCD_WrCmd(0x02|d); // Default => 0x12 (0x10)
// Alternative COM Pin Configuration
// Disable COM Left/Right Re-Map
}
void Set_VCOMH(unsigned char d)
{
LCD_WrCmd(0xDB); // Set VCOMH Deselect Level
LCD_WrCmd(d); // Default => 0x20 (0.77*VCC)
}
void Set_NOP(void)
{
LCD_WrCmd(0xE3); // Command for No Operation
}
void OLCD_init(void)
{
MCF_GPIO_PUBPAR = 0x00; // 配置PTJ为普通IO
MCF_GPIO_DDRUB = 0xff; // 设置PTJ为输出
MCF_GPIO_PORTUB = 0x00; //关闭PTJ口
LCD_SCL_1;
//LCD_CS=1; //预制SLK和SS为高电平
LCD_RST_0;
delay_ms(50);
LCD_RST_1;
//从上电到下面开始初始化要有足够的时间,即等待RC复位完毕
Set_Display_On_Off(0x00); // Display Off (0x00/0x01)
Set_Display_Clock(0x80); // Set Clock as 100 Frames/Sec
Set_Multiplex_Ratio(0x3F); // 1/64 Duty (0x0F~0x3F)
Set_Display_Offset(0x00); // Shift Mapping RAM Counter (0x00~0x3F)
SetStartLine(0x00); // Set Mapping RAM Display Start Line (0x00~0x3F)
Set_Charge_Pump(0x04); // Enable Embedded DC/DC Converter (0x00/0x04)
SetAddressingMode(0x02); // Set Page Addressing Mode (0x00/0x01/0x02)
Set_Segment_Remap(0x01); // Set SEG/Column Mapping 0x00左右反置 0x01正常
Set_Common_Remap(0x08); // Set COM/Row Scan Direction 0x00上下反置 0x08正常
Set_Common_Config(0x10); // Set Sequential Configuration (0x00/0x10)
SetContrastControl(Brightness); // Set SEG Output Current
Set_Precharge_Period(0xF1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
Set_VCOMH(0x40); // Set VCOM Deselect Level
Set_Entire_Display(0x00); // Disable Entire Display On (0x00/0x01)
Set_Inverse_Display(0x00); // Disable Inverse Display On (0x00/0x01)
Set_Display_On_Off(0x01); // Display On (0x00/0x01)
LCD_Fill(0x00); //初始清屏
LCD_Set_Pos(0,0);
/*
LCD_WrCmd(0xae);//--turn off oled panel
LCD_WrCmd(0x00);//---set low column address
LCD_WrCmd(0x10);//---set high column address
LCD_WrCmd(0x40);//--set start line address
LCD_WrCmd(0x81);//--set contrast control register
LCD_WrCmd(0xcf);
LCD_WrCmd(0xa1);//--set segment re-map 95 to 0
LCD_WrCmd(0xa6);//--set normal display
LCD_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
LCD_WrCmd(0x3f);//--1/64 duty
LCD_WrCmd(0xd3);//-set display offset
LCD_WrCmd(0x00);//-not offset
LCD_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
LCD_WrCmd(0x80);//--set divide ratio
LCD_WrCmd(0xd9);//--set pre-charge period
LCD_WrCmd(0xf1);
LCD_WrCmd(0xda);//--set com pins hardware configuration
LCD_WrCmd(0x12);
LCD_WrCmd(0xdb);//--set vcomh
LCD_WrCmd(0x40);
LCD_WrCmd(0x8d);//--set Charge Pump enable/disable
LCD_WrCmd(0x14);//--set(0x10) disable
LCD_WrCmd(0xaf);//--turn on oled panel
*/
}
//==============================================================
//函数名: void LCD_PutPixel(byte x,byte y)
//功能描述:绘制一个点(x,y)
//参数:真实坐标值(x,y),x的范围0~127,y的范围0~64
//返回:无
//==============================================================
void LCD_PutPixel(byte x,byte y)
{
byte data1; //data1当前点的数据
LCD_Set_Pos(x,y);
data1 = 0x01<<(y%8);
LCD_WrCmd(0xb0+(y>>3));
LCD_WrCmd(((x&0xf0)>>4)|0x10);
LCD_WrCmd((x&0x0f)|0x00);
LCD_WrDat(data1);
}
//==============================================================
//函数名: void LCD_Rectangle(byte x1,byte y1,
// byte x2,byte y2,byte color,byte gif)
//功能描述:绘制一个实心矩形
//参数:左上角坐标(x1,y1),右下角坐标(x2,y2)
// 其中x1、x2的范围0~127,y1,y2的范围0~63,即真实坐标值
//返回:无
//==============================================================
void LCD_Rectangle(byte x1,byte y1,byte x2,byte y2,byte gif)
{
byte n;
LCD_Set_Pos(x1,y1>>3);
for(n=x1;n<=x2;n++)
{
LCD_WrDat(0x01<<(y1%8));
if(gif == 1) delay_ms(50);
}
LCD_Set_Pos(x1,y2>>3);
for(n=x1;n<=x2;n++)
{
LCD_WrDat(0x01<<(y2%8));
if(gif == 1) delay_ms(5);
}
}
//==============================================================
//函数名:LCD_P6x8Str(byte x,byte y,byte *p)
//功能描述:写入一组标准ASCII字符串
//参数:显示的位置(x,y),y为页范围0~7,要显示的字符串
//返回:无
//==============================================================
void LCD_P6x8Str(byte x,byte y,char ch[])
{
byte c=0,i=0,j=0;
while (ch[j]!='\0')
{
c =ch[j]-32;
if(x>126){x=0;y++;}
LCD_Set_Pos(x,y);
for(i=0;i<6;i++)
LCD_WrDat(F6x8[c][i]);
x+=6;
j++;
}
}
//==============================================================
//函数名:LCD_P8x16Str(byte x,byte y,byte *p)
//功能描述:写入一组标准ASCII字符串
//参数:显示的位置(x,y),y为页范围0~7,要显示的字符串
//返回:无
//==============================================================
void LCD_P8x16Str(byte x,byte y,char ch[])
{
byte c=0,i=0,j=0;
while (ch[j]!='\0')
{
c =ch[j]-32;
if(x>120){x=0;y++;}
LCD_Set_Pos(x,y);
for(i=0;i<8;i++)
LCD_WrDat(F8X16[c*16+i]);
LCD_Set_Pos(x,y+1);
for(i=0;i<8;i++)
LCD_WrDat(F8X16[c*16+i+8]);
x+=8;
j++;
}
}
//输出汉字字符串
void LCD_P14x16Str(byte x,byte y,char ch[])
{
byte wm=0,ii = 0;
uint adder=1;
while(ch[ii] != '\0')
{
wm = 0;
adder = 1;
while(F14x16_Idx[wm] < 0)
{
if(F14x16_Idx[wm] == ch[ii])
{
if(F14x16_Idx[wm + 1] == ch[ii + 1])
{
adder = wm * 14;
break;
}
}
wm += 2;
}
if(x>118){x=0;y++;}
LCD_Set_Pos(x , y);
if(adder != 1)// 显示汉字
{
LCD_Set_Pos(x , y);
for(wm = 0;wm < 14;wm++)
{
LCD_WrDat(F14x16[adder]);
adder += 1;
}
LCD_Set_Pos(x,y + 1);
for(wm = 0;wm < 14;wm++)
{
LCD_WrDat(F14x16[adder]);
adder += 1;
}
}
else //显示空白字符
{
ii += 1;
LCD_Set_Pos(x,y);
for(wm = 0;wm < 16;wm++)
{
LCD_WrDat(0);
}
LCD_Set_Pos(x,y + 1);
for(wm = 0;wm < 16;wm++)
{
LCD_WrDat(0);
}
}
x += 14;
ii += 2;
}
}
//输出汉字和字符混合字符串
void LCD_Print(byte x, byte y, char ch[])
{
char ch2[3];
char ii=0;
while(ch[ii] != '\0')
{
if(ch[ii] < 0)
{
ch2[0] =ch[ii];
ch2[1] =ch[ii + 1];
ch2[2] = '\0'; //汉字为两个字节
LCD_P14x16Str(x , y, ch2); //显示汉字
x += 14;
ii += 2;
}
else
{
ch2[0] = ch[ii];
ch2[1] = '\0'; //字母占一个字节
LCD_P8x16Str(x , y , ch2); //显示字母
x += 8;
ii+= 1;
}
}
}
//==============================================================
//函数名: void Draw_BMP(byte x,byte y)
//功能描述:显示BMP图片128×64
//参数:起始点坐标(x,y),x的范围0~127,y为页的范围0~7
//返回:无
//==============================================================
void Draw_BMP(byte x0,byte y0,byte x1,byte y1,char bmp[])
{
uint ii=0;
byte x,y;
if(y1%8==0) y=y1/8;
else y=y1/8+1;
for(y=y0;y<=y1;y++)
{
LCD_Set_Pos(x0,y);
for(x=x0;x<x1;x++)
{
LCD_WrDat(bmp[ii++]);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -