单片机驱动ssd1306【128*64】oled显示屏

背景

芯片:stm32F103

协议:IIC

外设:SSD1306显示屏,128*64

IIC软件驱动不做演示

ssd1306的写操作分为2种 : 写命令 和 写数据

ssd1306写命令(发送数据40 + cmd)

void OLED_WriteC(unsigned char cmd)
{
	i2c_Start();		// 发送IIC开始信号
	i2c_SendByte(0X78);	// 发送设备地址'0111 100x',x=0,写入
	i2c_WaitAck();
	i2c_SendByte(0X00);	// 发送控制字节 Co='0' C='(Co)000 0000'
	i2c_WaitAck();
	i2c_SendByte(cmd);		// 发送命令cmd
	i2c_WaitAck();
}

ssd1306写数据(发送数据00 + data)

void OLED_WriteD(unsigned char dat)
{
	i2c_Start();		// 发送IIC开始信号
	i2c_SendByte(0X78);	// 发送设备地址'0111 100x',x=0,写入
	i2c_WaitAck();
	i2c_SendByte(0X40);	// 发送控制字节 Co='0' D='(Co)100 0000'
	i2c_WaitAck();
	i2c_SendByte(dat);		// 发送所需的dat数据
	i2c_WaitAck();
}

oled的配置过程


void OLED_SSD1306Cfg(void)
{	
	OLED_WriteC(0xAE);
	OLED_WriteC(0xD5);
	OLED_WriteC(0xC0);
	OLED_WriteC(0xA8);
	OLED_WriteC(0x3F);
	OLED_WriteC(0xD3);
	OLED_WriteC(0x00);
	OLED_WriteC(0x40);
	OLED_WriteC(0x8D);
	OLED_WriteC(0x14);
	OLED_WriteC(0xD8);
	OLED_WriteC(0x05);
	OLED_WriteC(0xA1);
	OLED_WriteC(0xC8);
	OLED_WriteC(0xDA);
	OLED_WriteC(0x12);
	OLED_WriteC(0x81);
	OLED_WriteC(0xCF);
	OLED_WriteC(0xD9);
	OLED_WriteC(0xF1);
	OLED_WriteC(0xDB);
	OLED_WriteC(0x40);
	OLED_WriteC(0xA4);
	OLED_WriteC(0xA6);
	OLED_ClearFullScreen();
	OLED_WriteC(0xAF);
	i2c_Stop();
}

oled清屏操作

void OLED_ClearFullScreen(void)
{
    int i,j;
    
    //使用水平寻址模式模式
    OLED_WriteC(0x20); //设置寻址模式 (0x00水平/0x01垂直/0x02页)
    OLED_WriteC(0x00); //水平寻址模式
    OLED_WriteC(0x21); //设置列地址
    OLED_WriteC(0x00);
    OLED_WriteC(0x7f);
    OLED_WriteC(0x22); //设置页地址
    OLED_WriteC(0x00);
    OLED_WriteC(0x07);
    i2c_Stop();
    
    for (i = 0; i < 8; i++) //扫描页
    {
        for (j = 0; j < 128; j++) //扫描列
            OLED_WriteD(0x00);
    }
    i2c_Stop();
}

接下来是描绘像素点,主要分中文与英文

描述一个中文字符(16*16)


/*********************************************************************************************************
*	函 数 名: show_chinese_character
*	功能说明: OLED屏幕SSD1306,显示一个16x16的中文字符
*	形    参:y:第y页(0-7)  x:一行的x坐标位置(0-127)  word:显示的中文字符
*	返 回 值: 无
*********************************************************************************************************
*/
void show_chinese_character(char y, char x,unsigned char *word)
{
		int i;
		int serialNum = -1;
	
		OLED_WriteC(0xb0+y); //Set  page y
    OLED_WriteC(0x00+x%16);   //设置列起始地址半字节的低四位
    OLED_WriteC(0x10+x/16);   //设置列起始地址半字节的高四位
		
		for(i = 0;i < CHINESE_TOTAL_NUM; i++){
			if(word[0] == chinese_characters[i].c[0] && word[1] == chinese_characters[i].c[1]){
				serialNum = i;
				break;
			}
		}
		if(serialNum == -1){
			serialNum = 0;//找不到相应的字符,显示数组第一个中文字符.
		}
	
	
    for(i=0;i<16;i++)
    { 
			OLED_WriteD(chinese_characters[serialNum].code_table[i]);
    }
		i2c_Stop();
		
    OLED_WriteC(0xb0+y+1);    //Set  page y+1
    OLED_WriteC(0x00+x%16);   //设置列起始地址半字节的低四位
    OLED_WriteC(0x10+x/16);   //设置列起始地址半字节的高四位
    for(i=0;i<16;i++) 
    { 
			OLED_WriteD(chinese_characters[serialNum].code_table[i+16]);
    }
		i2c_Stop();
}

描述一个英文字符

/*********************************************************************************************************
*	函 数 名: show_8x16_System(字体格式System)
*	功能说明: OLED屏幕SSD1306,显示一个12x24的字符
*	形    参:y:第y页  x:一行的x坐标位置  word:显示的字符
*	返 回 值: 无
*********************************************************************************************************
*/
void show_8x16_English_System(char y, char x, char word)
{
		int i,j;
		int serialNum = -1;
		char tempChar;
	
    OLED_WriteC(0xb0+y); //Set  page y
    OLED_WriteC(0x00+x%16);   //设置列起始地址半字节的低四位
    OLED_WriteC(0x10+x/16);   //设置列起始地址半字节的高四位
		for(i = 0;i < Font_Fomat_Signal_System_English_Num; i++){
			if(word == System_8x16_English[i].c){
				serialNum = i;
				break;
			}
		}
		if(serialNum == -1){
			serialNum = 0;//找不到相应的字符,显示句号.
		}
		
    for(j=0;j<8;j++) 
    { 
		OLED_WriteD(System_8x16_English[serialNum].code_table[j]);
    }
		i2c_Stop();
		
    OLED_WriteC(0xb0+y+1);    //Set  page y+1
    OLED_WriteC(0x00+x%16);   //设置列起始地址半字节的低四位
    OLED_WriteC(0x10+x/16);   //设置列起始地址半字节的高四位
    for(j=0;j<8;j++) 
    { 
		tempChar = System_8x16_English[serialNum].code_table[j+8];
		OLED_WriteD(tempChar);
    }
		i2c_Stop();
}

相应的结构体定义

truct show_char8x16{
	unsigned char c;
	unsigned char code_table[16];
};

struct show_chinese_chars{
	unsigned char c[2];
	unsigned char code_table[32];
};

struct show_char8x16 Terminal_8x16[CHAR_8X16_TOTAL_NUM]= 
{
	{'.',{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,0x00}},//句号
	{' ',{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},//空格
	{'0',{0x00,0xF8,0x04,0x04,0xF8,0x00,0x00,0x00,0x00,0x03,0x04,0x04,0x03,0x00,0x00,0x00}},//0
	{'1',{0x00,0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00}},//1
...
};

struct show_chinese_chars	chinese_characters[CHINESE_TOTAL_NUM] = {
{"电",{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,
		0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00}},
{"量",{0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00,
...
};

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值