STM32+四针OLED屏+汉字取模+显示万年历(支持按键修改时间) 您所在的位置:网站首页 ssd1306是什么 STM32+四针OLED屏+汉字取模+显示万年历(支持按键修改时间)

STM32+四针OLED屏+汉字取模+显示万年历(支持按键修改时间)

#STM32+四针OLED屏+汉字取模+显示万年历(支持按键修改时间)| 来源: 网络整理| 查看: 265

一、效果展示

      

                启动界面                                 实时时钟界面                                 时间修改界面

二、模块介绍

1.GND电源地

2. VCC电源正(3~5.5V)

3. SCL OLED的D0脚,在IIC通信中为时钟管脚

4. SDA OLED的D1脚,在IIC通信中为数据管脚

本屏所用的驱动IIC为SSD1306; OLED本身是没有显存的,它的显存是依赖于SSD1306提供的(如TFTLCD是本身自带显存,利用FSMC来进行控制)。

SSD1306的显存总共为128*64bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是128*64的点阵大小。

四针的oled屏幕是通过IIC总线驱动,因此,其启动、停止、读、写等程序都是通用的,我会将程序放在下面,大家直接移植即可。

三、文字取模

对于大家使用oled显示,最主要的是“文字取模”、“设置文字显示的位置”

文字取模:就是将自己想显示的文字转换成十六进制数组,如此单片机才能识别从而显示。

取模软件:PCtoLCD2002

步骤:1、选择文字模式

2、配置取模模式 

 3、输入文字,生成字模

 之后将生成的数组,复制到keil5工程相应的文件中,直接在函数中调用编号即可

注意:粘贴过来的一串十六进制,在数组中的位置应该与你函数中调用的编号一致,如此才能通过函数完成相应的显示(如:第二个大红框代表的是“欢”,在数组的编号为1,函数中输入1即可)

调用OLED_ShowCN(u8 x,u8 y,u8 z)函数显示,修改第三个变量,为想要显示的文字在数组中的编号。

 四、相关程序main.c#include "stm32f10x.h" #include "led.h" #include "delay.h" #include "deep.h" #include "key.h" #include "sys.h" #include "oled_i2c.h" #include "rtc.h" int main(void) { u8 Dis_mode; //显示状态标志 0:显示传感器数据界面 1:显示日期时间界面 delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 LED_Init(); KEY_Init(); OLED_Init(); //OLED初始化 delay_ms(50); OLED_CLS(); //清屏 OLED_ShowCN(16*2,1,1); //欢 OLED_ShowCN(16*3,1,2); //迎 OLED_ShowCN(16*4,1,3); //使 OLED_ShowCN(16*5,1,4); //用 OLED_ShowCN(8,4,5); //耀 OLED_ShowCN(16+8,4,6); //鑫 OLED_ShowCN(16*2+8,4,7); //电 OLED_ShowCN(16*3+8,4,8); //子 OLED_ShowCN(16*4+8,4,9); //显 OLED_ShowCN(16*5+8,4,10); //示 OLED_ShowCN(16*6+8,4,11); //屏 RTC_Init(); delay_ms(5000); OLED_CLS(); //清屏 Dis_mode=1; while(1) { Key_set(); //按键检测 switch(Dis_mode) { case 1: //在显示时间界面 RTC_Display(); //显示时钟 break; } } } oled_iic.c/************************************************************************************ * Description:128*64点阵的OLED显示屏驱动文件,仅适用于惠特自动化(heltec.taobao.com)的SD1306驱动IIC通信方式显示屏 * * Others: none; * * Function List: * 1. void I2C_Configuration(void) -- 配置CPU的硬件I2C * 2. void I2C_WriteByte(uint8_t addr,uint8_t data) -- 向寄存器地址写一个byte的数据 * 3. void WriteCmd(unsigned char I2C_Command) -- 写命令 * 4. void WriteDat(unsigned char I2C_Data) -- 写数据 * 5. void OLED_Init(void) -- OLED屏初始化 * 6. void OLED_SetPos(unsigned char x, unsigned char y) -- 设置起始点坐标 * 7. void OLED_Fill(unsigned char fill_Data) -- 全屏填充 * 8. void OLED_CLS(void) -- 清屏 * 9. void OLED_ON(void) -- 唤醒 * 10. void OLED_OFF(void) -- 睡眠 * 11. void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize) -- 显示字符串(字体大小有6*8和8*16两种) * 12. void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N) -- 显示中文(中文需要先取模,然后放到codetab.h中) * 13. void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]) -- BMP图片 * * History: none; * *************************************************************************************/ #include "oled_i2c.h" #include "delay.h" #include "codetab.h" //extern u8 display_1[4]; //当前状态(oled显示的汉字在数组中的索引) extern u8 display_time_flag; //初始化IIC void IIC_Init2(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高 } //产生IIC起始信号 void IIC_Start(void) { SDA_OUT(); //sda线输出 IIC_SDA=1; IIC_SCL=1; //delay_us(4); IIC_SDA=0;//START:when CLK is high,DATA change form high to low //delay_us(4); IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 } //产生IIC停止信号 void IIC_Stop(void) { SDA_OUT();//sda线输出 IIC_SCL=0; IIC_SDA=0;//STOP:when CLK is high DATA change form low to high //delay_us(4); IIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号 //delay_us(4); } //等待应答信号到来 //返回值:1,接收应答失败 // 0,接收应答成功 u8 IIC_Wait_Ack(void) { u8 ucErrTime=0; SDA_IN(); //SDA设置为输入 IIC_SDA=1;/*delay_us(1)*/; IIC_SCL=1;/*delay_us(1)*/; while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } IIC_SCL=0;//时钟输出0 return 0; } //产生ACK应答 void IIC_Ack(void) { IIC_SCL=0; SDA_OUT(); IIC_SDA=0; //delay_us(2); IIC_SCL=1; //delay_us(2); IIC_SCL=0; } //不产生ACK应答 void IIC_NAck(void) { IIC_SCL=0; SDA_OUT(); IIC_SDA=1; //delay_us(2); IIC_SCL=1; //delay_us(2); IIC_SCL=0; } //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); IIC_SCL=0;//拉低时钟开始数据传输 for(t=0;t>7; if((txd&0x80)>>7) IIC_SDA=1; else IIC_SDA=0; txd23) shour = 0; } // if(KEY3==0) // { // while(KEY3==0); // if(shour>0) // shour--; // } sprintf((char*)disp,":%d-%02d-%02d",syear,smonth,sday); OLED_ShowStr(32,2,(u8 *)disp,2); sprintf((char*)disp,">%02d:%02d:%02d",shour,smin,0); OLED_ShowStr(32,4,(u8 *)disp,2); } if(ic==4) //分设置 { if(KEY2==1) { while(KEY2==1); smin++; if(smin>59) smin = 0; } // if(KEY3==0) // { // while(KEY3==0); // if(smin>0) // smin--; // } sprintf((char*)disp,":%d-%02d-%02d",syear,smonth,sday); OLED_ShowStr(32,2,(u8 *)disp,2); sprintf((char*)disp,":%02d>%02d:%02d",shour,smin,0); OLED_ShowStr(32,4,(u8 *)disp,2); } if(ic==5) //退出设置 返回到时间显示界面 { RTC_Set(syear,smonth,sday,shour,smin,0); //设置时间 Dis_mode = 1; //显示状态标志 0:显示传感器数据 1:显示日期时间 OLED_CLS(); //清屏 ic =0; break; } } } } key.h#ifndef __KEY_H #define __KEY_H #include "sys.h" //#define KEY0 PEin(4) //PE4 //#define KEY1 PEin(3) //PE3 //#define WK_UP PAin(0) //PA0 WK_UP #define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0 #define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1 #define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP) #define KEY0_PRES 1 //KEY0按下 #define KEY1_PRES 2 //KEY1按下 #define WKUP_PRES 3 //KEY_UP按下(即WK_UP/KEY_UP) void KEY_Init(void);//IO初始化 void Key_set(void); #endif

完整工程链接:https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-24450682685.9.14cc609dJigFZh&id=692552845345



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有