一、硬件环境介绍
单片机: STM32F103C8T6
RTC时钟来源: 使用STM32内部RTC定时器得到时间。
显示屏:中景园0.96寸 SPI接口的OLED显示屏
编程软件:keil5
核心代码内容里分为以下几个部分:
1. RTC时钟代码部分:该电子钟使用的是STM32内部RTC实时时钟,需要编写RTC初始化代码。
2. 电子钟界面逻辑代码部分:电子钟的界面仪表盘画面更新是在RTC秒中断里调用,实现时间指针的更新。
3. OLED驱动代码部分:编写OLED驱动代码,编写常用的OLED接口函数,比如:字符串显示,画点,划线等。
OLED在程序的驱动方式采用显存的方式驱动,定义一个显存数组,程序里的所有逻辑代码先绘制在显存数组里,然后再刷新到OLED显示屏上。
三、核心代码
完整工程源码下载地址: https://download.csdn.net/download/xiaolong1126626497/15804479
3.1 OLED显示屏驱动代码
(1). oled.c
#include "oled.h"
/*
函数功能: 初始化OLED显示屏硬件
硬件连接:
D0--PB14--时钟线
D1--PB13--数据线
RES-PB12-复位脚
DC--PB1--命令数据选择脚
CS--PA7--片选
*/
void OLED_Init(void)
{
/*1. 开时钟*/
RCC->APB2ENR|=1CRH&=0xF000FFFF;
GPIOB->CRH|=0x03330000;
GPIOA->CRL&=0x0FFFFFFF;
GPIOA->CRL|=0x30000000;
/*配置默认电平*/
OLED_CS=1;
OLED_SCK=1;
/*OLED显示屏驱动代码*/
OLED_RES=1;
delay_ms(1000);
OLED_RES=0;
delay_ms(1000);
OLED_RES=1;
delay_ms(1000);
OLED_SPI_WriteOneByte(0xAE,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x00,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x10,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x40,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xB0,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x81,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xCF,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xA1,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xA6,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xA8,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x3F,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xC8,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xD3,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x00,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xD5,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x80,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xD9,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xF1,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xDA,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x12,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xDB,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x30,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x8D,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0x14,OLED_WRITE_CMD);
OLED_SPI_WriteOneByte(0xAF,OLED_WRITE_CMD);
}
/*
函数功能: SPI底层发送一个字节的函数
函数参数:data 表示发送的数据 flag表示发送命令还是数据(0表示命令 1表示数据)
*/
void OLED_SPI_WriteOneByte(u8 data,u8 flag)
{
u8 i;
OLED_DC=flag; //区分发送数据还是命令
OLED_CS=0; //选中OLED显示屏
for(i=0;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?