暂时先贴上程序:(我再整理整理)
#include "code_tab.h"
#define LCD_SCL P0_4
// 串行时钟输入
#define LCD_SDA P0_5
// 串行数据输入
#define LCD_RST P0_6
// 复位输入端
#define LCD_DC P0_7
// 数据/命令控制
#define XLevelL
0x00
#define XLevelH
0x10
#define XLevel ((XLevelH&
0x0F)*16 + XLevelL)
#define Max_Column
132
#define Max_Row
32
#define Brightness
0xCF
#define X_WIDTH
132
#define Y_WIDTH
32
#define oledWrDat(val) spiWriteByte(val,
1)
#define oledWrCmd(val) spiWriteByte(val,
0)
void delay_ms(uint ms)
{ unsigned
int a;
while(ms)
{
a =
1800;
while(a--);
ms--;
}
return;
}
/**
* OLED SSD1306初始化
*/
void lcdInit(void)
{ P0DIR =
0xF0; // 设置相关端口
LCD_SCL =
1;
LCD_RST =
0;
delay_ms(
50);
LCD_RST =
1; // 从上电到下面开始初始化要有足够的时间,即等待RC复位完毕
oledWrCmd(
0xae); // turn off oled panel
oledWrCmd(
0x00); // set low column address
oledWrCmd(
0x10); // set high column address
oledWrCmd(
0x40); // set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
oledWrCmd(
0x81); // set contrast control register
oledWrCmd(
0x8f); // Set SEG Output Current Brightness
oledWrCmd(
0xa1); // Set SEG/Column Mapping 0xa0左右反置 0xa1正常
oledWrCmd(
0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
oledWrCmd(
0xa6); // set normal display
oledWrCmd(
0xa8); // set multiplex ratio(1 to 64)
oledWrCmd(
0x1f); // 1/32 duty
oledWrCmd(
0xd3); // set display offset Shift Mapping RAM Counter (0x00~0x3F)
oledWrCmd(
0x00); // not offset
oledWrCmd(
0xd5); // set display clock divide ratio/oscillator frequency
oledWrCmd(
0x80); // set divide ratio, Set Clock as 100 Frames/Sec
oledWrCmd(
0xd9); // set pre-charge period
oledWrCmd(
0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
oledWrCmd(
0xda); // set com pins hardware configuration
oledWrCmd(
0x02);
oledWrCmd(
0xdb); // set vcomh
oledWrCmd(
0x40); // Set VCOM Deselect Level
oledWrCmd(
0x20); // Set Page Addressing Mode (0x00/0x01/0x02)
oledWrCmd(
0x02); //
oledWrCmd(
0x8d); // set Charge Pump enable/disable
oledWrCmd(
0x14); // set(0x10) disable
oledWrCmd(
0xa4); // Disable Entire Display On (0xa4/0xa5)
oledWrCmd(
0xa6); // Disable Inverse Display On (0xa6/a7)
oledWrCmd(
0xaf); // --turn on oled panel
oledFill(
0x00); //初始清屏
oledSetPos(
0,0);
}
/**
* 串行数据总线传输一字节数据
* @param[in] byte:传输的数据
* @param[in] sel:0-写命令,1-写数据
*/
static void spiWriteByte(uchar byte, uchar sel)
{
uchar i; LCD_DC =
0;
if(sel == 1) LCD_DC = 1;
for (i=0; i<8; i++) { // 发送一个八位数据
if((byte << i) & 0x80)
LCD_SDA =
1;
else
LCD_SDA =
0;
LCD_SCL =
0;
LCD_SCL =
1;
}
}
/**
* 设置显示坐标
*/
void oledSetPos(uchar x, uchar y)
{ x +=
4;
oledWrCmd(
0xb0+y);
oledWrCmd(((x&
0xf0)>>4)|0x10);
oledWrCmd((x&
0x0f)|0x01);
}
/**
* 全屏
*/
void oledFill(uchar bmp_dat)
{ unsigned
char y, x;
for (y=0; y<8; y++) {
oledWrCmd(
0xb0+y);
oledWrCmd(
0x01);
oledWrCmd(
0x10);
for(x=0; x<X_WIDTH; x++)
oledWrDat(bmp_dat);
}}
/**
* 复位清屏
*/
void oledClear(void)
{ uchar y, x;
for (y=0; y<8; y++) {
oledWrCmd(
0xb0+y);
oledWrCmd(
0x01);
oledWrCmd(
0x10);
for(x=0; x<X_WIDTH; x++)
oledWrDat(
0);
}
}
/**
* 描述:显示6*8一组标准ASCII字符串,显示的坐标(x,y),y为页范围0~7
*/
void lcdP6x8Str(uchar x, uchar y, uchar ch[])
{ unsigned
char c=0, i=0, j=0;
while (ch[j] != '\0') {
c = ch[j]-
32;
if(x>126) {x=0; y++;}
oledSetPos(x,y);
for(i=0; i<6; i++)
oledWrDat(F6x8[c]);
x +=
6;
j++;
}}
/**
* 描述:显示8*16一组标准ASCII字符串,显示的坐标(x,y),y为页范围0~7
*/
void lcdP8x16Str(uchar x, uchar y, uchar ch[])
{ unsigned
char c=0,i=0,j=0;
while (ch[j] != '\0') {
c = ch[j]-
32;
if (x>120) {
x =
0;
y++;
} oledSetPos(x,y);
for(i=0;i<8;i++)
oledWrDat(F8X16[c*
16+i]);
oledSetPos(x,y+
1);
for(i=0; i<8; i++)
oledWrDat(F8X16[c*
16+i+8]);
x+=
8;
j++;
}}
/**
* 描述:显示显示BMP图片128×64起始点坐标(x0, y0),x的范围0~127,y为页的范围0~7
*/
void lcdDrawBMP(uchar x0, uchar y0, uchar x1, uchar y1, uchar BMP[])
{ uint j=
0;
uchar x, y;
if(y1%8 == 0) y = y1/8;
else y = y1/8+1;
for (y=y0; y<y1; y++) {
oledSetPos(x0,y);
for (x=x0; x<x1; x++) {
oledWrDat(BMP[j++]);
} }}
|