285 lines
9.7 KiB
C
285 lines
9.7 KiB
C
// Copyright 2021 IOsetting <iosetting(at)outlook.com>
|
||
//
|
||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
// you may not use this file except in compliance with the License.
|
||
// You may obtain a copy of the License at
|
||
//
|
||
// http://www.apache.org/licenses/LICENSE-2.0
|
||
//
|
||
// Unless required by applicable law or agreed to in writing, software
|
||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
// See the License for the specific language governing permissions and
|
||
// limitations under the License.
|
||
|
||
#ifndef __FW_ST7567__
|
||
#define __FW_ST7567__
|
||
|
||
#include "fw_hal.h"
|
||
|
||
/**
|
||
* ST7565, ST7567
|
||
*
|
||
* Display Data RAM has a matrix of 65 by 132 bits. The address ranges are:
|
||
* X=0~131(83H) (column address), Y=0~8 (page address)
|
||
*
|
||
*/
|
||
|
||
#define ST7567_MODEL ST7567_MODEL_ST7567
|
||
|
||
#define ST7567_CS P35
|
||
#define ST7567_MOSI P34
|
||
#define ST7567_SCK P32
|
||
#define ST7567_RES P37
|
||
#define ST7567_DC P36
|
||
#define ST7567_BL P12
|
||
|
||
// X width
|
||
#define ST7567_WIDTH 128
|
||
// Y height
|
||
#define ST7567_HEIGHT 64
|
||
// Display RAM Columns
|
||
#define ST7567_COLUMN_EXPAND 4
|
||
// Display RAM Pages (8x8bit + 1bit)
|
||
#define ST7567_PAGES 8
|
||
// X orientation
|
||
#define ST7567_X_ORIENT ST7567_SEG_DIRECTION_NORMAL
|
||
// Y orientation
|
||
#define ST7567_Y_ORIENT ST7567_COM_DIRECTION_NORMAL
|
||
|
||
#define ST7567_MODEL_ST7565 0
|
||
#define ST7567_MODEL_ST7567 1
|
||
|
||
/* ST7567 commands definitions */
|
||
#define ST7567_DISPLAY_OFF 0xAE /* 0xae: Display OFF (sleep mode), default */
|
||
#define ST7567_DISPLAY_ON 0xAF /* 0xaf: Display ON in normal mode */
|
||
|
||
#define ST7567_SET_START_LINE 0x40 /* 0x40-7f: Set display start line */
|
||
#define ST7567_SET_START_LINE_MASK 0x3f
|
||
|
||
#define ST7567_SET_PAGE_ADDRESS 0xB0 /* 0xb0-b7: Set page start address, 0 - 8 */
|
||
#define ST7567_SET_PAGE_ADDRESS_MASK 0x07
|
||
|
||
#define ST7567_SET_COLUMN_ADDRESS_MSB 0x10 /* 0x10-0x1f: Set 8bit column address - high 4 bits of 0 - 131 */
|
||
#define ST7567_SET_COLUMN_ADDRESS_MSB_MASK 0x0F
|
||
|
||
#define ST7567_SET_COLUMN_ADDRESS_LSB 0x00 /* 0x00-0x0f: Set 8bit column address - low 4 bits of 0 - 131 */
|
||
#define ST7567_SET_COLUMN_ADDRESS_LSB_MASK 0x0F
|
||
|
||
#define ST7567_SEG_DIRECTION_NORMAL 0xA0 /* 0xa0: Column address 0 is mapped to SEG0, default*/
|
||
#define ST7567_SEG_DIRECTION_REVERSE 0xA1 /* 0xa1: Column address 83H(131) is mapped to SEG0 */
|
||
|
||
#define ST7567_COM_DIRECTION_NORMAL 0xC0 /* 0xc0: Set COM output direction, normal mode */
|
||
#define ST7567_COM_DIRECTION_REVERSE 0xC8 /* 0xc8: Set COM output direction, reverse mode */
|
||
|
||
#define ST7567_INVERSE_DISPLAY_OFF 0xA6 /* 0xa6: Normal display */
|
||
#define ST7567_INVERSE_DISPLAY_ON 0xA7 /* 0xa7: Inverse display */
|
||
|
||
#define ST7567_ALL_PIXEL_ON 0xA5 /* 0xa5: Entire display ON */
|
||
#define ST7567_ALL_PIXEL_NORMAL 0xA4 /* 0xa4: Resume to RAM content display */
|
||
|
||
/* LCD bias set */
|
||
#define ST7567_BIAS_1_9 0xA2 /* 0xa2: Select BIAS setting 1/9 */
|
||
#define ST7567_BIAS_1_7 0xA3 /* 0xa3: Select BIAS setting 1/7 */
|
||
|
||
#define ST7567_READ_MODIFY_WRITE_START 0xE0 /* 0xe0: Enter the Read Modify Write mode */
|
||
#define ST7567_READ_MODIFY_WRITE_END 0xEE /* 0xee: Leave the Read Modify Write mode */
|
||
|
||
#define ST7567_RESET 0xE2 /* 0xe2: Software RESET */
|
||
|
||
/**
|
||
* This instruction controls the built-in power circuits.
|
||
* Typically, these 3 flags are turned ON at the same time.
|
||
*/
|
||
#define ST7567_POWER_CONTROL 0x28
|
||
#define ST7567_POWER_CONTROL_VF 0x01
|
||
#define ST7567_POWER_CONTROL_VR 0x02
|
||
#define ST7567_POWER_CONTROL_VB 0x04
|
||
|
||
/**
|
||
* The operation voltage (V0) calculation formula is shown below:
|
||
* (RR comes from Regulation Ratio, EV comes from EV[5:0])
|
||
* V0 = RR X [ 1 – (63 – EV) / 162 ] X 2.1, or
|
||
* V0 = RR X [ ( 99 + EV ) / 162 ] X 2.1
|
||
*/
|
||
#define ST7567_REGULATION_RATIO 0x20
|
||
#define ST7567_REGULATION_RATIO_3_0 0x00
|
||
#define ST7567_REGULATION_RATIO_3_5 0x01
|
||
#define ST7567_REGULATION_RATIO_4_0 0x02
|
||
#define ST7567_REGULATION_RATIO_4_5 0x03
|
||
#define ST7567_REGULATION_RATIO_5_0 0x04 /* Default */
|
||
#define ST7567_REGULATION_RATIO_5_5 0x05
|
||
#define ST7567_REGULATION_RATIO_6_0 0x06
|
||
#define ST7567_REGULATION_RATIO_6_5 0x07
|
||
|
||
/**
|
||
* This is double byte instruction. The first byte set ST7567 into EV
|
||
* adjust mode and the following instruction will change the EV setting.
|
||
* That means these 2 bytes must be used together. They control the electronic
|
||
* volume to adjust a suitable V0 voltage for the LCD.
|
||
*/
|
||
#define ST7567_SET_EV 0x81
|
||
#define ST7567_SET_EV_MASK 0x3F
|
||
|
||
#if (ST7567_MODEL == ST7567_MODEL_ST7565)
|
||
#define ST7567_MODE_SLEEP 0xAC
|
||
#define ST7567_MODE_NORMAL 0xAD
|
||
#endif
|
||
|
||
#define ST7567_SET_BOOSTER 0xF8 /* Set booster level */
|
||
#define ST7567_SET_BOOSTER_4X 0x00
|
||
#define ST7567_SET_BOOSTER_5X 0x01
|
||
#define ST7567_SET_BOOSTER_6X 0x11
|
||
|
||
#define ST7567_NOP 0xE3
|
||
#define ST7567_TEST 0xFE
|
||
|
||
|
||
#ifndef ST7567_TIMEOUT
|
||
#define ST7567_TIMEOUT 20000
|
||
#endif
|
||
|
||
/** Front color */
|
||
#define ST7567_COLOR_FRONT 1U
|
||
/** Background color */
|
||
#define ST7567_COLOR_BACK 0U
|
||
|
||
|
||
typedef struct {
|
||
uint8_t width;
|
||
uint8_t height;
|
||
uint8_t order;
|
||
uint8_t bytes;
|
||
const uint8_t *dat;
|
||
} FontDef_t;
|
||
|
||
extern __CODE FontDef_t Font_3x5;
|
||
extern __CODE FontDef_t Font_5x7;
|
||
|
||
/**
|
||
* @brief Write a single byte data to ST7567
|
||
* @param dat: data
|
||
* @retval None
|
||
*/
|
||
void ST7567_WriteData(uint8_t dat);
|
||
void ST7567_WriteSameData(uint8_t dat, uint32_t size);
|
||
|
||
/**
|
||
* @brief Write a single byte command to ST7567
|
||
* @param command: command
|
||
* @retval None
|
||
*/
|
||
void ST7567_WriteCommand(uint8_t command);
|
||
|
||
/**
|
||
* @brief Hardware reset ST7567 LCD
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
void ST7567_Reset(void);
|
||
|
||
/**
|
||
* @brief Initializes ST7567 LCD
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
void ST7567_Init(void);
|
||
|
||
/**
|
||
* @brief Powersave mode control
|
||
* @param state HAL_State_ON:powersave mode, HAL_State_OFF:work mode
|
||
* @retval None
|
||
*/
|
||
void ST7567_SetPowerSaveMode(HAL_State_t state);
|
||
|
||
|
||
/**
|
||
* @brief Turn ST7567 LCD backlight on or off
|
||
* @param state HAL_State_ON:on, HAL_State_OFF:off
|
||
* @retval None
|
||
*/
|
||
void ST7567_SetBackLightState(HAL_State_t state);
|
||
|
||
/**
|
||
* @brief Turn ST7567 LCD backlight off
|
||
* @param val: value between 0x00 ~ 0x3F
|
||
* @retval None
|
||
*/
|
||
void ST7567_SetContrast(uint8_t val);
|
||
|
||
/**
|
||
* @brief Update LCD display with buffer changes
|
||
* @note Call this function each time when display is changed
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
void ST7567_UpdateScreen(void);
|
||
|
||
/**
|
||
* @brief Toggles pixels invertion inside internal RAM
|
||
* @note @ref ST7567_UpdateScreen() must be called after that in order to see updated LCD screen
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
void ST7567_ToggleInvert(void);
|
||
|
||
/**
|
||
* @brief Fills entire LCD with specified color
|
||
* @note @ref ST7567_UpdateScreen() must be called after that in order to see updates
|
||
* @param Color: Color to be used for screen fill, ST7567_COLOR_FRONT or ST7567_COLOR_BACK
|
||
* @retval None
|
||
*/
|
||
void ST7567_Fill(uint8_t Color);
|
||
|
||
/**
|
||
* @brief Draws pixel at desired location
|
||
* @note @ref ST7567_UpdateScreen() must called after that in order to see updates
|
||
* @param x: X location. This parameter can be a value between 0 and ST7567_WIDTH - 1
|
||
* @param y: Y location. This parameter can be a value between 0 and ST7567_HEIGHT - 1
|
||
* @param color: Color to be used for screen fill. This parameter can be a value of @ref ST7567_COLOR_t enumeration
|
||
* @retval None
|
||
*/
|
||
void ST7567_DrawPixel(uint8_t x, uint8_t y, uint8_t color);
|
||
|
||
/**
|
||
* @brief Sets cursor pointer to desired location for strings
|
||
* @param x: X location. This parameter can be a value between 0 and ST7567_WIDTH - 1
|
||
* @param y: Y location. This parameter can be a value between 0 and ST7567_HEIGHT - 1
|
||
* @retval None
|
||
*/
|
||
void ST7567_GotoXY(uint16_t x, uint16_t y);
|
||
|
||
/**
|
||
* @brief Puts character to internal RAM
|
||
* @note @ref ST7567_UpdateScreen() must be called after that in order to see updated LCD screen
|
||
* @param ch: Character to be written
|
||
* @param *Font: Pointer to @ref FontDef_t structure with used font
|
||
* @param color: Color used for drawing. This parameter can be a value of @ref ST7567_COLOR_t enumeration
|
||
* @retval Character written
|
||
*/
|
||
char ST7567_Putc(char ch, FontDef_t* Font, uint8_t color);
|
||
|
||
/**
|
||
* @brief Puts string to internal RAM
|
||
* @note @ref ST7567_UpdateScreen() must be called after that in order to see updated LCD screen
|
||
* @param *str: String to be written
|
||
* @param *Font: Pointer to @ref FontDef_t structure with used font
|
||
* @param color: Color used for drawing. This parameter can be a value of @ref ST7567_COLOR_t enumeration
|
||
* @retval Zero on success or character value when function failed
|
||
*/
|
||
char ST7567_Puts(char* str, FontDef_t* Font, uint8_t color);
|
||
|
||
/**
|
||
* @brief Draws line on LCD
|
||
* @note @ref ST7567_UpdateScreen() must be called after that in order to see updated LCD screen
|
||
* @param x0: Line X start point. Valid input is 0 to ST7567_WIDTH - 1
|
||
* @param y0: Line Y start point. Valid input is 0 to ST7567_HEIGHT - 1
|
||
* @param x1: Line X end point. Valid input is 0 to ST7567_WIDTH - 1
|
||
* @param y1: Line Y end point. Valid input is 0 to ST7567_HEIGHT - 1
|
||
* @param c: Color to be used. This parameter can be a value of @ref ST7567_COLOR_t enumeration
|
||
* @retval None
|
||
*/
|
||
void ST7567_DrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8_t c);
|
||
|
||
#endif // __ST7567_H_
|