背景
芯片: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,
...
};