OLED 디스플레이의 원리를 이해 - OLED 모듈을 사용하는 다양한 방법
OLED 모듈은 6800 및 8080 평행 인터페이스, 4선 직렬 SPI 인터페이스 모드 및 IIC 인터페이스 모드 등 4개의 작업 모드를 가지고 있습니다.BS1/BS2 설정과 모듈 인터페이스 모드 사이의 관계는 다음 표에서 표시됩니다.:
SAEF 테크놀로지 OLED 모듈의 기본 설정은 BS0에서 GND, BS1 및 BS2에서 VCC (8080 모드) 입니다.당신은 OLED의 뒷면에 용접철을 사용하여 BS0-BS2 설정을 수정해야합니다(하드웨어 변경)
이 그림에서 우리는 총 16개의 핀이 그려져 있고, 16개의 라인 중에서 15개의 핀만 사용했고, 그 중 하나가 매달려 있습니다. 15개의 라인 중 2개가 전력과 지상입니다.그리고 13개가 남았습니다.. 다른 모드에서, 우리가 필요로 하는 신호 라인의 수는 다릅니다, 8080 모드에서, 모두 13가 필요합니다, 그 중 하나는 일반적인, 즉 리셋 라인 RST (RES),MCU의 리셋에 직접 연결할 수 있습니다 (리셋 방법이 동일하다는 것을 확인하기 위해), 그래서 한 줄을 생략 할 수 있습니다. IIC 모드에서, 2 줄만 필요합니다!
우리는 방금 알게 되었습니다. IIC의 작동 방식은 두 개의 라인이 필요하고, IIC의 작동 방식은 데이터를 얻기 위해 IIC를 시뮬레이션하기 위해 두 개의 와이어를 사용하는 것입니다.
OLED 컨트롤러는 SSD1306입니다. 즉, 맨 화면은 SSD1306에 의해 구동됩니다. 또한 더 널리 사용되는 LED 드라이버 칩입니다.
OLED 모듈 비디오 메모리
OLED 자체는 비디오 메모리가 없으며 비디오 메모리는 SSD1306에 의존하여 제공됩니다. SSD1306의 전체 메모리는 128 * 64 비트이며 SSD1306는 메모리를 8 페이지로 나누고 있습니다.각 페이지에는 128 바이트가 있습니다., 총 8 페이지, 정확히 128 * 64 점 행렬 크기입니다.
하지만 OLED는 한 번에 하나의 점 행렬을 제어할 수 없기 때문에 8점 행렬만 제어할 수 있습니다.
각 기록은 바이트로 쓰이기 때문에, 문제가 있습니다, 우리가 모듈을 작동하기 위해 기록만 모드를 사용한다면, 우리는 한 번에 8점을 작성해야 합니다.우리는 설정해야 하는 지점이 위치하는 바이트의 각 비트의 현재 상태를 알아내야 합니다 (0/1그렇지 않으면, 기록된 데이터는 이전 상태를 덮어 쓸 것이고, 그 결과는 표시할 필요가 없는 몇 가지 포인트가 표시된다는 것입니다.또는 표시되어야 하는 것은 표시되지 않습니다. 읽기 가능한 모드에서, 우리는 먼저 작성되는 바이트를 읽고, 현재 상황을 얻을 수 있습니다, 그리고 다시 작성 될 비트 수정 후 그램에 그것을 쓸 수 있습니다,이전 상황에 영향을 미치지 않도록그러나, 이것은 GRAM을 읽을 수 있는 능력을 필요로 합니다, 3 와이어 또는 4 와이어 SPI 모드, 모듈은 읽기 지원하지 않습니다, 그리고 읽기->-> 쓰기 모드 또한 상대적으로 느립니다.
그래서 우리가 사용하는 방법은 STM32 내부에 OLED GRAM (총 128 바이트) 을 만들고, 각각의 수정에서, STM32 (실제로 SRAM) 에 있는 GRAM을 수정하고,한 번에 STM32에 있는 GRAM을 OLED GRAM에 기록합니다.물론, 이 방법은 또한 단점이 있습니다, 즉, 매우 작은 SRAM (예: 51 시리즈) 를 가진 마이크로 컨트롤러에 대해, 그것은 더 번거로울 것입니다.
OLED 비디오 메모리
저장 형식은 다음과 같습니다.
[0]0 1 2 3 127
//[1]0 1 2 3... 127
//[2]0 1 2 3... 127
0 1 2 3... 127
//[4]0 1 2 3... 127
//[5]0 1 2 3... 127
0 1 2 3... 127
//[7]0 1 2 3... 127
u16 OLED_GRAM[128][8]
LCD에 비디오 메모리를 업데이트
무효 OLED_Refresh_Gram (무효)
{
u8 i,n;
for(i=0; i<8; i++)
{
OLED_WR_바이트 (0xb0+i,OLED_CMD); 페이지 주소를 설정 (0~7)
OLED_WR_Byte (0x00,OLED_CMD); 디스플레이 위치를 설정
OLED_WR_바이트 (0x10,OLED_CMD); 표시 위치 칸 높이 주소를 설정
for ((n=0; n<128; n++)OLED_WR_Byte ((OLED_GRAM[n][i],OLED_DATA);
}
}
SSD1306 명령
1: 명령어 0X81: 대조를 설정합니다. 두 바이트를 포함합니다. 첫 번째 0X81은 명령어이며 다음 바이트는 설정해야 할 대조의 값입니다. 이 값이 설정될수록 더 커집니다.화면이 밝을수록.
2: 명령어 0XAE/0XAF: 0XAE는 디스플레이 명령어를 끄고 0XAF는 디스플레이 명령어를 켜고
3: 명령어 0X8D: 2 바이트를 포함, 첫 번째 명령어 단어, 두 번째 설정 값, BIT2의 두 번째 바이트는 충전 펌프의 전환 상태를 나타냅니다, 비트는 1,충전 펌프가 켜져 있습니다., 그리고 0은 꺼져 있습니다. 모듈이 초기화되면 이 기능이 활성화되어야 합니다. 그렇지 않으면 화면 표시를 볼 수 없습니다.
4: 명령어 0XB0~B7: 페이지 주소를 설정하는 데 사용되며, 아래 3자리는 GRAM의 페이지 주소에 대응합니다.
5: 명령어 0X00~0X0F: 표시할 때 시작 열 주소의 하위 4자리를 설정하는 데 사용됩니다.
6: 명령어 0X10~0X1F: 디스플레이의 시작 열 주소를 4자리 높게 설정하는 데 사용됩니다.
더 많은 명령을 위해, 이 참조하십시오, 그것은 매우 자세히 볼 것이 좋습니다: SSD1306 (OLED 드라이버 칩) 자세한 지침
작업 모드와 드라이버 칩을 도입 한 후, 우리는이 IIC OLED 모듈을 사용하기 시작할 수 있습니다
세부 코드
#define OLED_CMD 0 // 명령어를 입력
#OLED_DATA를 정의 1 //데이터를 입력
OLED를 초기화
SSD1306을 초기화
무효 OLED_Init (무효)
GPIO_InitTypeDef GPIO_Init 구조
RCC_APB2PeriphClockCmd ((RCC_APB2Periph_GPIOA, ENABLE); A 포트의 시계를 활성화
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 푸시-플러 출력
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 속도 50MHz
GPIO_Init ((GPIOA, & GPIO_InitStructure); GPIO를 초기화
GPIO_SetBits ((GPIOA,GPIO_Pin_5에 의해 GPIO_Pin_7);
delay_ms ((200);
OLED_WR_Byte ((0xAE,OLED_CMD);
OLED_WR_Byte ((0x00,OLED_CMD);//--- 낮은 열 주소를 설정
OLED_WR_Byte ((0x10,OLED_CMD);//---높은 열 주소를 설정
OLED_WR_Byte ((0x40,OLED_CMD);//--시트 시작 라인 주소
OLED_WR_Byte ((0xB0,OLED_CMD);//--페이지 주소를 설정
OLED_WR_Byte ((0x81,OLED_CMD); // 계약 제어
OLED_WR_Byte ((0xFF,OLED_CMD);//--128
OLED_WR_Byte ((0xA1,OLED_CMD);//세트 세그먼트 재구성
OLED_WR_Byte ((0xA6,OLED_CMD);//--정상 / 역전
OLED_WR_Byte ((0xA8,OLED_CMD);//--세트 멀티플렉스 비율 ((1 ~ 64)
OLED_WR_Byte ((0x3F,OLED_CMD);//--1/32 의무
OLED_WR_Byte ((0xC8,OLED_CMD);//Com 스캔 방향
OLED_WR_Byte ((0xD3,OLED_CMD);//-세트 디스플레이 오프셋
OLED_WR_Byte ((0x00,OLED_CMD);//
OLED_WR_Byte ((0xD5,OLED_CMD);//set osc 분할
OLED_WR_Byte ((0x80,OLED_CMD);//
OLED_WR_Byte ((0xD8,OLED_CMD);//지역 색상 모드를 설정
OLED_WR_Byte ((0x05,OLED_CMD);//
OLED_WR_Byte ((0xD9,OLED_CMD);//예전 충전 기간을 설정
OLED_WR_Byte ((0xF1,OLED_CMD);//
OLED_WR_Byte ((0xDA,OLED_CMD);//set com pin 구성
OLED_WR_Byte ((0x12,OLED_CMD);//
OLED_WR_Byte ((0xDB,OLED_CMD);//set Vcomh
OLED_WR_Byte ((0x30,OLED_CMD);//
OLED_WR_Byte ((0x8D,OLED_CMD);//전하 펌프를 설정
OLED_WR_Byte ((0x14,OLED_CMD);//
OLED_WR_Byte ((0xAF,OLED_CMD);//-- oled 패널을 켜}
OLED_Clear(); 화면을 청소, 각 초기화 완료 후 먼저 화면을 청소하는 것이 좋습니다
화면 청소 기능, 화면 청소 후, 전체 화면이 검은색입니다! 그것은 밝지 않는 것과 같습니다!!
무효 OLED_Clear (무효)
{
u8 i,n;
for(i=0; i<8; i++)
{
OLED_WR_바이트 (0xb0+i,OLED_CMD); 페이지 주소를 설정 (0~7)
OLED_WR_Byte (0x00,OLED_CMD); 디스플레이 위치를 설정
OLED_WR_바이트 (0x10,OLED_CMD); 표시 위치 칸 높이 주소를 설정
for ((n=0; n<128; n++)OLED_WR_Byte ((0,OLED_DATA);
} // 디스플레이 업데이트
}
우리가 보통 사용하는 자기모듈에는 2가지 일반적인 방법이 있습니다. 하나는 6 * 8이고 다른 하나는 8 * 16입니다.첫 번째는 8줄과 6개의 열을 가진 직사각형 테이블에서 원하는 문자를 뽑는 것입니다., 두 번째는 16줄과 8개의 열을 가진 직사각형 표에서 문자를 제거하는 것입니다. 아래 코드 코멘트에서 쓰인 것처럼, OLED에는 페이지당 8줄만 있기 때문에,다음 페이지의 공간이 사용되어야 합니다.일반적으로 사용하는 글꼴 크기를 가지고 있습니다. 물론, 이것은 일반적으로 사용되는 글꼴 크기입니다. 우리는 또한 문자 변조 소프트웨어를 통해 우리가 좋아하는 글꼴 크기를 만들 수 있습니다.
/* 지정된 위치에서 문자 표시, 일부 문자 포함
x:0~127
y:0~63
크기: 글꼴 16/12*/
void OLED_ShowChar ((u8 x,u8 y,u8 chr,u8 Char_Size)
{
표시가 없는 char c=0,i=0;
c=chr-' '; 오프셋 값은 글꼴 패턴에서 얻을 수 있습니다, 첫 번째 하나는'', 대응 문자를 빼면 얻을 수 있습니다
if(x>Max_Column-1) {x=0; y=y+2; } //Max_Column: 최대 열: 128; x: 열 수를 설정; y: 페이지 수를 설정
if(Char_Size ==16) // 이 경우 두 페이지의 같은 열이 필요하고 8*16의 점 행렬이 필요합니다.
{
OLED_Set_Pos(x,y); 만약 x = y = 2, 다음 페이지 3의 열 3에 설정, 참고: 페이지당 8 줄만 있습니다
for(i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i],OLED_DATA); i를 증가시키면서 점들은 루프로 그려지며, 페이지 2의 두 번째 열의 모든 8줄이 데이터에 기록됩니다.
OLED_Set_Pos(x,y+1); 점의 수가 충분하지 않기 때문에, 당신은 페이지 3에 열 2의 점에 계속해야합니다
for(i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i+8],OLED_DATA)); 도면을 끝으로 16항까지 계속
}
다른 것
{
OLED_Set_Pos ((x,y); 6x8 점 행렬, 다른 페이지가 계속 칠할 필요가 없습니다
for ((i=0; i<6; i++)
OLED_WR_Byte ((F6x8[c][i],OLED_DATA); 2차원 배열에서 C는 행을 제어하고 I는 열을 제어하므로 도면을 완료하는 데 다른 작업이 필요하지 않습니다.
}
}
다음 if (x>120) 는 오류가 아닙니다. 이전 x+=8이므로 다음 메모에 설명이 있습니다.
void OLED_ShowString ((u8 x,u8 y,u8 *chr,u8 Char_Size) // 문자열을 표시합니다
{
서명되지 않은 char j=0;
while (chr[j]!='0') // 문자열이 끝나는지 확인
{
OLED_ShowChar ((x,y,chr[j],Char_Size); 문자 하나씩 그려
x+=8; x는 열로 설정되어 있습니다. 문자 크기는 8*16입니다. 즉, 행은 16이고 열은 8이고, 한 줄로 표시될 때마다 8개의 열을 더 높은 열로 이동해야 합니다.
if(x>120) {x=0; y+=2; } // 최대 128개의 열, 만약 초과, 당신은 다시 0개의 열에서 시작해야 합니다, 당신은 다른 페이지가 필요하기 때문에 이 시간에 그림을 계속,중복을 피하기 위해y+=2이 필요하죠
j++; 루프에서 문자열을 그리기
}
}
2개의 숫자가 표시되고, 둘 다 아래 코드에 기록되어 있으며, 아래의 ""는 32의 ASCII 값을 나타낸다는 점에 유의해야 합니다.
m^n 함수
u32 oled_pow ((u8 m,u8 n)
{
u32 결과=1;
while ((n--) 결과*=m;
반환 결과
}
2개의 숫자를 표시합니다
x,y: 시작 좌표
len: 숫자의 숫자
크기: 글꼴 크기
모드: 모드 0, 충전 모드
num: 숫자 값 (0~4294967295)
void OLED_ShowNum ((u8 x,u8 y,u32 num,u8 len,u8 size2)
{
u8 t,temp;
u8 enshow=0;
for(t=0; t { temp=(num/oled_pow(10,len-t-1)) %10 if(display==0&&t<(len-1)) { if(temp==0) { OLED_ShowChar ((x+(size2/2) *t,y,' ',size2) 계속 }else enshow=1; } OLED Char ((x+(size2/2) *t,y,temp+'0',size2) } 위의 몇 가지는 우리의 가장 기본적인 사용입니다. 일부 Xi는 다른 작업을 완료하는 데 사용할 수 있습니다.먼저 일반적으로 사용되는 모델링 소프트웨어를 소개합니다.. PC에서 LCD 2002 이게 작동하는 방법이야! 우리가 그것을 사용할 때, 우리는 먼저 왼쪽 상단에 있는 파일을 열고 새로운 하나를 만들 것입니다. 우리의 폭과 높이를 입력, 6 * 8 또는 8 * 16는 이것을 기반으로 할 수 있습니다위쪽 구석에 기어 같은 것이 있어요크기를 설정하면 열어야 합니다. 그림에서 보듯이: 모든 것을 위에 올려놓으면 원하는 것을 그릴 수 있습니다. OLED가 128*64이기 때문에, 우리의 최대 크기는 이것입니다. 128*64에 쓸 수 있습니다.이것은 또한 화면을 채우는 방법입니다, 그리고 뒤에 어떤 종류의 인상적인 소프트웨어가 있습니다. 어떤 애니메이션 캐릭터와 같은 그림으로 얻을 수 있습니다. 이제 우리가 도구를 도입한 후, 우리는 우리의 운영으로 이동할 준비가되어 있습니다! 1: 직선을 그립니다. 2: 그림 (어떤 애니메이션 캐릭터 등) 을 보여주십시오. 조금 길어 보이네요. 더 많은 플레이 방법이 있습니다. 다음 업데이트가 필요합니다.
보통 우리는 아래 그림과 같은 점을 사용합니다. 직선을 그리면 항상 점이 나옵니다. 왜냐하면 우리가 일반적으로 사용하는 문자 크기는 6 * 8 또는 8 * 16이기 때문입니다.그리고 내부의 점 크기는 전체 직사각형이 채우지 않습니다 (위 설명), 우리가 해야 할 일은 우리의 캐릭터 소프트웨어를 열고 더 큰 포인트를 만드는 것입니다!
담당자: Mrs. Christina
전화 번호: +8618922869670
팩스: 86-755-2370-9419