基于STM32F103C8T6的OLED菜单界面(IIC控制)

基于STM32F103C8T6的OLED菜单界⾯(IIC控制)
基于STM32F103C8T6的简单版OLED菜单界⾯
之前做了个的测试电机转速的测试板,还有不知道什么时候买的OLED屏(还只有IIC接⼝),刚好⽤来做个菜单练练⼿,显⽰效果如下:
环境:
1.核⼼板:STM32F103C8T6最⼩系统板以及⼀些按键开关
2.OLED显⽰模块:IIC接⼝(因为我买的OLED是⽼)
3.编译环境:Keil MDK
要OLED模块做个简单的三级菜单显⽰,其实只要做好界⾯显⽰就⾏了,这个⽹上有很多例程,由于我的OLED模块只有IIC的脚位,我就简要说说我怎么通过配置IIC来实现OLED模块的三级菜单显⽰。
⾸先要像点灯⼀样先把OLED点亮,借鉴了⼀下⽹上的例程,做了些更改,⼤致如下:
⾸先看下main函数:
int main(void)
{
delay_init();
LED_Init();
key_init();
I2C_Configuration();
OLED_Init();
//Adc_init();
//TIM1_Encoder_Init(1024-1,0);
//TIM2_Encoder_Init(1024-1,0);
TIM3_init(1000-1,72-1);
OLED_CLS();//清屏
while(1)
{
deal_allkey_press();//处理各种按键事件
Mision_1ms();//1ms扫描任务
//show_num();//数码管显⽰
show_UI();//OLED显⽰
}
}
然后是IIC的配置
void I2C_Configuration(void)
{
I2C_InitTypeDef  I2C_InitStructure;
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
/*STM32F103C8T6芯⽚的硬件I2C: PB6 -- SCL; PB7 -- SDA */
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C必须开漏输出
GPIO_Init(GPIOB,&GPIO_InitStructure);
I2C_DeInit(I2C1);//使⽤I2C1
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 =0x30;//主机的I2C地址,随便写的
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed =400000;//400K
I2C_Cmd(I2C1,ENABLE);
I2C_Init(I2C1,&I2C_InitStructure);
}
void I2C_WriteByte(uint8_t addr,uint8_t data)
{
//固件库
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1,ENABLE);//开启I2C1
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
I2C_Send7bitAddress(I2C1,OLED_ADDRESS, I2C_Direction_Transmitter);//器件地址 -- 默认0x78 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, addr);//寄存器地址
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, data);//发送数据
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1,ENABLE);//关闭I2C1总线
}
void WriteCmd(unsigned char I2C_Command)//写命令
{
I2C_WriteByte(0x00, I2C_Command);
}
void WriteDat(unsigned char I2C_Data)//写数据
{
I2C_WriteByte(0x40, I2C_Data);
}
接着根据⼀些例⼦改写的OLED模块的配置,当然下⾯还需要⼀个对应的取模头⽂件codetab.h
#include "oled_iic.h"
#include "codetab.h"
#include "timer.h"
#include "led.h"
#include <stdio.h>
void OLED_Init(void)
{
// delay_ms(100); //这⾥的延时很重要
delay_ms(50);//这⾥的延时很重要
WriteCmd(0xAE);//display off
WriteCmd(0x20);//Set Memory Addressing Mode
WriteCmd(0x10);//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid WriteCmd(0xb0);//Set Page Start Address for Page Addressing Mode,0-7
WriteCmd(0xc8);//Set COM Output Scan Direction
WriteCmd(0x00);//---set low column address
WriteCmd(0x10);//---set high column address
WriteCmd(0x40);//--set start line address
WriteCmd(0x81);//--set contrast control register
WriteCmd(0xff);//亮度调节 0x00~0xff
WriteCmd(0xa1);//--set segment re-map 0 to 127
WriteCmd(0xa6);//--set normal display
WriteCmd(0xa8);//--set multiplex ratio(1 to 64)
WriteCmd(0x3F);//
WriteCmd(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
WriteCmd(0xd3);//-set display offset
WriteCmd(0x00);//-not offset
WriteCmd(0xd5);//--set display clock divide ratio/oscillator frequency
WriteCmd(0xf0);//--set divide ratio
WriteCmd(0xd9);//--set pre-charge period
WriteCmd(0x22);//
WriteCmd(0xda);//--set com pins hardware configuration
WriteCmd(0x12);
WriteCmd(0xdb);//--set vcomh
WriteCmd(0x20);//0x20,0.77xVcc
WriteCmd(0x8d);//--set DC-DC enable
WriteCmd(0x14);//
WriteCmd(0xaf);//--turn on oled panel
}
void OLED_SetPos(unsigned char x, unsigned char y)//设置起始点坐标
{
WriteCmd(0xb0+y);
WriteCmd(((x&0xf0)>>4)|0x10);
WriteCmd((x&0x0f)|0x01);
}
void OLED_Fill(unsigned char fill_Data)//全屏填充
{
unsigned char m,n;
for(m=0;m<8;m++)
{
WriteCmd(0xb0+m);//page0-page1
WriteCmd(0x00);//low column start address
旋转式清堵机看看
WriteCmd(0x10);//high column start address
for(n=0;n<128;n++)
{
WriteDat(fill_Data);
}
}
}
void OLED_CLS(void)//清屏
{
OLED_Fill(0x00);
}
void OLED_data_up(unsigned char fill_Data)
{
unsigned char m,n;
for(m=0;m<2;m++)
{
WriteCmd(0xb2+m);//page0-page1
WriteCmd(0x00);//low column start address
WriteCmd(0x10);//high column start address
for(n=0;n<128;n++)
{
WriteDat(fill_Data);
}
}
}
void up_data(void)//刷新显⽰
{
OLED_data_up(0x00);
}
void OLED_time_up(unsigned char fill_Data)
{
unsigned char m,n;
for(m=0;m<2;m++)
{
WriteCmd(0xb4+m);//page0-page1
WriteCmd(0x00);//low column start address
WriteCmd(0x10);//high column start address
for(n=0;n<128;n++)
{
延时电路WriteDat(fill_Data);
}
}
}
void up_time(void)//刷新显⽰
{
OLED_time_up(0x00);
}
//--------------------------------------------------------------
// Prototype      : void OLED_ON(void)
// Calls          :
// Parameters    : none
// Description    : 将OLED从休眠中唤醒
//--------------------------------------------------------------
void OLED_ON(void)
{
WriteCmd(0X8D);//设置电荷泵
WriteCmd(0X14);//开启电荷泵
WriteCmd(0XAF);//OLED唤醒
}
//--------------------------------------------------------------
丙酮回收
// Prototype      : void OLED_OFF(void)
// Calls          :
// Parameters    : none
// Description    : 让OLED休眠 -- 休眠模式下,OLED功耗不到10uA //--------------------------------------------------------------
void OLED_OFF(void)
{
WriteCmd(0X8D);//设置电荷泵
WriteCmd(0X10);//关闭电荷泵
WriteCmd(0XAE);//OLED休眠
}
//--------------------------------------------------------------
// Prototype      : void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize) // Calls          :
// Parameters    : x,y -- 起始点坐标(x:0~127, y:0~7); ch[] -- 要显⽰的字符串; TextSize -- 字符⼤⼩(1:6*8 ; 2:8*16)
// Description    : 显⽰codetab.h中的ASCII字符,有6*8和8*16可选择
//--------------------------------------------------------------
void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
{
unsigned char c =0,i =0,j =0;
switch(TextSize)
{
case1:
{
while(ch[j]!='\0')
{
c = ch[j]-32;
if(x >126)
{
安全带包
x =0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<6;i++)
WriteDat(F6x8[c][i]);
x +=6;
j++;
}
}break;
case2:
{
while(ch[j]!='\0')
{
c = ch[j]-32;
if(x >120)无线存储
{
x =0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<8;i++)
WriteDat(F8X16[c*16+i]);
OLED_SetPos(x,y+1);
for(i=0;i<8;i++)
WriteDat(F8X16[c*16+i+8]);
x +=8;
j++;
}
}break;
}
}
//--------------------------------------------------------------
/
/ Prototype      : void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
// Calls          :
// Parameters    : x,y -- 起始点坐标(x:0~127, y:0~7); N:汉字在codetab.h中的索引
// Description    : 显⽰codetab.h中的汉字,16*16点阵
//--------------------------------------------------------------
void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
故障诊断方法
{
unsigned char wm=0;
unsigned int  adder=32*N;
OLED_SetPos(x , y);
for(wm =0;wm <16;wm++)

本文发布于:2024-09-22 11:29:56,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/191924.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模块   测试   电荷泵   按键   地址   对应   点亮
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议