Files
MicrochipFor32/bscpp_Device/bscpp_STM32_OLED.cpp
XerolySkinner 376a9edc0f 注释与语言的极大更新
使用了Doxygen注释风格,
使用了C++混合编程
2022-11-08 01:47:39 +08:00

163 lines
4.8 KiB
C++

/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bscpp_IIC_STM32_OLED.cpp
* @brief 在STM32下实现OLED通信
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-07 13:19
*/
#ifdef __cplusplus
#include "bscpp_IIC_STM32.h"
#include "bscpp_STM32_OLED.h"
extern const u8 OLED_WORD_ASCII[];
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类函数
//
/**
* @brief 发送一条指令给OLED
* @param cmd 要发送的指令
*/
void bscpp_STM32_OLED::Send_cmd(u8 cmd) {
IIC_WriteOneByte(0x3C, 0x00, cmd);}
//----------------------------------------------------------------------------------------------------
/**
* @brief 发送一条数据给OLED
* @param dat 要发送的数据
*/
void bscpp_STM32_OLED::Send_dat(u8 dat) {
IIC_WriteOneByte(0x3C, 0x40, dat);}
//----------------------------------------------------------------------------------------------------
/**
* @brief 发送一串定长指令给OLED
* @param *dat 要发送的指令头
* @param len 指令长度
*/
void bscpp_STM32_OLED::Send_len_dat(u8* dat, u32 len) {
IIC_Write(0x3C, 0x40, (u8*)dat, len);}
//----------------------------------------------------------------------------------------------------
/**
* @brief 光标定位行中的位置
* @param column 设定的该行位置
*/
void bscpp_STM32_OLED::Column_set(u8 column) {
Send_cmd(0x10 | (column >> 4)); //设置列地址高位
Send_cmd(0x00 | (column & 0x0f)); //设置列地址低位
}
//----------------------------------------------------------------------------------------------------
/**
* @brief 光标定位于一页
* @param page 设定所处的页位置
*/
void bscpp_STM32_OLED::Page_set(u8 page) {
Send_cmd(0xb0 + page);}
//----------------------------------------------------------------------------------------------------
/**
* @brief 全页绘制
* @param dat 全页绘制的数据,0x00为清空,0xFF为全涂
*/
void bscpp_STM32_OLED::Clear(u8 dat) {
u8 page;
for (page = 0; page < 8; page++) {
Page_set(page);
Column_set(0);
IIC_Start();
IIC_SendByte(0x3C << 1);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
for (int i = 0; i < 128; i++) {
IIC_SendByte(dat);
IIC_WaitAck();}
IIC_Stop();}}
//----------------------------------------------------------------------------------------------------
/**
* @brief OLED绘图
* @param *ptr_pic 图片数据的头
*/
void bscpp_STM32_OLED::Picture_display(const u8* ptr_pic) {
u8 page;
for (page = 0; page < (64 / 8); page++) {
Page_set(page);
Column_set(0);
IIC_Start();
IIC_SendByte(0x3C << 1);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
for (int i = 0; i < 128; i++) {
IIC_SendByte(ptr_pic[i]);
IIC_WaitAck();}
IIC_Stop();
ptr_pic += 128;}}
//----------------------------------------------------------------------------------------------------
/**
* @brief OLED反向绘图
* @param *ptr_pic 图片数据的头
*/
void bscpp_STM32_OLED::Picture_ReverseDisplay(const u8* ptr_pic) {
u8 page;
for (page = 0; page < (64 / 8); page++) {
Page_set(page);
Column_set(0);
IIC_Start();
IIC_SendByte(0x3C << 1);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
for (int i = 0; i < 128; i++) {
IIC_SendByte(~(ptr_pic[i]));
IIC_WaitAck();}
IIC_Stop();
ptr_pic += 128;}}
//----------------------------------------------------------------------------------------------------
/**
* @brief OLED绘制ASCII字符
* @param H 行数
* @param V 列数
* @param word 所要显示的字符
*/
void bscpp_STM32_OLED::Draw_ASCII(u32 H, u32 V, u8 word) {
word -= 33;
Page_set(V * 2);
Column_set(H * 8);
Send_len_dat((u8*)(OLED_WORD_ASCII + (word * 16)), 8);
Page_set(V * 2 + 1);
Column_set(H * 8);
Send_len_dat((u8*)(OLED_WORD_ASCII + (word * 16) + 8), 8);}
//----------------------------------------------------------------------------------------------------
/**
* @brief OLED初始化
* 初始化显示屏的设置
*/
void bscpp_STM32_OLED::Init(void) {
for (int i = 0; i < 25; i++)
Send_cmd(OLED_init_cmd[i]);}
//////////////////////////////////////////////////////////////////////////////////////////////////////
#endif