mirror of
https://github.com/eddyem/STM8_samples.git
synced 2025-12-06 18:55:15 +03:00
123 lines
4.1 KiB
C
123 lines
4.1 KiB
C
/*
|
|
* pcd8544.h
|
|
*
|
|
* Copyright 2015 Edward V. Emelianoff <eddy@sao.ru, edward.emelianoff@gmail.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
|
|
#pragma once
|
|
#ifndef __PCD8544_H__
|
|
#define __PCD8544_H__
|
|
|
|
#include "font.h"
|
|
#include "stm8l.h"
|
|
|
|
// sizes in graphics (84x48) & char(letter 6x8 -> 14x6) mode
|
|
#define XSIZE (84)
|
|
#define XCHARSZ (XSIZE/LTR_WIDTH)
|
|
#define YSIZE (48)
|
|
#define YCHARSZ (YSIZE/8)
|
|
|
|
// type of screen size
|
|
typedef U8 scrnsz_t;
|
|
// type of screen buffer index (scrnsz_t^2)
|
|
typedef U16 bufsz_t;
|
|
|
|
extern const scrnsz_t LTRS_IN_ROW;
|
|
extern const scrnsz_t ROW_MAX;
|
|
|
|
#define bad_coords(x, y) (!(x < XSIZE && y < YSIZE))
|
|
#define bad_text_coords(col, row) (!(col < LTRS_IN_ROW && row < ROW_MAX))
|
|
|
|
/*
|
|
// bounding box
|
|
typedef struct{
|
|
scrnsz_t xmin,
|
|
scrnsz_t ymin,
|
|
scrnsz_t xmax,
|
|
scrnsz_t ymax
|
|
} bbox_t;
|
|
*/
|
|
|
|
void pcd8544_init();
|
|
void pcd8544_send_byte(U8 byte, U8 cmd);
|
|
void pcd8544_send_data(U8 *data, bufsz_t size, U8 cmd);
|
|
void draw_pixel(scrnsz_t x, scrnsz_t y, U8 set);
|
|
void pcd8544_cls();
|
|
void pcd8544_refresh();
|
|
int pcd8544_put(U8 koi8, scrnsz_t x, scrnsz_t y);
|
|
U8 *pcd8544_print(U8 *koi8);
|
|
U8 pcd8544_putch(U8 koi8);
|
|
void pcd8544_roll_screen();
|
|
|
|
void pcd8544_setbias(U8 val);
|
|
void pcd8544_setvop(U8 val);
|
|
void pcd8544_settemp(U8 val);
|
|
|
|
#define set_pixel(x,y) do{draw_pixel(x,y,1);}while(0)
|
|
#define clear_pixel(x,y) do{draw_pixel(x,y,0);}while(0)
|
|
|
|
/********************** PCD8544 protocol **********************/
|
|
// Function set: | 0 | 0 | 1 | 0 | 0 | PD | V | H |
|
|
#define PCD8544_POWERDOWN (0x24)
|
|
#define PCD8544_VERTADDRESSING (0x22)
|
|
#define PCD8544_EXTENDEDINSTRUCTION (0x21)
|
|
#define PCD8544_DEFAULTMODE (0x20)
|
|
/*
|
|
* functions with H=0 (basic)
|
|
*/
|
|
// Display control: | 0 | 0 | 0 | 0 | 1 | D | 0 | E |
|
|
#define PCD8544_DISPLAYBLANK (8)
|
|
#define PCD8544_DISPLAYFILLED (9)
|
|
#define PCD8544_DISPLAYNORMAL (0xc)
|
|
#define PCD8544_DISPLAYINVERTED (0xd)
|
|
// Set Xaddr: | 1 | X6 | X5 | X4 | X3 | X2 | X1 | X0 |
|
|
#define PCD8544_SETXADDR (0x80)
|
|
#define PCD8544_XADDR_MASK (0x7f)
|
|
// Set Yaddr: | 0 | 1 | 0 | 0 | 0 | Y2 | Y1 | Y0 |
|
|
#define PCD8544_SETYADDR (0x40)
|
|
#define PCD8544_YADDR_MASK (7)
|
|
/*
|
|
* functions with H=1 (extended)
|
|
*/
|
|
// Temperature control: | 0 | 0 | 0 | 0 | 0 | 1 | TC1 | TC0 |
|
|
#define PCD8544_SETTEMP (4)
|
|
#define PCD8544_TEMP_MASK (3)
|
|
// BIAS: | 0 | 0 | 0 | 1 | 0 | BS2 | BS1 | BS0 |
|
|
#define PCD8544_SETBIAS (0x10)
|
|
#define PCD8544_BIAS_MASK (7)
|
|
// VOP: | 1 | VOP6 | VOP5 | VOP4 | VOP3 | VOP2 | VOP1 | VOP0 |
|
|
#define PCD8544_SETVOP (0x80)
|
|
#define PCD8544_VOP_MASK (0x7f)
|
|
// | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
|
|
|
/********************** Shortened macros **********************/
|
|
#define CMD(x) do{pcd8544_send_byte(x, 1);}while(0)
|
|
#define DAT(x) do{pcd8544_send_byte(x, 0);}while(0)
|
|
#define CBUF(x,l) do{pcd8544_send_data(x, l, 1);}while(0)
|
|
#define DBUF(x,l) do{pcd8544_send_data(x, l, 0);}while(0)
|
|
// set bias level (look into datasheet, 4 - recommend)
|
|
#define SETBIAS(x) CMD(PCD8544_SETBIAS|(x&PCD8544_BIAS_MASK))
|
|
// set operation voltage (=3.06+0.06*x)
|
|
#define SETVOP(x) CMD(PCD8544_SETVOP |(x&PCD8544_VOP_MASK))
|
|
// temperature compensation: 0 - high, 1 - recommended, 2 - IC, 3 - minimal
|
|
#define SETTEMP(x) CMD(PCD8544_SETTEMP|(x&PCD8544_TEMP_MASK))
|
|
// x,y addressing
|
|
#define SETXADDR(x) CMD(PCD8544_SETXADDR|(x&PCD8544_XADDR_MASK))
|
|
#define SETYADDR(x) CMD(PCD8544_SETYADDR|(x&PCD8544_YADDR_MASK))
|
|
#endif // __PCD8544_H__
|