⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oled.c

📁 Atmega168+HMC1052+OLED开发指南针
💻 C
字号:
#include "common.h"

#define LOW_COL    0x00
#define HIGH_COL   0x12
#define CONTRAST   0x3F

#define COL_BASE	32

void delaytimeforOLED(void)
{
	uchar i;
	for(i=0;i<2;i++)
	_delay_loop_2(60000);
}

void oled_initial(void)
{
		OLED_POWER_ON;
		delaytimeforOLED();		// It delays 1s actually
		oled_reset();
		
		SPI_MasterInit();
		
	MainOLED_WCom(0xAE);	// Display turn off
        
    MainOLED_WCom(0x40); 	// set display start line
        
    MainOLED_WCom(0x81);	// CONTARST CONTROL(00H-0FFH)
    MainOLED_WCom(0x3F);		
        
    MainOLED_WCom(0xA1);   	// SET SEGMENT RE-MAP(0A0H-0A1H) ADC=1
    MainOLED_WCom(0xA4);   	// ENTIRE DISPLAY OFF(0A4H-0A5H)
    MainOLED_WCom(0xA6);   	// SET NORMAL DISPLAY(0A6H-0A7H)
		
    MainOLED_WCom(0xA8);	// SET MULTIPLEX RATIO 64
    MainOLED_WCom(0x23);
        
    MainOLED_WCom(0xAD);	// SET DC/DC BOOSTER(8AH=OFF,8BH=ON)
    MainOLED_WCom(0x8B);	// built-in DC-DC turn on
		
	MainOLED_WCom(0xC8);	// Common output scan direction set
	//MainOLED_WCom(0xC0);
		
    MainOLED_WCom(0xD3);	// SET DISPLAY OFFSET(OOH-3FH)
	MainOLED_WCom(0x1C);
        
	MainOLED_WCom(0xD5);	// SET FRAME FREQUENCY
    MainOLED_WCom(0x70);
        
    MainOLED_WCom(0xD9);	// SET PRE_CHARGE PERIOD
    MainOLED_WCom(0x22);		
        
	MainOLED_WCom(0xDA);	// COM PIN CONFIGURATION(02H,12H)
	MainOLED_WCom(0x12);	// Alternative mode
	//MainOLED_WCom(0x02);
        
	MainOLED_WCom(0xDB);	// SET VCOM DESELECT LEVEL(035H)	
	MainOLED_WCom(0x35);
		
	delaytimeforOLED;		// It delays 1s actually
		
	MainOLED_WCom(0xAF);	// Display on
}

void oled_reset(void)
{
	CLR_RESET;
	_delay_loop_2(10000);	// It delays 125us actually 
	SET_RESET;
	_delay_loop_2(60000);	// It delays 1ms actually 
	CLR_CS;
}

void MainOLED_WCom(uchar data)
{
	CLR_A0;
	SPI_MasterTransmit(data);
	//_delay_us(2);
}

void MainOLED_Sdata(uchar data)
{
	SET_A0;
	SPI_MasterTransmit(data);
	//_delay_us(2);
}

void clear_screen(void)
{
	unsigned char i = 0;
	unsigned char j = 0;
	unsigned int k = 0;
	for(i=0;i<8;i++)
	{
		MainOLED_WCom(0x10);
		MainOLED_WCom(0x04);
		MainOLED_WCom(0xB0+i);
		for(j=0;j<96;j++)
		{
			MainOLED_Sdata(0);
			k++;
		}
	}
}

void byte_disp_8x16(uchar pag, uchar row, const prog_uchar *data, uchar flag)
{
	unsigned char i,j,k=0;
	unsigned char row_high = 0;
	unsigned char row_low = 0;
	unsigned char temp;
	row += 4;
	//row += 32;
	row_high = (row & 0xF0)>>4;
	row_low = row & 0x0F;

	temp = row_low;
	MainOLED_WCom(temp);
	row_high|=(1<<4);
	temp = row_high;
	MainOLED_WCom(temp);
	temp = 0xB0 | pag;
	MainOLED_WCom(temp);
  	for(i=0;i<8;i++)
    {
		if(flag == 0)
			temp = pgm_read_byte(data+k);
		else
			temp = ~pgm_read_byte(data+k);
		k++;
     	MainOLED_Sdata(temp);
	}
}

void print_asc8x16(uchar pag, uchar row, const prog_uchar *data, const prog_uchar *p, uchar flag)
{
	unsigned char temp;
	unsigned char i = 0;

	while(*(data + i) != 0)
	{
		temp = *(data + i) - 32;
		byte_disp_8x16(pag,row,p + 16*temp,flag);
		byte_disp_8x16(++pag,row,p+16*temp+8,flag); //write next page
		pag--;
		i++;
		row += 8;
	}
}
void print_asc8x16_center(uchar pag, const prog_uchar *data, const prog_uchar *p, uchar flag)
{
	unsigned char temp;
	unsigned char row;
	unsigned char i = 0;

	i = strlen(data);
	row = (96 - (i*8))/2;
	i = 0;

	while(*(data + i) != 0)
	{
		temp = *(data + i) - 32;
		byte_disp_8x16(pag,row,p+16*temp,flag);
		byte_disp_8x16(++pag,row,p+16*temp+8,flag); //write next page
		pag--;
		i++;
		row += 8;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -