這里將我寫的STC12C5A60S2單片機控制OLED12864顯示屏的程式共享一下,如有不足,敬請指出!

實驗視頻:
單片機控制OLED12864顯示屏實驗效果
代碼結構圖:

程式下載鏈接:https://download.csdn.net/download/yagnruinihao/16746777點擊下載 (【備注】該程式由作者根據SSD1306的手冊(datasheet)一字一句敲鍵盤所得,做了大量實驗,花費時間精力,請尊重勞動成果,謝謝,)
測驗程式:OLED12864測驗.c
#include "OLED12864.h"
#include "OLED12864WordCode.h"
#include "common.h"
void DisplayLogoTest(void);
void DisplayAsciiTest(void) ;
void DisplayScrollTest(void);
void DisplayGrid(void);
void DisplayBmp(void);
void main(void)
{
unsigned char i=0;
unsigned char j=0 ;
OLED12864_Init(); //OLED初始化
while(1)
{
DisplayAsciiTest();//ASCII顯示實驗
OLED12864_CleanAll();
DisplayScrollTest();//滾動屏顯示實驗
OLED12864_CleanAll();
DisplayGrid();//畫棋盤實驗
OLED12864_CleanAll();
DisplayBmp();//圖片顯示實驗
}
}
void DisplayLogoTest(void)
{
unsigned char i ;
//"微創電子"
OLED12864_WriteFont16x16(0,8,0);
OLED12864_WriteFont16x16(0,24,1);
OLED12864_WriteFont16x16(0,40,2);
OLED12864_WriteFont16x16(0,56,3);
OLED12864_WriteFont16x16(0,72,29);
OLED12864_WriteFont16x16(0,88,30);
OLED12864_WriteFont16x16(0,104,31);
//橫線
for(i=0 ; i<16 ; i++)
OLED12864_WriteFont16x08(2,i*8,13);
}
void DisplayAsciiTest(void)
{
unsigned char i ;
unsigned char bai,shi,ge ;
//"微創電子作業室"+橫線
DisplayLogoTest();
//"ASCII"
OLED12864_WriteFont16x08(4,0,33) ;
OLED12864_WriteFont16x08(4,8,51) ;
OLED12864_WriteFont16x08(4,16,35) ;
OLED12864_WriteFont16x08(4,24,41) ;
OLED12864_WriteFont16x08(4,32,41) ;
//"值演示實驗"
OLED12864_WriteFont16x16(4,48,4);
OLED12864_WriteFont16x16(4,64,5);
OLED12864_WriteFont16x16(4,80,6);
OLED12864_WriteFont16x16(4,96,7);
OLED12864_WriteFont16x16(4,112,8);
//"For:""Value="
OLED12864_WriteFont16x08(6,0,38);//F
OLED12864_WriteFont16x08(6,8,79);//o
OLED12864_WriteFont16x08(6,16,82);//r
OLED12864_WriteFont16x08(6,24,26);//:
OLED12864_WriteFont16x08(6,56,54);//V
OLED12864_WriteFont16x08(6,64,65);//a
OLED12864_WriteFont16x08(6,72,76);//l
OLED12864_WriteFont16x08(6,80,85);//u
OLED12864_WriteFont16x08(6,88,69);//e
OLED12864_WriteFont16x08(6,96,29);//=
//ASCII字符及其數值
for(i=0 ; i<95 ; i++)
{
OLED12864_WriteFont16x08(6,32,i);
bai = (i+32)%1000/100 ;
shi = (i+32)%100/10 ;
ge = (i+32)%10 ;
if(bai)
OLED12864_WriteFont16x08(6,104,bai+16);
else
OLED12864_WriteFont16x08(6,104,0);
OLED12864_WriteFont16x08(6,112,shi+16);
OLED12864_WriteFont16x08(6,120,ge+16);
Delay_SomeNop(10000);
}
}
void DisplayScrollTest(void)
{
unsigned char i ;
DisplayLogoTest();
//"滾屏顯示實驗"
OLED12864_WriteFont16x16(4,16,9);
OLED12864_WriteFont16x16(4,32,10);
OLED12864_WriteFont16x16(4,48,11);
OLED12864_WriteFont16x16(4,64,12);
OLED12864_WriteFont16x16(4,80,13);
OLED12864_WriteFont16x16(4,96,14);
//"倒計時:"
OLED12864_WriteFont16x16(6,32,23);
OLED12864_WriteFont16x16(6,48,24);
OLED12864_WriteFont16x16(6,64,25);
OLED12864_WriteFont16x08(6,80,26);
for(i=0 ; i<=3 ; i++)
{
OLED12864_WriteFont16x08(6,88,3-i+16);
Delay_SomeNop(40000);
}
//清除最后一行漢字
for(i=0 ; i <16 ; i++)
{
OLED12864_WriteFont16x08(6,i*8,0);
}
//開始橫向滾屏
OLED12864_HorizontalScrollDisplay(OLED12864_HORIZONTAL_SCROLL_LEFT,OLED12864_PAGE2, OLED12864_PAGE5, OLED12864_INTERVAL_2_FRAMES);
Delay_SomeNop(120000);
OLED12864_HorizontalScrollDisplay(OLED12864_HORIZONTAL_SCROLL_RIGHT,OLED12864_PAGE2, OLED12864_PAGE5, OLED12864_INTERVAL_2_FRAMES);
Delay_SomeNop(120000);
OLED12864_HorizontalScrollDisplay(OLED12864_HORIZONTAL_SCROLL_RIGHT,OLED12864_PAGE2, OLED12864_PAGE5, OLED12864_INTERVAL_2_FRAMES);
Delay_SomeNop(120000);
OLED12864_HorizontalScrollDisplay(OLED12864_HORIZONTAL_SCROLL_LEFT,OLED12864_PAGE2, OLED12864_PAGE5, OLED12864_INTERVAL_2_FRAMES);
Delay_SomeNop(120000);
OLED12864_StopScroll();
Delay_SomeNop(120000);
//開始縱向滾屏
OLED12864_VerticalScrollArea(32,32);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE7,OLED12864_PAGE7, OLED12864_INTERVAL_2_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE7,OLED12864_PAGE7, OLED12864_INTERVAL_2_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_StopScroll();
Delay_SomeNop(120000);
//開始斜向滾屏
OLED12864_VerticalScrollArea(0,64);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_StopScroll();
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE4,OLED12864_PAGE7, OLED12864_INTERVAL_2_FRAMES, 0x01);
Delay_SomeNop(200000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE4,OLED12864_PAGE7, OLED12864_INTERVAL_2_FRAMES, 0x01);
Delay_SomeNop(200000);
OLED12864_StopScroll();
Delay_SomeNop(200000);
}
void DisplayGrid(void)
{
unsigned char i,j,k;
OLED12864_Fill(0x0f);
OLED12864_Fill(0xf0);
for(k=0;k<8;k++)
{
for(i=0 ; i<8;i++)
{
for(j=0;j<8;j++)
{
OLED12864_SetPosition(i , j+k*16);
OLED12864_WriteData(0xff);
}
}
}
Delay_SomeNop(120000);
OLED12864_DisplayNormalOrInverse(OLED12864_SET_INVERSE_DISPLAY);
Delay_SomeNop(120000);
OLED12864_DisplayNormalOrInverse(OLED12864_SET_NORMAL_DISPLAY);
Delay_SomeNop(120000);
OLED12864_DisplayNormalOrInverse(OLED12864_SET_INVERSE_DISPLAY);
Delay_SomeNop(120000);
OLED12864_DisplayNormalOrInverse(OLED12864_SET_NORMAL_DISPLAY);
Delay_SomeNop(120000);
OLED12864_DisplayNormalOrInverse(OLED12864_SET_INVERSE_DISPLAY);
Delay_SomeNop(120000);
OLED12864_DisplayNormalOrInverse(OLED12864_SET_NORMAL_DISPLAY);
}
void DisplayBmp(void)
{
OLED12864_DrawBmp(0, 0,7,127 ,BMP1);
OLED12864_VerticalScrollArea(0,64);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_StopScroll();
OLED12864_CleanAll();
OLED12864_DrawBmp(0, 0,7,127 ,BMP2);
Delay_SomeNop(120000);
OLED12864_DisplayNormalOrInverse(OLED12864_SET_INVERSE_DISPLAY);
Delay_SomeNop(120000);
OLED12864_DisplayNormalOrInverse(OLED12864_SET_NORMAL_DISPLAY);
Delay_SomeNop(120000);
OLED12864_DisplayNormalOrInverse(OLED12864_SET_INVERSE_DISPLAY);
Delay_SomeNop(120000);
OLED12864_DisplayNormalOrInverse(OLED12864_SET_NORMAL_DISPLAY);
Delay_SomeNop(120000);
OLED12864_CleanAll();
OLED12864_DrawBmp(0, 0,7,127 ,BMP4);
Delay_SomeNop(120000);
OLED12864_VerticalScrollArea(0,64);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_RIGHT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x3f);
Delay_SomeNop(120000);
OLED12864_VHScrollDisplay(OLED12864_V_H_SCROLL_LEFT,OLED12864_PAGE0,OLED12864_PAGE7, OLED12864_INTERVAL_3_FRAMES, 0x01);
Delay_SomeNop(120000);
OLED12864_StopScroll();
OLED12864_CleanAll();
OLED12864_DrawBmp(0, 0,7,127 ,BMP3);
Delay_SomeNop(120000);
OLED12864_CleanAll() ;
}
/*################OLED12864.h################*/
#ifndef __OLED12864_H__
#define __OLED12864_H__
#include "common.h"
#define X_WIDTH 128
#define Y_WIDTH 64
//OLED12864的IIC介面硬體地址,可以通過修改硬體后面的0Ω電阻位置修改其硬體地址,在IIC模式下D/C引腳作為從機地址的SA0位
//在SSD1306手冊中:In I2C mode, this pin acts as SA0 for slave address selection.
#define OLED12864_DEVICE_ADDRESS1 0x7a//地址一, 0x78 | 0x02
#define OLED12864_DEVICE_ADDRESS2 0x78//地址二,0x78 | 0x00
/*設定默認的硬體地址:OLED12864_DEVICE_ADDRESS1或OLED12864_DEVICE_ADDRESS2即0x78或者0x7a,和硬體電路保持一致*/
#define OLED12864_DEFAULT_DEVICE_ADDRESS OLED12864_DEVICE_ADDRESS2
//讀、寫操作標志位
#define OLED12864_DEVICE_READ 0x01//讀操作
#define OLED12864_DEVICE_WRITE (0x01& (~(0x01<<0)))//寫操作
//D/C位選擇(資料或命令)
#define OLED12864_DATA_OPERATION 1//資料
#define OLED12864_COMMAND_OPERATION 0//命令
//control byte兩種情況基值,表示下一個位元組內容是資料還是命令
#define OLED12864_NEXT_BYTE_DATA 0x40 //下一個位元組內容為資料
#define OLED12864_NEXT_BYTE_COMMAND (0X04 & (~(0x01<<2)))//下一個位元組內容為命令
//OLED12864縱向分為了8個Page,注意編號從0開始
#define OLED12864_PAGE0 0//第一頁
#define OLED12864_PAGE1 1//第二頁
#define OLED12864_PAGE2 2//第三頁
#define OLED12864_PAGE3 3//第四頁
#define OLED12864_PAGE4 4//第五頁
#define OLED12864_PAGE5 5//第六頁
#define OLED12864_PAGE6 6//第七頁
#define OLED12864_PAGE7 7//第八頁
//OLED12864記憶體地址設定模式
#define OLED12864_HORIZONTAL_ADDRESS_MODE 0x00//水平地址模式
#define OLED12864_VERTICAL_ADDRESS_MODE 0x01//垂直地址模式
#define OLED12864_PAGE_ADDRESS_MODE 0x02//頁地址模式(復位后默認值)
#define OLED12864_INVAILD 0x03//無效設定,不能識別,預留
//VCOMH電源倍率選擇
#define OLED12864_VCOMH_DESELECT_LEVEL0 0x00//0.65 X Vcc
#define OLED12864_VCOMH_DESELECT_LEVEL1 0x01//~0.77 X Vcc(復位默認值)
#define OLED12864_VCOMH_DESELECT_LEVEL2 0x02//~0.83 X Vcc
/*--------------------------SSD1306基礎命令--------------------------*/
#define OLED12864_SET_CONTRAST_CONTROL 0x81//對比對設定,取值范圍1~255,復位值為0x7f
#define OLED12864_ENTIRE_DISPLAY_ON_GDDRAM 0xA4//全域顯示關閉,即根據GDDRAM內容顯示
#define OLED12864_ENTIRE_DISPLAY_ON_FORCE 0xA5//全域顯示開啟,即不論GDDRAM內容,而強制所有像素點點亮
#define OLED12864_SET_NORMAL_DISPLAY 0xA6//正常顯示,給GDDRAM則0為熄滅像素,1為點亮像素
#define OLED12864_SET_INVERSE_DISPLAY 0xA7//逆顯示,反轉顯示,給GDDRAM則1為熄滅像素,0為點亮像素
#define OLED12864_SET_DISPLAY_OFF 0xAE//關顯示,睡眠模式,復位后默認值
#define OLED12864_SET_DISPLAY_ON 0xAF//開顯示,普通模式
/*--------------------------SSD1306滾動屏命令--------------------------*/
//SSD1306水平滾動顯示命令
#define OLED12864_HORIZONTAL_SCROLL_RIGHT 0x26//設定螢屏持續向右滾動顯示
#define OLED12864_HORIZONTAL_SCROLL_LEFT 0x27//設定螢屏持續向左滾動顯示
//OLED12864滾動顯示間隔(間隔的幀數值越小滾動越快,例如這里間隔2幀時最快,256幀最慢)
#define OLED12864_INTERVAL_5_FRAMES 0//間隔5幀
#define OLED12864_INTERVAL_64_FRAMES 1//間隔64幀
#define OLED12864_INTERVAL_128_FRAMES 2//間隔128幀
#define OLED12864_INTERVAL_256_FRAMES 3//間隔256幀
#define OLED12864_INTERVAL_3_FRAMES 4//間隔3幀
#define OLED12864_INTERVAL_4_FRAMES 5//間隔4幀
#define OLED12864_INTERVAL_25_FRAMES 6//間隔25幀
#define OLED12864_INTERVAL_2_FRAMES 7//間隔2幀
//SSD1306水平和垂直同時滾動顯示命令
#define OLED12864_V_H_SCROLL_RIGHT 0x29//持續的垂直、水平向右滾動
#define OLED12864_V_H_SCROLL_LEFT 0x2A//持續的垂直、水平向左滾動
//SSD1306禁止滾動顯示、使能滾動顯示命令
#define OLED12864_DEACTIVATE_SCROLL 0x2E//禁止滾動顯示
#define OLED12864_ATCIVATE_SCROLL 0x2F//使能滾動顯示
//設定垂直滾動區域命令
#define OLED12864_SET_VERTICAL_SCROLL_AREA 0xA3//設定垂直滾動范圍命令
/*--------------------------SSD1306地址設定命令--------------------------*/
//在頁地址模式下,設定起始列地址的命令基值(命令=基值 | 引數值)
#define OLED12864_LOWER_COLUMN_START_ADDRESS_BASE 0x00//頁地址模式下設定起始列地址的低半位元組的基值(僅用于頁地址模式下)
#define OLED12864_HIGHER_COLUMN_START_ADDRESS_BASE 0x10//頁地址模式小設定起始列地址的高半位元組的基值(僅用于頁地址模式下)
//SSD1306尋址設定命令地址
#define OLED12864_SET_MEMORY_ADDRESS_MODE 0x20//設定記憶體地址模式(復位默認頁地址模式)
#define OLED12864_SET_COLUMN_ADDRESS 0x21//設定列起止地址和終止地址(僅用于水平地址模式和垂直地址模式下)
#define OLED12864_SET_PAGE_ADDRESS 0x22//設定頁起始地址而后終止地址(僅用于水平地址模式和垂直地址模式下)
/*--------------------------SSD1306硬體配置命令--------------------------*/
#define OLED12864_SET_DISPLAY_START_LINE_BASE 0x40//設定顯示起始行命令基值,命令=基值 | 開始行位置
#define OLED12864_SET_SEGMENT_REMAP_NORMAL 0xA0//設定段重映射,列0映射到段0處,即左右正常顯示效果
#define OLED12864_SET_SEGMENT_REMAP_FLIP 0xA1//設定段重映射,列127映射到段0處,即左右翻轉顯示鮮果
#define OLED12864_SET_MULTIPLEX_RATIO 0xA8//設定多路復用率N
#define OLED12864_SET_COM_OUTPUT_SCAN_DIRECTION_NORMAL 0xC0//普通模式,從COM[0]掃描到COM[N-1],即上下正常顯示效果
#define OLED12864_SET_COM_OUTPUT_SCAN_DIRECTION_FLIP 0xC8//重新繪制模式,從COM[N-1]掃描到CO0M,即上下翻轉顯示效果
#define OLED12864_SET_DISPLAY_OFFSET 0xD3//設定垂直移動COM,范圍0~63,復位默認值為0
#define OLED12864_SET_COM_PIN_HARDWARE_CONFIGURATION 0xDA//設定COM引腳硬體配置
/*--------------------------SSD1306時序和驅動命令--------------------------*/
#define OLED12864_SET_DISPLAY_CLOCK_DIV_AND_FREQUENCY 0xD5//設定時鐘分頻因子和頻率
#define OLED12864_SET_PRE_CHARGE_PERIOD 0xD9//設定預充電周期
#define OLED12864_SET_VCOMH_DESELECT_LEVEL 0xDB//設定VCOMH電源倍率
#define OLED12864_NOP 0xE3//空操作命令,無任何操作
/*--------------------------SSD1306時序和驅動命令--------------------------*/
#define OLED12864_CHARGE_PUMP_SETING 0x8d//電荷泵的設定
/*--------------------------一些默認設定----------------------------------*/
//默認顯示模式:正常顯示OLED12864_SET_NORMAL_DISPLAY或者逆顯示OLED12864_SET_INVERSE_DISPLAY
#define OLED12864_DEFAULT_DISPLAY_MODE OLED12864_SET_NORMAL_DISPLAY/*默認正常顯示*/
//默認是否開啟OLED顯示功能:OLED12864_SET_DISPLAY_ON或者OLED12864_SET_DISPLAY_OFF
#define OLED12864_DEFAULT_DISPLAY_ON_OR_OFF OLED12864_SET_DISPLAY_ON/*默認開啟顯示功能*/
//默認驅動路數:全部
#define OLED12864_DEFAULT_MULTIPLEX_RATIO 0x3f/*默認設定驅動路數為63+1(公式為N+1)*/
//默認對比度:0xff最亮
#define OLED12864_DEFAULT_DISPLAY_CONTRAST 0xff
//上、下、左、右翻轉顯示設定,這里默認上下翻轉、左右翻轉(這個和看液晶屏方向有關,相對概念,可適當修改)
#define OLED12864_DEFAULT_COM_SCAN_DIRECTION OLED12864_SET_COM_OUTPUT_SCAN_DIRECTION_FLIP
#define OLED12864_DEFAULT_SEGMENT_DIRECTION OLED12864_SET_SEGMENT_REMAP_FLIP
/*****************外部介面函式******************/
//寫資料
extern void OLED12864_WriteData(unsigned char DataValue) ;
//寫命令
extern void OLED12864_WriteCommand(unsigned char CommandValue) ;
//設定書寫位置
extern char OLED12864_SetPosition(unsigned char Page, unsigned char Column) ;
//寫16x16的字體(高為16,即兩頁 ; 寬為16,即16列)
extern char OLED12864_WriteFont16x16(unsigned char Page, unsigned char Column,unsigned char SerialNumber);
//寫16x8的字體(高為16,即兩頁 ; 寬為8,即8列)
extern char OLED12864_WriteFont16x08(unsigned char Page,unsigned char Column,unsigned char SerialNumber);
//OLED12864全屏寫入某資料
extern void OLED12864_Fill(unsigned char DataValue) ;
//OLED12864初始化
extern void OLED12864_Init(void) ;
//OLED12864清屏
extern void OLED12864_CleanAll(void) ;
//OLED1864畫圖
extern char OLED12864_DrawBmp(unsigned char StartPage,unsigned char StartColumn,unsigned char EndPage,unsigned char EndColumn,unsigned char BMP[]);
//OLED12864開始滾動螢屏
extern void OLED12864_StartScroll(void) ;
//OLED12864結束滾動螢屏
extern void OLED12864_StopScroll(void) ;
//水平滾動螢屏顯示
extern char OLED12864_HorizontalScrollDisplay(unsigned char LeftOrRight, unsigned char StartPage,
unsigned char EndPage, unsigned char Interval);
//斜方向滾動顯示
extern char OLED12864_VHScrollDisplay(unsigned char VHL_or_VHR,unsigned char StartPage,unsigned char EndPage,unsigned char Interval,unsigned char V_offset) ;
//設定垂直滾屏區域
extern char OLED12864_VerticalScrollArea(unsigned char TopRow , unsigned char ScrollRowNumber) ;
//開啟全域顯示,OLED12864根據GDDRAM內容顯示(恢復OLED12864正常顯示)
extern void OLED12864_EntireDisplayOnGDDRAM(void) ;
//關閉全域顯示,強制點亮所有像素點(不論GDDRAM內容是什么)
extern void OLED12864_EntireDisplayOnForce(void) ;
//設定正常顯示或者逆顯示(決定高電平亮還是低電平亮)
extern char OLED12864_DisplayNormalOrInverse(unsigned char NormalOrInverse) ;
//開始OLED12864顯示
extern void OLED12864_SetDisplayOn(void) ;
//關閉OLED12864顯示
extern void OLED12864_SetDisplayOff(void) ;
//設定對比度
extern void OLED12864_SetDisplayContrast(unsigned char Contraset) ;
//設定水平左右是否鏡面效果(僅影響后續資料,對GDDRAM內部資料不能產生左右鏡面效果)
extern char OLED12864_HorizontalFlip(unsigned char LeftOrRight) ;
//設定垂直上下是否鏡面效果(立刻顯示效果)
extern char OLED12864_VerticalFlip(unsigned char UpOrDown) ;
#endif /*__OLED12864_H__*/
/*################OLED12864.c部分代碼分析################*/
這里重點分析書寫16x16中文漢字的四種演算法(逐行式、逐列式、列行式、行列式)
演算法一:逐行式
/*逐列式,已實驗成功,注意這里需要配合取模軟體和OLED12864WordCode中陣列*/
for(j=0;j<16; j++)
{
OLED12864_SetPosition(Page,Column+j);
OLED12864_WriteData(Font16x16[addr++]);
OLED12864_SetPosition(Page + 1 , Column+j);
OLED12864_WriteData(Font16x16[addr++]);
}
演算法二:逐列式
/*逐行式(為了便于理解,未優化),已實驗成功,注意這里需要配合取模軟體和OLED12864WordCode中陣列*/
unsigned char temp ;
OLED12864_SetPosition(Page,Column);
for(j=0;j<8 ;j++)
{
temp =(((Font16x16[addr+0]&(0x01<<j))>>j)<<0) | (((Font16x16[addr+2]&(0x01<<j))>>j)<<1) |(((Font16x16[addr+4]&(0x01<<j))>>j)<<2) | \
(((Font16x16[addr+6]&(0x01<<j))>>j)<<3) | (((Font16x16[addr+8]&(0x01<<j))>>j)<<4) |(((Font16x16[addr+10]&(0x01<<j))>>j)<<5) | \
(((Font16x16[addr+12]&(0x01<<j))>>j)<<6) | (((Font16x16[addr+14]&(0x01<<j))>>j)<<7) ;
OLED12864_WriteData(temp);
}
++addr;
for(j=0;j<8 ;j++)
{
temp =(((Font16x16[addr+0]&(0x01<<j))>>j)<<0) | (((Font16x16[addr+2]&(0x01<<j))>>j)<<1) |(((Font16x16[addr+4]&(0x01<<j))>>j)<<2) | \
(((Font16x16[addr+6]&(0x01<<j))>>j)<<3) | (((Font16x16[addr+8]&(0x01<<j))>>j)<<4) |(((Font16x16[addr+10]&(0x01<<j))>>j)<<5) | \
(((Font16x16[addr+12]&(0x01<<j))>>j)<<6) | (((Font16x16[addr+14]&(0x01<<j))>>j)<<7) ;
OLED12864_WriteData(temp);
}
addr += 15;
OLED12864_SetPosition(Page+1,Column);
for(j=0;j<8 ;j++)
{
temp =(((Font16x16[addr+0]&(0x01<<j))>>j)<<0) | (((Font16x16[addr+2]&(0x01<<j))>>j)<<1) |(((Font16x16[addr+4]&(0x01<<j))>>j)<<2) | \
(((Font16x16[addr+6]&(0x01<<j))>>j)<<3) | (((Font16x16[addr+8]&(0x01<<j))>>j)<<4) |(((Font16x16[addr+10]&(0x01<<j))>>j)<<5) | \
(((Font16x16[addr+12]&(0x01<<j))>>j)<<6) | (((Font16x16[addr+14]&(0x01<<j))>>j)<<7) ;
OLED12864_WriteData(temp);
}
++addr;
for(j=0;j<8 ;j++)
{
temp =(((Font16x16[addr+0]&(0x01<<j))>>j)<<0) | (((Font16x16[addr+2]&(0x01<<j))>>j)<<1) |(((Font16x16[addr+4]&(0x01<<j))>>j)<<2) | \
(((Font16x16[addr+6]&(0x01<<j))>>j)<<3) | (((Font16x16[addr+8]&(0x01<<j))>>j)<<4) |(((Font16x16[addr+10]&(0x01<<j))>>j)<<5) | \
(((Font16x16[addr+12]&(0x01<<j))>>j)<<6) | (((Font16x16[addr+14]&(0x01<<j))>>j)<<7) ;
OLED12864_WriteData(temp);
}
演算法三:列行式(作者最后采用的方式)
/*列行式,已實驗成功,注意這里需要配合取模軟體和OLED12864WordCode中陣列*/
OLED12864_SetPosition(Page,Column);
for(j=0;j<16; j++)
OLED12864_WriteData(Font16x16[addr++]);//寫字上半部分
OLED12864_SetPosition(Page+1,Column);
for(j=0;j<16; j++)
OLED12864_WriteData(Font16x16[addr++]);//寫字下半部分
演算法四:行列式
/*行列式(為了便于理解,未優化,已實驗成功),注意這里需要配合取模軟體和OLED12864WordCode中陣列*/
unsigned char temp ;
OLED12864_SetPosition(Page,Column);
for(j=0;j<8; j++)
{
temp = (((Font16x16[addr+0]&(0x01<<j))>>j)<<0) | (((Font16x16[addr+1]&(0x01<<j))>>j)<<1) |(((Font16x16[addr+2]&(0x01<<j))>>j)<<2) | \
(((Font16x16[addr+3]&(0x01<<j))>>j)<<3) | (((Font16x16[addr+4]&(0x01<<j))>>j)<<4) |(((Font16x16[addr+5]&(0x01<<j))>>j)<<5) | \
(((Font16x16[addr+6]&(0x01<<j))>>j)<<6) | (((Font16x16[addr+7]&(0x01<<j))>>j)<<7);
OLED12864_WriteData(temp) ;
}
OLED12864_SetPosition(Page+1,Column);
addr +=8 ;
for(j=0;j<8; j++)
{
temp = (((Font16x16[addr+0]&(0x01<<j))>>j)<<0) | (((Font16x16[addr+1]&(0x01<<j))>>j)<<1) |(((Font16x16[addr+2]&(0x01<<j))>>j)<<2) | \
(((Font16x16[addr+3]&(0x01<<j))>>j)<<3) | (((Font16x16[addr+4]&(0x01<<j))>>j)<<4) |(((Font16x16[addr+5]&(0x01<<j))>>j)<<5) | \
(((Font16x16[addr+6]&(0x01<<j))>>j)<<6) | (((Font16x16[addr+7]&(0x01<<j))>>j)<<7);
OLED12864_WriteData(temp) ;
}
addr +=8 ;
OLED12864_SetPosition(Page,Column+8);
for(j=0;j<8; j++)
{
temp = (((Font16x16[addr+0]&(0x01<<j))>>j)<<0) | (((Font16x16[addr+1]&(0x01<<j))>>j)<<1) |(((Font16x16[addr+2]&(0x01<<j))>>j)<<2) | \
(((Font16x16[addr+3]&(0x01<<j))>>j)<<3) | (((Font16x16[addr+4]&(0x01<<j))>>j)<<4) |(((Font16x16[addr+5]&(0x01<<j))>>j)<<5) | \
(((Font16x16[addr+6]&(0x01<<j))>>j)<<6) | (((Font16x16[addr+7]&(0x01<<j))>>j)<<7);
OLED12864_WriteData(temp) ;
}
addr +=8 ;
OLED12864_SetPosition(Page+1,Column+8);
for(j=0;j<8; j++)
{
temp = (((Font16x16[addr+0]&(0x01<<j))>>j)<<0) | (((Font16x16[addr+1]&(0x01<<j))>>j)<<1) |(((Font16x16[addr+2]&(0x01<<j))>>j)<<2) | \
(((Font16x16[addr+3]&(0x01<<j))>>j)<<3) | (((Font16x16[addr+4]&(0x01<<j))>>j)<<4) |(((Font16x16[addr+5]&(0x01<<j))>>j)<<5) | \
(((Font16x16[addr+6]&(0x01<<j))>>j)<<6) | (((Font16x16[addr+7]&(0x01<<j))>>j)<<7);
OLED12864_WriteData(temp) ;
}
【注意】這里采用那種演算法,需要和取模軟體相配套,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278469.html
標籤:其他
