主頁 >  其他 > 單片機控制OLED12864顯示屏之模塊化編程

單片機控制OLED12864顯示屏之模塊化編程

2021-04-21 11:23:16 其他

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

實驗視頻:

<iframe id="M8VyeeOF-1618760317310" src="https://v.qq.com/txp/iframe/player.html?vid=g3240xbfvbj" allowfullscreen="true" data-mediaembed="tencent"></iframe>

單片機控制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

標籤:其他

上一篇:藍橋杯單片機----DS18B20的基本應用

下一篇:「HTML+CSS」--自定義加載影片【026】

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more