历史上的今天
返回首页

历史上的今天

今天是:2025年04月07日(星期一)

正在发生

2020年04月07日 | MSP430F149程序移植——0.96OLED(ssd1306驱动)

2020-04-07 来源:eefocus

一、引脚说明

1.1 接口定义

image.png?imageView2/2/w/550

1.2 硬件连接

image.png?imageView2/2/w/550

1.3 总线协议

IO口软件模拟SPI


1.4 软件控制流程

①IO初始化。


②根据时序初始化LCD。


③显示。


二、移植文件

将 oled.c 、 oled.h 、bmp.h文件加入到工程文件夹下


2.1 oled.c

#include "oled.h"

#include "oledfont.h"   


//向SSD1306写入一个字节。

//dat:要写入的数据/命令

//cmd:数据/命令标志 0,表示命令;1,表示数据;

void OLED_WR_Byte(u8 dat, u8 cmd)

{

u8 i;

if (cmd)

OLED_DC_Set();

else

OLED_DC_Clr();

OLED_CS_Clr();

for (i = 0; i<8; i++)

{

OLED_SCLK_Clr();

if (dat & 0x80)

{

OLED_SDIN_Set();

}

else

OLED_SDIN_Clr();

OLED_SCLK_Set();

dat <<= 1;

}

OLED_CS_Set();

OLED_DC_Set();

}


void OLED_Set_Pos(unsigned char x, unsigned char y)

{

OLED_WR_Byte(0xb0 + y, OLED_CMD);

OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);

OLED_WR_Byte((x & 0x0f) | 0x01, OLED_CMD);

}

//开启OLED显示    

void OLED_Display_On(void)

{

OLED_WR_Byte(0X8D, OLED_CMD);  //SET DCDC命令

OLED_WR_Byte(0X14, OLED_CMD);  //DCDC ON

OLED_WR_Byte(0XAF, OLED_CMD);  //DISPLAY ON

}

//关闭OLED显示     

void OLED_Display_Off(void)

{

OLED_WR_Byte(0X8D, OLED_CMD);  //SET DCDC命令

OLED_WR_Byte(0X10, OLED_CMD);  //DCDC OFF

OLED_WR_Byte(0XAE, OLED_CMD);  //DISPLAY OFF

}

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!   

void OLED_Clear(void)

{

u8 i, n;

for (i = 0; i<8; i++)

{

OLED_WR_Byte(0xb0 + i, OLED_CMD);    //设置页地址(0~7)

OLED_WR_Byte(0x00, OLED_CMD);      //设置显示位置—列低地址

OLED_WR_Byte(0x10, OLED_CMD);      //设置显示位置—列高地址   

for (n = 0; n<128; n++)OLED_WR_Byte(0, OLED_DATA);

} //更新显示

}



//在指定位置显示一个字符,包括部分字符

//x:0~127

//y:0~63

//mode:0,反白显示;1,正常显示  

//size:选择字体 16/12 

void OLED_ShowChar(u8 x, u8 y, u8 chr)

{

unsigned char c = 0, i = 0;

c = chr - ' ';//得到偏移后的值

if (x>Max_Column - 1){ x = 0; y = y + 2; }

if (SIZE == 16)

{

OLED_Set_Pos(x, y);

for (i = 0; i<8; i++)

OLED_WR_Byte(F8X16[c * 16 + i], OLED_DATA);

OLED_Set_Pos(x, y + 1);

for (i = 0; i<8; i++)

OLED_WR_Byte(F8X16[c * 16 + i + 8], OLED_DATA);

}

else {

OLED_Set_Pos(x, y + 1);

for (i = 0; i<6; i++)

OLED_WR_Byte(F6x8[c][i], OLED_DATA);


}

}

//m^n函数

u32 oled_pow(u8 m, u8 n)

{

u32 result = 1;

while (n--)result *= m;

return result;

}

//显示2个数字

//x,y :起点坐标  

//len :数字的位数

//size:字体大小

//mode:模式 0,填充模式;1,叠加模式

//num:数值(0~4294967295);   

void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 size2)

{

u8 t, temp;

u8 enshow = 0;

for (t = 0; t {

temp = (num / oled_pow(10, len - t - 1)) % 10;

if (enshow == 0 && t<(len - 1))

{

if (temp == 0)

{

OLED_ShowChar(x + (size2 / 2)*t, y, ' ');

continue;

}

else enshow = 1;


}

OLED_ShowChar(x + (size2 / 2)*t, y, temp + '0');

}

}

//显示一个字符号串

void OLED_ShowString(u8 x, u8 y, u8 *chr)

{

unsigned char j = 0;

while (chr[j] != '')

{

OLED_ShowChar(x, y, chr[j]);

x += 8;

if (x>120){ x = 0; y += 2; }

j++;

}

}

//显示汉字

void OLED_ShowCHinese(u8 x, u8 y, u8 no)

{

u8 t, adder = 0;

OLED_Set_Pos(x, y);

for (t = 0; t<16; t++)

{

OLED_WR_Byte(Hzk[2 * no][t], OLED_DATA);

adder += 1;

}

OLED_Set_Pos(x, y + 1);

for (t = 0; t<16; t++)

{

OLED_WR_Byte(Hzk[2 * no + 1][t], OLED_DATA);

adder += 1;

}

}

/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/

void OLED_DrawBMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[])

{

unsigned int j = 0;

unsigned char x, y;


if (y1 % 8 == 0) y = y1 / 8;

else y = y1 / 8 + 1;

for (y = y0; y {

OLED_Set_Pos(x0, y);

for (x = x0; x {

OLED_WR_Byte(BMP[j++], OLED_DATA);

}

}

}



//初始化SSD1306     

void OLED_Init(void)

{

OLED_SSD1306_SCLK_IO_INIT;

OLED_SSD1306_SDIN_IO_INIT;

OLED_SSD1306_DC_IO_INIT;

OLED_SSD1306_CE_IO_INIT;

OLED_SSD1306_RST_IO_INIT;


OLED_RST_Set();

delay_ms(100);

OLED_RST_Clr();

delay_ms(100);

OLED_RST_Set();


OLED_WR_Byte(0xAE, OLED_CMD);//--turn off oled panel

OLED_WR_Byte(0x00, OLED_CMD);//---set low column address

OLED_WR_Byte(0x10, OLED_CMD);//---set high column address

OLED_WR_Byte(0x40, OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)

OLED_WR_Byte(0x81, OLED_CMD);//--set contrast control register

OLED_WR_Byte(0xCF, OLED_CMD); // Set SEG Output Current Brightness

OLED_WR_Byte(0xA1, OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常

OLED_WR_Byte(0xC8, OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常

OLED_WR_Byte(0xA6, OLED_CMD);//--set normal display

OLED_WR_Byte(0xA8, OLED_CMD);//--set multiplex ratio(1 to 64)

OLED_WR_Byte(0x3f, OLED_CMD);//--1/64 duty

OLED_WR_Byte(0xD3, OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)

OLED_WR_Byte(0x00, OLED_CMD);//-not offset

OLED_WR_Byte(0xd5, OLED_CMD);//--set display clock divide ratio/oscillator frequency

OLED_WR_Byte(0x80, OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec

OLED_WR_Byte(0xD9, OLED_CMD);//--set pre-charge period

OLED_WR_Byte(0xF1, OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

OLED_WR_Byte(0xDA, OLED_CMD);//--set com pins hardware configuration

OLED_WR_Byte(0x12, OLED_CMD);

OLED_WR_Byte(0xDB, OLED_CMD);//--set vcomh

OLED_WR_Byte(0x40, OLED_CMD);//Set VCOM Deselect Level

OLED_WR_Byte(0x20, OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)

OLED_WR_Byte(0x02, OLED_CMD);//

OLED_WR_Byte(0x8D, OLED_CMD);//--set Charge Pump enable/disable

OLED_WR_Byte(0x14, OLED_CMD);//--set(0x10) disable

OLED_WR_Byte(0xA4, OLED_CMD);// Disable Entire Display On (0xa4/0xa5)

OLED_WR_Byte(0xA6, OLED_CMD);// Disable Inverse Display On (0xa6/a7) 

OLED_WR_Byte(0xAF, OLED_CMD);//--turn on oled panel


OLED_WR_Byte(0xAF, OLED_CMD); /*display ON*/

OLED_Clear();

OLED_Set_Pos(0, 0);

}


//显示一个字符号的首个字符

void LCD_WriteChar(u8 x, u8 y, u8 *chr)

{

if (*chr != '')

{

OLED_ShowChar(x, y, *chr);

}

}



void LCD_WriteStrings(u8 x, u8 y, char *str, u8 Len)

{

u8  i, j, Val_H, Val_L;

u16 Val;

if (Len == 0)

Len = strlen(str);

for (i = 0; i {

Val_H = *(str + i);

if (Val_H >= 0xA1)

{

Val_L = *(str + i + 1);

if (Val_L >= 0xA1)

{

Val = Val_H * 256 + Val_L;

i = i + 1;

for (j = 0; j {

if (ALL_CN_Font[j].ASC_Value == Val) break;

}

if (j == ALL_CN_NUM)   continue;

                                OLED_ShowCHinese(x + 8 * i - 8, y, j);

}

}

else

{

                        LCD_WriteChar(x + 8 * i, y, str + i);

}

}

}


2.oled.h

#ifndef __OLED_H

#define __OLED_H


//              GND    电源地

//              VCC  接5V或3.3v电源

//              D0   P1.3(SCL)

//              D1   P1.4(SDA)

//              RES  接P1.1

//              DC   接P1.2

//              CS   接P1.0 

   

#include

#include

#include  


#define  u8 unsigned char 

#define  u32 unsigned int 


#define OLED_CMD  0 //写命令

#define OLED_DATA 1 //写数据



#define Set_Bit(val, bitn) (val |= (bitn))

#define Clr_Bit(val, bitn) (val &= ~(bitn))

#define Get_Bit(val, bitn) (val & (1<<(bitn)))

//----------------------------------------------------------------------------------

//OLED SSD1306 SPI  时钟D0

//#define OLED_SSD1306_SCLK_DIR (P1DIR)

//#define OLED_SSD1306_SCLK_OUT (P1OUT)

#define OLED_SSD1306_SCLK_PIN_NUM (BIT3)


#define OLED_SSD1306_SCLK_IO_INIT (Set_Bit(P1DIR,OLED_SSD1306_SCLK_PIN_NUM))

#define OLED_SCLK_Set()         (Set_Bit(P1OUT,OLED_SSD1306_SCLK_PIN_NUM))

#define OLED_SCLK_Clr() (Clr_Bit(P1OUT,OLED_SSD1306_SCLK_PIN_NUM))


//----------------------------------------------------------------------------------

//OLED SSD1306 SPI 数据D1

//#define OLED_SSD1306_SDIN_DIR (P1DIR)

//#define OLED_SSD1306_SDIN_OUT (P1OUT)

#define OLED_SSD1306_SDIN_PIN_NUM (BIT4)


#define OLED_SSD1306_SDIN_IO_INIT (Set_Bit(P1DIR,OLED_SSD1306_SDIN_PIN_NUM))

#define OLED_SDIN_Set() (Set_Bit(P1OUT,OLED_SSD1306_SDIN_PIN_NUM))

#define OLED_SDIN_Clr()         (Clr_Bit(P1OUT,OLED_SSD1306_SDIN_PIN_NUM))


//----------------------------------------------------------------------------------

//OLED SSD1306 数据/命令DC

//#define OLED_SSD1306_DC_DIR (P1DIR)

//#define OLED_SSD1306_DC_OUT (P1OUT)

#define OLED_SSD1306_DC_PIN_NUM (BIT2)


#define OLED_SSD1306_DC_IO_INIT (Set_Bit(P1DIR,OLED_SSD1306_DC_PIN_NUM))

#define OLED_DC_Set() (Set_Bit(P1OUT,OLED_SSD1306_DC_PIN_NUM))

#define OLED_DC_Clr() (Clr_Bit(P1OUT,OLED_SSD1306_DC_PIN_NUM))


//----------------------------------------------------------------------------------

//OLED SSD1306 片选CS

//#define OLED_SSD1306_CE_DIR (P1DIR)

//#define OLED_SSD1306_CE_OUT (P1OUT)

#define OLED_SSD1306_CE_PIN_NUM (BIT0)


#define OLED_SSD1306_CE_IO_INIT (Set_Bit(P1DIR,OLED_SSD1306_CE_PIN_NUM))

#define OLED_CS_Set() (Set_Bit(P1OUT,OLED_SSD1306_CE_PIN_NUM))

#define OLED_CS_Clr() (Clr_Bit(P1OUT,OLED_SSD1306_CE_PIN_NUM))


//----------------------------------------------------------------------------------

//OLED SSD1306 复位/RES

//#define OLED_SSD1306_RST_DIR (P1DIR)

//#define OLED_SSD1306_RST_OUT (P1OUT)

#define OLED_SSD1306_RST_PIN_NUM (BIT1)


#define OLED_SSD1306_RST_IO_INIT (Set_Bit(P1DIR,OLED_SSD1306_RST_PIN_NUM))

#define OLED_RST_Set() (Set_Bit(P1OUT,OLED_SSD1306_RST_PIN_NUM))

#define OLED_RST_Clr() (Clr_Bit(P1OUT,OLED_SSD1306_RST_PIN_NUM))


#define SIZE 16

#define XLevelL 0x02

#define XLevelH 0x10

#define Max_Column 128

#define Max_Row 64

#define Brightness 0xFF 

#define X_WIDTH 128

#define Y_WIDTH 64       

//-----------------OLED端口定义----------------     


#define CPU_F ((double)12000000)        //延时函数所需时钟频率/Hz

推荐阅读

史海拾趣

Aptos Technology公司的发展小趣事

为了加速发展,Aptos积极寻求与行业内外的合作伙伴建立合作关系。通过与微软、阿里云等知名公司的合作,Aptos获得了更多的技术支持和市场资源。这些合作伙伴关系的建立,不仅提升了Aptos的技术实力和市场竞争力,还为其未来的发展奠定了坚实的基础。

DLG Hanbit公司的发展小趣事

随着技术的不断进步和市场需求的增长,DLG Hanbit公司意识到技术创新是保持竞争力的关键。公司加大了对研发的投入,引进了一批高端人才,并建立了完善的研发体系。经过几年的努力,公司成功开发出了一系列具有自主知识产权的半导体产品,如高性能的处理器、存储器等。这些产品凭借卓越的性能和稳定的品质,在市场上赢得了良好的口碑,公司也逐渐拓展了市场份额。

Bogen Communications Inc公司的发展小趣事

随着电子行业的快速发展和变革,Bogen Communications Inc公司面临着巨大的挑战。为了应对这些变革,公司不断调整战略、优化组织结构、提升研发能力。同时,公司还密切关注行业动态和市场需求,及时调整产品方向和市场策略。通过这些努力,公司成功地适应了行业变革,保持了稳健的发展态势。

Dolphin Interconnect Solutions Asa公司的发展小趣事

为了加快市场拓展和技术创新,Dolphin Interconnect Solutions ASA积极寻求与其他公司的战略合作。例如,公司与StarGen公司进行了换股合并,共同开发Express产品。这一合作不仅为Dolphin带来了先进的技术和人才,还进一步拓宽了公司的产品线,提高了市场竞争力。

China Semiconductor Corp公司的发展小趣事

随着公司的发展,CSC逐渐意识到技术创新是立足之本。于是,公司加大了研发投入,引进了一批高端人才,建立了完善的研发体系。通过不懈的努力,CSC在多个领域取得了重大突破,如高性能处理器、存储器等关键技术的研发,使公司在国际市场上逐渐获得了话语权。

Cramer公司的发展小趣事

在早期的发展阶段,Cramer公司推出了一款革命性的智能手机。这款手机采用了最新的芯片技术和高分辨率显示屏,为用户提供了出色的使用体验。为了满足市场需求,Cramer公司加大了研发投入,不断优化产品性能。最终,这款手机在市场上取得了巨大的成功,为Cramer公司带来了可观的收益,并奠定了其在电子行业中的地位。

问答坊 | AI 解惑

天线设计

天线设计手册,给大家下载…

查看全部问答>

恢复屏保巨慢??、

屏保时间超过3到4分钟要恢复屏保巨慢,要等好长时间才能到输入密码登陆界面? 笔记本配置: ThinkPad X200 R49主要性能 CPU类型 Intel 酷睿2双核 T9550 最高主频 2.6GHz 前端总线 1066MHz 二级缓存 6MB 迅驰技术 迅驰II 主板描述 I ...…

查看全部问答>

wince下用IImagingFactory将rgb565的bmp转成jpg

IImagingFactory将rgb555的bmp数据保存成jpg文件时是成功的,rgb565的话就会出错,是不是不支持565格式?…

查看全部问答>

【讨论】WINCE下媒体播放器播放不流畅的原因以及解决办法

这两天在分析当前案子的媒体播放器为什么播放部分文件会非常的不流畅。 发个帖子大家一起讨论下。集中下大家在调试wince下媒体播放器播放媒体文件不流畅的原因 我先说下这里的问题 1. 系统基于ARM 9 + WINCE 5.O + MPU屏 320*240 2. 播放器测试 ...…

查看全部问答>

s3c2440电源管理主要问题及其解决方法 -- 转

最近由于项目需要,得做2440上的电源管理,之前没有做过,所以出现了不少问题,现将过程中出现的主要问题及其解决方法列出如下: 1、系统睡眠与唤醒,拿到普通的代码,出现的问题经常是进入睡眠后,GPIO唤醒总是导致系统重新启动,其实这是因为没有 ...…

查看全部问答>

求救STR71x与NANDFlash三星编程问题

                                 我是ARM初学者,现在用STR71x系列的,谁能给我STR71x与NANDFlash三星K9F2808UOC后者相关的NANDFlash连接的的方法和 ...…

查看全部问答>

全国2013届高校毕业生重点行业系列网络招聘活动

——招专业人才,上一览英才 应届大学毕业生是社会的一个特殊群体,是指接受过大学教育的人,作为社会新技术、新思想的前沿群体、国家培养的高级专业人才。一直以专业知识强、综合素质高、有理想、有激情、发展潜力大、可塑性强而著称,应届毕业 ...…

查看全部问答>

圆点博士小四轴飞行器(完全开源)之-如何通过无线下载STM32固件教程

圆点博士小四轴飞行器(完全开源)之-如何通过无线下载STM32固件教程 第一步:预先给小四轴刷入固件:fwh_mb_notfor_bl.hex。(该固件文件可以直接从官网下载。该固件的说明文件如下) ============================================= modify in 2 ...…

查看全部问答>

J题电磁控制的 用电磁铁貌似磁力不够啊

本帖最后由 paulhyde 于 2014-9-15 03:29 编辑 如题~ 大家有什么建议没~    …

查看全部问答>

verilog hdl教程135例

verilog hdl教程135例,很好用!!!! …

查看全部问答>