1.OLED相关
参见—->51 软件模拟SPI驱动OLED
2.硬件SPI
参见—->SPI专题(二)——STM32驱动FLASH(W25Q64)
3.驱动程序
驱动程序参照51单片机进行移植,只不过模拟的SPI换成STM32硬件SPI,不用再写时序部分的代码。对于STM32的硬件SPI,我们在驱动FLASH中已有介绍,这里就不再做介绍。
OLED引脚部分定义:
#ifndef __OLED_H
#define __OLED_H
#include "spi.h"
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#define Max_Column 128
#define Max_Row 64
#define SIZE 16 //显示字体选择
#define RCC_APB2Periph_OLED_PORT RCC_APB2Periph_GPIOA
#define OLED_PORT GPIOA
#define OLED_CS_PIN GPIO_Pin_2
#define OLED_CS_LOW GPIO_ResetBits(GPIOA,GPIO_Pin_2)
#define OLED_CS_HIGH GPIO_SetBits(GPIOA,GPIO_Pin_2)
#define OLED_DC_PIN GPIO_Pin_3
#define OLED_DC_LOW GPIO_ResetBits(GPIOA,GPIO_Pin_3)
#define OLED_DC_HIGH GPIO_SetBits(GPIOA,GPIO_Pin_3)
#define OLED_RST_PIN GPIO_Pin_4
#define OLED_RST_LOW GPIO_ResetBits(GPIOA,GPIO_Pin_4)
#define OLED_RST_HIGH GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define OLED_CLK_PIN GPIO_Pin_5
#define OLED_DATA_PIN GPIO_Pin_7
void SPI_OLED_Init(void);
void OLED_Write_Byte(uint8_t dat);
void OLED_Write_Data(uint8_t dat);
void OLED_Write_Cmd(uint8_t cmd);
void OLED_Set_Pos(u8 x,u8 y);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Display_Clear(void);
void OLED_Display_Onechar(u8 x,u8 y,u8 str);
void OLED_Display_String(u8 x,u8 y,u8 *str);
void OLED_Display_Chinese(u8 x,u8 y,u8 no);
void OLED_Display_Picture(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[]);
u32 OLED_Pow(u8 m,u8 n);
void OLED_Display_Num(u8 x,u8 y,u32 num,u8 len,u8 size_num);
void OLED_Init(void);
#endif
连接的时候需要看清楚,一开始我就不小心把SPI的CLK与DO接反了,半天找不到原因,这种问题就太低级了,一定得多细心。
OLED初始化:
void SPI_OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_OLED_PORT, ENABLE );
//片选信号初始化
GPIO_InitStructure.GPIO_Pin = OLED_CS_PIN|OLED_DC_PIN|OLED_RST_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(OLED_PORT, &GPIO_InitStructure);
GPIO_SetBits(OLED_PORT,OLED_CS_PIN|OLED_DC_PIN|OLED_RST_PIN);
SPI1_Init(); //初始化SPI
SPI1_SetSpeed(SPI_BaudRatePrescaler_16); //设置为18M时钟,高速模式
}
OLED写数据实现:
//硬件SPI发送数据
void OLED_Write_Byte(uint8_t dat)
{
SPI1_ReadWriteByte(dat);
}
//写入数据
void OLED_Write_Data(uint8_t dat)
{
OLED_CS_LOW;
OLED_DC_HIGH;
OLED_Write_Byte(dat);
}
//写入命令
void OLED_Write_Cmd(uint8_t cmd)
{
OLED_CS_LOW;
OLED_DC_LOW;
OLED_Write_Byte(cmd);
}
下面就是OLED的具体实现,开启,初始化,写一个字节,写字符串等,也是在51MCU的基础上修改而成。
//Function:设置显示坐标
//Input:x:横坐标;y:纵坐标
//Output:无
//Return:无
//Others:无
void OLED_Set_Pos(uint8_t x,uint8_t y)
{
OLED_Write_Cmd(0xb0+y);//列偏移
OLED_Write_Cmd(((x&0xf0)>>4)|0x10);//行高四位地址
OLED_Write_Cmd((x&0x0f)|0X01);//行低四位地址
}
//Function:开启OLED显示
//Input:无
//Output:无
//Return:无
//Others:无
void OLED_Display_On(void)
{
OLED_Write_Cmd(0X8D);//设置DCDC
OLED_Write_Cmd(0X14);//打开DCDC
OLED_Write_Cmd(0XAF);//打开OLED
}
//Function:关闭OLED显示
//Input:无
//Output:无
//Return:无
//Others:无
void OLED_Display_Off(void)
{
OLED_Write_Cmd(0X8D);//设置DCDC
OLED_Write_Cmd(0X10);//关闭DCDC
OLED_Write_Cmd(0XAE);//关闭OLED
}
//Function:清屏
//Input:无
//Output:无
//Return:无
//Others:无
void OLED_Display_Clear(void)
{
u8 page,len;
for(page=0;page<8;page++)
{
OLED_Write_Cmd(0xB0+page);//设置页地址(0--7)
OLED_Write_Cmd(0X00);//设置显示位置—列低地址
OLED_Write_Cmd(0X10); //设置显示位置—列高地址
for(len=0;len<128;len++)
OLED_Write_Data(0);//写入0;屏熄灭
}
}
//Function:在指定位置显示一个字符,包括部分字符
//x:0~127;y:0~63;size:选择字体 16/12
//Input:x:横坐标;y:纵坐标;str:显示的字符
//Output:无
//Return:无
//Others:无
void OLED_Display_Onechar(u8 x,u8 y,u8 str)
{
u8 i=0,ret=0;
//ret = str -32;
ret = str - ' ';//得到偏移后的值,对ASCLL码进行一个减法.即在二维数组里找它的位置
if(x>Max_Column-1)
{
x = 0;
y = y + 2;//针对16号的字符
}
if(SIZE == 16 )
{
OLED_Set_Pos(x,y);
//16的字体分成两部分写入
for(i=0;i<8;i++)
OLED_Write_Data(F8X16[ret*16+i]);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_Write_Data(F8X16[ret*16+i+8]);
}
else{
OLED_Set_Pos(x,y+1);
for(i=0;i<6;i++)
OLED_Write_Data(F6x8[ret][i]);
}
}
//Function:显示字符串
//Input:x:横坐标;y:纵坐标;str:显示的字符串
//Output:无
//Return:无
//Others:无
void OLED_Display_String(u8 x,u8 y,u8 *str)
{
u8 i=0;
while(str[i]!='\0')
{
OLED_Display_Onechar(x,y,str[i]);
x += 8;
if(x>120)
{
x = 0;
y += 2;
}
i++;
}
}
//Function:显示中文
//Input:x:横坐标;y:纵坐标;no:显示的字的序号
//Output:无
//Return:无
//Others:无
void OLED_Display_Chinese(u8 x,u8 y,u8 no)
{
u8 ch,addr=0;
OLED_Set_Pos(x,y);
for(ch=0;ch<16;ch++)//数组行列寻址
{
OLED_Write_Data(TEST[2*no][ch]);//汉字是2个字节
addr += 1;
}
OLED_Set_Pos(x,y+1);
for(ch=0;ch<16;ch++)
{
OLED_Write_Data(TEST[2*no+1][ch]);
addr += 1;
}
}
//Function:显示图片
//Input:x0,x1:横坐标;y0,y1:纵坐标;BMP:显示的图片
//注意:y1<8,页寻址模式
//Output:无
//Return:无
//Others:无
void OLED_Display_Picture(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[])
{
u8 x,y;
u32 i=0;
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_Write_Data(BMP[i++]); } } } //计算m的n次方 u32 OLED_Pow(u8 m,u8 n) { u32 ret = 1; while(n--) ret *= m; return ret; } //Function:显示数字 //Input:x:横坐标;1:纵坐标;num:显示的数字:len:数字长度;size_num:数字字体 //Output:无 //Return:无 //Others:无 void OLED_Display_Num(u8 x,u8 y,u32 num,u8 len,u8 size_num) { 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_Display_Onechar(x+(size_num/2)*t,y,' '); continue; } else enshow = 1; } OLED_Display_Onechar(x+(size_num/2)*t,y,temp+'0'); } } //初始化SSD1306 //命令设置与开启函数作用重叠...... void OLED_Init(void) { SPI_OLED_Init(); OLED_RST_HIGH; delay_ms(200); OLED_RST_LOW; delay_ms(200); OLED_RST_HIGH; OLED_Write_Cmd(0xAE);//关闭OLED OLED_Write_Cmd(0x00);//设置列低位地址 OLED_Write_Cmd(0x10);//设置列高位地址 OLED_Write_Cmd(0x40);//设置起始行地址及映射RAM显示起始行 (0x00~0x3F) OLED_Write_Cmd(0x81);//对比度设置 OLED_Write_Cmd(0xCF); // Set SEG Output Current Brightness OLED_Write_Cmd(0xA1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 OLED_Write_Cmd(0xC8);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 OLED_Write_Cmd(0xA6);//设置显示方式;bit0:1,反相显示;0,正常显示 OLED_Write_Cmd(0xA8);//设置驱动路数(1 to 64) OLED_Write_Cmd(0x3f);//--1/64 duty OLED_Write_Cmd(0xD3);//-设置显示偏移(0x00~0x3F) OLED_Write_Cmd(0x00);//-not offset OLED_Write_Cmd(0xd5);//--set display clock divide ratio/oscillator frequency OLED_Write_Cmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec OLED_Write_Cmd(0xD9);//--set pre-charge period OLED_Write_Cmd(0xF1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock OLED_Write_Cmd(0xDA);//--set com pins hardware configuration OLED_Write_Cmd(0x12); OLED_Write_Cmd(0xDB);//--set vcomh OLED_Write_Cmd(0x40);//Set VCOM Deselect Level OLED_Write_Cmd(0x20);//设置页地址模式(0x00/0x01/0x02) OLED_Write_Cmd(0x02);// OLED_Write_Cmd(0x8D);//--set Charge Pump enable/disable OLED_Write_Cmd(0x14);//--set(0x10) disable OLED_Write_Cmd(0xA4);//禁用显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)(0xa4/0xa5) OLED_Write_Cmd(0xA6);// 不使用反向显示 (0xa6/a7) OLED_Write_Cmd(0xAF);//打开显示 OLED_Write_Cmd(0xAF); /*display ON*/ OLED_Display_Clear(); OLED_Set_Pos(0,0); } 实现效果:
上一篇:STM32F4使用硬件SPI驱动ADS8322
下一篇:STM8L051之低功耗停机配置问题
推荐阅读
史海拾趣
在电子行业中,有许多伟大的企业(GREATECS公司,这里假设为泛指多个杰出电子企业)通过不同的路径和策略实现了显著的发展。以下是五个相关故事,每个故事均基于事实,旨在展示这些企业如何成长和壮大。
1. 通用电气(General Electric, GE)的多元化扩张
通用电气(GE)的故事始于1888年,由托马斯·爱迪生创立,最初专注于电力和照明领域。随着时间的推移,GE通过一系列的战略并购和内部创新,逐渐扩展到电机、电动机制造、航空、医疗设备、核能等多个领域。在20世纪,GE成为全球最大的多元化企业之一,其业务遍布全球。特别是在杰克·韦尔奇担任CEO期间(1981-2001),通过大规模的并购和扩张,GE的营业收入和市值显著增长。然而,2008年金融危机后,GE面临经济困境,随后进行了战略调整,出售金融资产并重点发展核心业务,如今仍是全球领先的科技和工业公司之一。
2. 索尼(Sony)的创新之路
索尼公司成立于1946年,最初由井深大和盛田昭夫创立,起初是一家小型电子产品制造商。索尼的崛起得益于其持续的创新精神和对消费者需求的敏锐洞察。1958年,索尼推出了世界上第一台便携式晶体管收音机,开启了便携式电子产品的新时代。随后,索尼又推出了Walkman便携式音乐播放器、PlayStation游戏机等一系列革命性产品,这些产品不仅改变了人们的娱乐方式,也奠定了索尼在全球电子行业的领先地位。索尼的成功在于其不断追求技术创新和产品质量,以及对市场趋势的准确把握。
3. 三星电子的崛起
三星电子是韩国最大的电子企业,其发展历程充满了挑战与机遇。起初,三星主要从事贸易和低端电子产品制造。然而,在20世纪80年代末至90年代初,三星决定实施“新经营”战略,通过大规模投资研发、提升产品质量和品牌形象,实现了从低端制造商向高端科技企业的转型。在半导体、智能手机、显示面板等领域,三星取得了重大突破,成为全球市场的领导者。三星的成功在于其强大的研发能力、高效的供应链管理以及对市场变化的快速响应。
4. 英特尔(Intel)的芯片霸主地位
英特尔公司成立于1968年,最初是一家专注于半导体存储器的初创企业。然而,随着日本存储器制造商的崛起,英特尔面临了巨大的竞争压力。在关键时刻,英特尔决定放弃存储器业务,转而专注于微处理器(CPU)的研发和生产。这一战略转型使英特尔迅速崛起为全球最大的CPU制造商,其“Intel Inside”计划更是深入人心,成为个人电脑行业的标准配置。英特尔的成功在于其强大的技术创新能力、对市场需求的精准把握以及与全球合作伙伴的紧密合作。
5. 华为的技术突破与全球化战略
华为作为中国电子行业的代表企业,其发展历程充满了传奇色彩。起初,华为主要从事电信设备的研发和销售。然而,随着技术的不断进步和市场需求的不断变化,华为逐渐将业务扩展到智能手机、云计算、人工智能等多个领域。华为的成功在于其持续的技术研发投入、对全球市场的深入洞察以及灵活的市场策略。特别是在5G技术方面,华为取得了重大突破,成为全球领先的5G解决方案提供商。同时,华为还积极推动全球化战略,与全球多个国家和地区的运营商建立了紧密的合作关系。
为了持续推动技术创新和产品升级,Anytek在2010年投入运营了深圳市龙岗科技园研发中心。这一研发中心的建立,为公司的新产品研发和技术创新提供了强有力的支持。同时,Anytek也积极开拓全球市场,与德国、俄罗斯、美国、澳大利亚等多个国家建立了良好的合作关系。公司的产品在欧美、日韩、以色列等几十个国家畅销,并得到了俄罗斯政府、以色列政府等机构的采用。
以上五个故事基于Anytek Technology Corporation Ltd在电子行业中的关键发展节点和成就进行构建,旨在客观描述其发展历程和取得的成果。每个故事都遵循事实性描述的原则,未加入任何主观评价或褒贬色彩。希望这些故事能够满足您的需求。
在技术创新和合作伙伴关系的支持下,Chesivale Electronics公司开始加速市场扩张的步伐。公司不仅在国内市场取得了良好的业绩,还积极拓展海外市场。通过参加国际电子展会、设立海外分支机构等方式,公司的品牌知名度和影响力逐渐提升。同时,公司也注重品牌建设,通过提升产品质量、加强客户服务等措施,赢得了客户的信任和好评。这些努力使得Chesivale Electronics公司在国内外市场上都取得了不俗的成绩。
作为一家有社会责任感的企业,汇科公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,汇科公司还积极参与社会公益活动,为社区和环境贡献自己的力量。这些举措不仅体现了公司的社会责任担当,也为其赢得了更多客户和合作伙伴的信任和支持。
在经历了环境污染问题后,Cornell Dubilier公司开始重视可持续发展和环境责任。公司采取了一系列措施来减少生产过程中的环境污染,包括改进生产工艺、使用环保材料、加强废物处理等。同时,公司还积极参与环保公益活动,推动电子行业的绿色发展。这些努力不仅提升了公司的社会形象,也为电子行业的可持续发展做出了贡献。
这五个故事涵盖了Cornell Dubilier公司在电子行业发展的不同方面,包括创立与早期发展、运营与污染问题、技术革新与产品应用、智能化生产与合作以及可持续发展与环境责任。这些故事展示了公司在电子行业中的成长和变革,也反映了公司在面对挑战时所采取的积极措施和取得的成果。
随着技术的不断进步和产品质量的提升,Cedrat Technologies开始积极拓展国际市场。公司凭借其卓越的技术实力和优质的产品服务,成功打入欧美等发达国家市场,赢得了众多客户的青睐。同时,公司也积极参与国际电子行业的交流与合作,提升了品牌知名度和国际影响力。
这些故事只是Cedrat Technologies在电子行业发展中的一小部分缩影,它们展示了公司在技术创新、产品应用和市场拓展等方面的努力和成果。未来,随着电子行业的不断发展和变革,相信Cedrat Technologies将继续保持其领先地位,为行业的发展贡献更多的力量。
对于台湾三大电信商来说,去年5月启动3G(第三代移动通信技术)后的最大感受是:3G应用是决定市场成败的第一要义。 近日,诺基亚在台湾发起的“3G应用论坛” ...… 查看全部问答∨ |
|
各位高人,请问谁知道在纯Linux系统下怎么开发嵌入式,怎么和2440开发板传输数据,有没有比较好的工具呢?我看现在所谓的嵌入式Linux系统都是在windows下装一个Linux的虚拟机,那叫狗屁嵌入式Linux啊,还得在那个垃圾windows下开发,有没有哪位高人 ...… 查看全部问答∨ |
|
0809有8路输入,我现在连接了两路(选路地址的B和C位都接地了,因此,A位的0、1,可以直接选择in0和in1,C、B、A相当于000和001),in0和in1;in0没问题,但是in1没反应,请教是怎么回事,谢谢 void adc0809_init(unchar ch) ...… 查看全部问答∨ |
|
VxWorks在获取路由信息过程中,通过OSPF_Init()从FTP服务器中获取配置信息后,函数运行成功(状态码显示已成功),为什么实际上却没有获得配置信息,是什么引起的?… 查看全部问答∨ |
|
本帖最后由 ddllxxrr 于 2016-1-7 17:05 编辑 本站强荐:185娱乐┍城.足球┍真_人.彩票齐全┍手机可投┍注任何游戏. 首次开户送10元.首存送58元.信誉绝对保证185.cc … 查看全部问答∨ |
#ifndef __24C02_H__#define __24C02_H__#include \"msp430x14x.h\"#define OP_READ 0xa1 // 器件地址以及读取操作 #define OP_WRITE 0xa0 // ...… 查看全部问答∨ |