/** * \brief Put framebuffer to LCD controller * * This function will output the complete framebuffer from RAM to the * LCD controller. * * \note This is done automatically if using the graphic primitives. Only * needed if you are manipulating the framebuffer directly in your code. */ void gfx_mono_st7565r_put_framebuffer(void) { uint8_t page; for (page = 0; page < GFX_MONO_LCD_PAGES; page++) { st7565r_set_page_address(page); st7565r_set_column_address(0); gfx_mono_st7565r_put_page(framebuffer + (page * GFX_MONO_LCD_WIDTH), page, 0, GFX_MONO_LCD_WIDTH); } }
/** * \brief Put a byte to the display controller RAM * * If the LCD controller is accessed by the SPI interface we will also put the * data to the local framebuffer. * * \param[in] page Page address * \param[in] column Page offset (x coordinate) * \param[in] data Data to be written * * This example will put the value 0xFF to the first byte in the display memory * setting a 8 pixel high column of pixels in the upper left corner of the * display. * \code gfx_mono_st7565r_put_byte(0, 0, 0xFF); \endcode */ void gfx_mono_st7565r_put_byte(gfx_coord_t page, gfx_coord_t column, uint8_t data) { #ifdef CONFIG_ST7565R_FRAMEBUFFER gfx_mono_framebuffer_put_byte(page, column, data); #endif st7565r_set_page_address(page); st7565r_set_column_address(column); st7565r_write_data(data); }
/** * \brief Get a byte from the display controller RAM * * If the LCD controller is accessed by the SPI interface we cannot read the * data. In this case return the data from the local framebuffer instead. * * \param page Page address * \param column Page offset (x coordinate) * \return data from LCD controller or framebuffer. * * The following code will read the first byte from the display memory or the * local framebuffer if direct read is not possible. The data represents the * pixels from x = 0 and y = 0 to y = 7. * \code data = gfx_mono_st7565r_get_byte(0, 0); \endcode */ uint8_t gfx_mono_st7565r_get_byte(gfx_coord_t page, gfx_coord_t column) { #ifdef CONFIG_ST7565R_FRAMEBUFFER return gfx_mono_framebuffer_get_byte(page, column); #else st7565r_set_page_address(page); st7565r_set_column_address(column); return st7565r_read_data(); #endif }
/** * \brief Put a page from RAM to display controller. * * If the controller is accessed by the SPI interface, we can not read * back data from the LCD controller RAM. Because of this all data that is * written to the LCD controller in this mode is also written to a framebuffer * in MCU RAM. * * \param[in] data Pointer to data to be written * \param[in] page Page address * \param[in] column Offset into page (x coordinate) * \param[in] width Number of bytes to be written. * * The following example will write 32 bytes from data_buf to the page 0, * column 10. This will place data_buf in the rectangle x1=10,y1=0,x2=42,y2=8 * (10 pixels from the upper left corner of the screen): * \code gfx_mono_st7565r_put_page(data_buf, 0, 10, 32); \endcode */ void gfx_mono_st7565r_put_page(gfx_mono_color_t *data, gfx_coord_t page, gfx_coord_t column, gfx_coord_t width) { #ifdef CONFIG_ST7565R_FRAMEBUFFER gfx_mono_framebuffer_put_page(data, page, column, width); #endif st7565r_set_page_address(page); st7565r_set_column_address(column); do { st7565r_write_data(*data++); } while (--width); }
int main(void) { //! the page address to write to uint8_t page_address; //! the column address, or the X pixel. uint8_t column_address; //! store the LCD controller start draw line uint8_t start_line_address = 0; board_init(); sysclk_init(); // initialize the interface (SPI), ST7565R LCD controller and LCD st7565r_init(); // set addresses at beginning of display st7565r_set_page_address(0); st7565r_set_column_address(0); // fill display with lines for (page_address = 0; page_address <= 4; page_address++) { st7565r_set_page_address(page_address); for (column_address = 0; column_address < 128; column_address++) { st7565r_set_column_address(column_address); /* fill every other pixel in the display. This will produce horizontal lines on the display. */ st7565r_write_data(0xAA); } } // scroll the display using hardware support in the LCD controller while (true) { st7565r_set_display_start_line_address(start_line_address++); delay_ms(250); } }