Simple driver for the ST7920 graphic LCD 128x64. Basic functions for displaying internal ROM fonts like a 16x4 LCD Extended function to fill the screen with a bitmap
Dependents: Graficador_De_Bode_OTERO-OSSO_PPs2018
Diff: st7920.h
- Revision:
- 0:1a97e0243dbc
- Child:
- 1:c7d041bdb718
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/st7920.h Fri Jun 29 22:47:51 2012 +0000 @@ -0,0 +1,270 @@ +#ifndef __ST7920_H +#define __ST7920_H + +#define VERSION 1.0 + +#include <mbed.h> + +// Instruction Set 1: (RE=0: Basic Instruction) +#define DISPLAY_CLEAR 0x01 // Fill DDRAM with "20H" and set DDRAM address counter (AC) to "00H" +#define RETURN_HOME 0x02 // Set DDRAM address counter (AC) to "00H", and put cursor +// to origin �Gthe content of DDRAM are not changed +#define ENTRY_MODE_SET 0x04 // Set cursor position and display shift when doing write or read +// operation +#define DISPLAY_CONTROL 0x08 // D=1: Display ON, C=1: Cursor ON, B=1: Character Blink ON +#define CURSOR_DISPLAY_CONTROL 0x10 // Cursor position and display shift control; the content of +// DDRAM are not changed +#define FUNCTION_SET 0x20 // DL=1 8-bit interface, DL=0 4-bit interface +// RE=1: extended instruction, RE=0: basic instruction +#define SET_CGRAM_ADDRESS 0x40 // Set CGRAM address to address counter (AC) +// Make sure that in extended instruction SR=0 +#define SET_DDRAM_ADDRESS 0x80 // Set DDRAM address to address counter (AC) +// AC6 is fixed to 0 + +// Instruction set 2: (RE=1: extended instruction) +#define STANDBY 0x01 // Enter standby mode, any other instruction can terminate. +// COM1�c32 are halted +#define SCROLL_OR_RAM_ADDR_SEL 0x02 // SR=1: enable vertical scroll position +// SR=0: enable CGRAM address (basic instruction) +#define REVERSE_BY_LINE 0x04 // Select 1 out of 4 line (in DDRAM) and decide whether to +// reverse the display by toggling this instruction +// R1,R0 initial value is 0,0 +#define EXTENDED_FUNCTION_SET 0x20 // DL=1 :8-bit interface, DL=0 :4-bit interface +// RE=1: extended instruction, RE=0: basic instruction +#define SET_SCROLL_ADDRESS 0x40 // G=1 :graphic display ON, G=0 :graphic display OFF +#define SET_GRAPHIC_RAM_ADDRESS 0x80 // Set GDRAM address to address counter (AC) +// Set the vertical address first and followed the horizontal +// address by consecutive writings +// Vertical address range: AC5�cAC0, Horizontal address range: AC3�cAC0 + +// Parameters regarding Instruction Sets 1 & 2 +#define DISPLAY_SHIFT_S 0x01 // Set 1, ENTRY_MODE_SET +#define INCREASE_DECREASE_ID 0x02 // Set 1, ENTRY_MODE_SET +#define CURSOR_BLINK_ON_B 0x01 // Set 1, DISPLAY_CONTROL +#define CURSOR_ON_C 0x02 // Set 1, DISPLAY_CONTROL +#define DISPLAY_ON_D 0x04 // Set 1, DISPLAY_CONTROL +#define SHIFT_RL 0x04 // Set 1, CURSOR_DISPLAY_CONTROL +#define CURSOR_SC 0x08 // Set 1, CURSOR_DISPLAY_CONTROL +#define EXTENDED_INSTRUCTION_RE 0x04 // Set 1, FUNCTION_SET; Set 2, EXTENDED_FUNTION_SET +#define DATA_LENGTH_DL 0x10 // Set 1, FUNCTION_SET; Set 2, EXTENDED_FUNTION_SET +#define REVERSE_BY_LINE_R0 0x01 // Set 2, REVERSE_BY_LINE +#define REVERSE_BY_LINE_R1 0x02 // Set 2, REVERSE_BY_LINE +#define EN_VERTICAL_SCROLL_SR 0x01 // Set 2, SCROLL_OR_RAM_ADDR_SEL +#define GRAPHIC_ON_G 0x02 // Set 2, EXTENDED_FUNTION_SET + +#define BUSY_FLAG_BF 0x80 + +/*********************************************************************************/ + +class ST7920 { +public: + /** + *@brief Constructor, initializes the lcd on the respective pins. + *@param control pins RS,RW,E + *@param databus DB0-DB7 data pins + *@return none + *@ ----> pin PSB @ Vdd for 8/4-bit parallel bus mode. + */ + ST7920 (PinName _RS, PinName _RW, PinName _E, PinName DB0, PinName DB1, PinName DB2, PinName DB3, PinName DB4, PinName DB5, PinName DB6, PinName DB7); + + + /** + *@brief Display initialision + * + *@param none + *@return none + * + */ + void InitDisplay(void); + + + /** + *@brief Enable Extended Instructions, RE=1, Graphic on + * + *@param none + *@return none + * + */ + void SetGraphicsMode(void); + + /** + *@brief Go back to Basic Instructions, RE=0 + * + *@param none + *@return none + * + */ + void SetTextMode(void); + + /** + *@brief Sets DDRAM address counter (AC) to '00H' + *@basic function, clear screen + *@param none + *@return none + * + */ + void ClearScreen(void); + + void ReturnHome(void); + void Standby(void); + + /** + *@brief Places a string on the screen with internal characters from the HCGROM + *@ + *@param row, column, string + *@return none + * + */ +/* +* DESCRIPTIONS: +* Place a string to the GLCD controller on the specified row and column. +* Due to the design of the ST7920 controller (to accomodate Mandarin and Cyrillic), you must place the text on the column +* according to the numbers above the diagram below: +* +* |--0--|--1--|--2--|... ...|--7--| +* +--+--+--+--+--+---------------------+ +* |H |e |l |l |o | ... | <- row 0 (address 0x80) +* +--+--+--+--+--+---------------------+ +* |T |h |i |s | |i ... | <- row 1 (address 0x90) +* +--+--+--+--+--+---------------------+ +* |* |* |* |* |* |* ... | <- row 2 (address 0x88) +* +--+--+--+--+--+---------------------+ +* |- |- |- |- |- |- ... | <- row 3 (address 0x98) +* +--+--+--+--+--+---------------------+ +* +* Example: +* Writing "abc" onto the 1st column, and 1st row: +* |--0--|--1--|--2--|... ...|--7--| +* +--+--+--+--+--+---------------------+ +* | | | | | | ... | <- row 0 (address 0x80) +* +--+--+--+--+--+---------------------+ +* | | |a |b |c | ... | <- row 1 (address 0x90) +* +--+--+--+--+--+---------------------+ +* | | | | | | ... | <- row 2 (address 0x88) +* +--+--+--+--+--+---------------------+ +* | | | | | | ... | <- row 3 (address 0x98) +* +--+--+--+--+--+---------------------+ +* +****************************************************************************** +*/ + void DisplayString(int Row,int Column, unsigned char *ptr,int length); + + /** + *@brief Places a character on the screen with an internal character from the HCGROM + *@ + *@param row, column, character + *@return none + * + */ +/* +* DESCRIPTIONS: +* Place a character to the GLCD controller on the specified row and column. +* Due to the design of the ST7920 controller (to accomodate Mandarin and Cyrillic), you must place the text on the column +* according to the numbers above the diagram below: +* +* |--0--|--1--|--2--|... ...|--7--| +* +--+--+--+--+--+---------------------+ +* |H |e |l |l |o | ... | <- row 0 (address 0x80) +* +--+--+--+--+--+---------------------+ +* |T |h |i |s | |i ... | <- row 1 (address 0x90) +* +--+--+--+--+--+---------------------+ +* |* |* |* |* |* |* ... | <- row 2 (address 0x88) +* +--+--+--+--+--+---------------------+ +* |- |- |- |- |- |- ... | <- row 3 (address 0x98) +* +--+--+--+--+--+---------------------+ +* +* Example: +* Writing 'a' onto the 1st column, and 1st row: +* |--0--|--1--|--2--|... ...|--7--| +* +--+--+--+--+--+---------------------+ +* | | | | | | ... | <- row 0 (address 0x80) +* +--+--+--+--+--+---------------------+ +* | | |a | | | ... | <- row 1 (address 0x90) +* +--+--+--+--+--+---------------------+ +* | | | | | | ... | <- row 2 (address 0x88) +* +--+--+--+--+--+---------------------+ +* | | | | | | ... | <- row 3 (address 0x98) +* +--+--+--+--+--+---------------------+ +* +******************************************************************************* +*/ + void DisplayChar(int Row, int Column,int inpChr); + + /** + *@brief Fills the screen with the graphics described in a 1024-byte array + *@ + *@param bitmap 128x64, bytes horizontal + *@return none + * + */ + void FillGDRAM(unsigned char *bitmap); + + //same as FILLGDRAM, but turnes all the bytes from vertical to horizontal + //now pictures for eg KS0108 can be used + void FillGDRAM_Turned(unsigned char *bitmap); + + /** + *@brief Clears the graphics RAM of the screen + *@writes all pixels to zero + *@param none + *@return none + * + */ + void ClearGDRAM(void); + + + +private: + BusInOut DB; + DigitalOut RS; + DigitalOut RW; + DigitalOut E; + //DigitalOut RST; + + unsigned char screen[1024]; + + unsigned int ByteReadLCD(void); + + void ByteWriteLCD(unsigned int data); + + /** + *@brief Write instruction to the controller. + *@param Command command to send to the controller + *@return none + * + */ + void WriteInstruction(unsigned int Command); + + /** + *@brief Write data byte to the controller. + *@param data data send to the controller chip (DDRAM/CGRAM/GDRAM) + *@return none + * + */ + void WriteRAM(unsigned int data); + + /** + *@brief Read busy flag, keep looking + *@param none + *@return none + * + */ + void ReadBusyFlag(void); + + /** + *@brief Read Address Counter (AC) from the controller. + *@param none + *@return read Address Counter (AC) from the controller chip (DDRAM/CGRAM/GDRAM) + * + */ + unsigned int Read_AC(void); + + /** + *@brief Read data byte from the controller. + *@param none + *@return data read from the controller chip (DDRAM/CGRAM/GDRAM) + * + */ + unsigned int ReadRAM(void); +}; +#endif \ No newline at end of file