LCD menu optimalization - createChar
+code order
This commit is contained in:
parent
e22d204e8e
commit
d1de75eb19
4 changed files with 125 additions and 57 deletions
|
@ -339,15 +339,6 @@ void LiquidCrystal_Prusa::noAutoscroll(void) {
|
|||
command(LCD_ENTRYMODESET | _displaymode);
|
||||
}
|
||||
|
||||
// Allows us to fill the first 8 CGRAM locations
|
||||
// with custom characters
|
||||
void LiquidCrystal_Prusa::createChar_P(uint8_t location, const uint8_t* charmap)
|
||||
{
|
||||
location &= 0x7; // we only have 8 locations 0-7
|
||||
command(LCD_SETCGRAMADDR | (location << 3));
|
||||
for (int i=0; i<8; i++)
|
||||
send(pgm_read_byte(&charmap[i]), HIGH);
|
||||
}
|
||||
|
||||
/*********** mid level commands, for sending data/cmds */
|
||||
|
||||
|
|
|
@ -79,11 +79,10 @@ public:
|
|||
void autoscroll();
|
||||
void noAutoscroll();
|
||||
|
||||
void createChar_P(uint8_t, const uint8_t*);
|
||||
void setCursor(uint8_t, uint8_t);
|
||||
size_t write(uint8_t);
|
||||
void command(uint8_t);
|
||||
private:
|
||||
public:
|
||||
void send(uint8_t, uint8_t);
|
||||
void write4bits(uint8_t);
|
||||
void write8bits(uint8_t);
|
||||
|
|
116
Firmware/lcd.cpp
116
Firmware/lcd.cpp
|
@ -4,8 +4,50 @@
|
|||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include <avr/delay.h>
|
||||
#include "Timer.h"
|
||||
|
||||
/*
|
||||
|
||||
// commands
|
||||
#define LCD_CLEARDISPLAY 0x01
|
||||
#define LCD_RETURNHOME 0x02
|
||||
#define LCD_ENTRYMODESET 0x04
|
||||
#define LCD_DISPLAYCONTROL 0x08
|
||||
#define LCD_CURSORSHIFT 0x10
|
||||
#define LCD_FUNCTIONSET 0x20
|
||||
#define LCD_SETCGRAMADDR 0x40
|
||||
#define LCD_SETDDRAMADDR 0x80
|
||||
|
||||
// flags for display entry mode
|
||||
#define LCD_ENTRYRIGHT 0x00
|
||||
#define LCD_ENTRYLEFT 0x02
|
||||
#define LCD_ENTRYSHIFTINCREMENT 0x01
|
||||
#define LCD_ENTRYSHIFTDECREMENT 0x00
|
||||
|
||||
// flags for display on/off control
|
||||
#define LCD_DISPLAYON 0x04
|
||||
#define LCD_DISPLAYOFF 0x00
|
||||
#define LCD_CURSORON 0x02
|
||||
#define LCD_CURSOROFF 0x00
|
||||
#define LCD_BLINKON 0x01
|
||||
#define LCD_BLINKOFF 0x00
|
||||
|
||||
// flags for display/cursor shift
|
||||
#define LCD_DISPLAYMOVE 0x08
|
||||
#define LCD_CURSORMOVE 0x00
|
||||
#define LCD_MOVERIGHT 0x04
|
||||
#define LCD_MOVELEFT 0x00
|
||||
|
||||
// flags for function set
|
||||
#define LCD_8BITMODE 0x10
|
||||
#define LCD_4BITMODE 0x00
|
||||
#define LCD_2LINE 0x08
|
||||
#define LCD_1LINE 0x00
|
||||
#define LCD_5x10DOTS 0x04
|
||||
#define LCD_5x8DOTS 0x00
|
||||
|
||||
*/
|
||||
|
||||
LiquidCrystal_Prusa lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7
|
||||
|
||||
|
@ -23,28 +65,52 @@ int lcd_putchar(char c, FILE *stream)
|
|||
|
||||
void lcd_command(uint8_t value)
|
||||
{
|
||||
lcd.command(value);
|
||||
lcd.send(value, LOW);
|
||||
}
|
||||
|
||||
uint8_t lcd_write(uint8_t value)
|
||||
{
|
||||
return lcd.write(value);
|
||||
if (value == '\n')
|
||||
{
|
||||
if (lcd._currline > 3) lcd._currline = -1;
|
||||
lcd_set_cursor(0, lcd._currline + 1); // LF
|
||||
return 1;
|
||||
}
|
||||
if (lcd._escape[0] || (value == 0x1b))
|
||||
return lcd.escape_write(value);
|
||||
lcd.send(value, HIGH);
|
||||
return 1; // assume sucess
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void lcd_clear(void)
|
||||
{
|
||||
lcd.clear();
|
||||
lcd_command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
|
||||
_delay_us(1600); // this command takes a long time
|
||||
}
|
||||
|
||||
void lcd_set_cursor(uint8_t c, uint8_t r)
|
||||
void lcd_set_cursor(uint8_t col, uint8_t row)
|
||||
{
|
||||
// lcd_printf_P(PSTR("\x1b[%hhu;%hhuH"), r, c);
|
||||
lcd.setCursor(c, r);
|
||||
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
|
||||
if ( row >= lcd._numlines )
|
||||
row = lcd._numlines-1; // we count rows starting w/0
|
||||
lcd._currline = row;
|
||||
lcd_command(LCD_SETDDRAMADDR | (col + row_offsets[row]));
|
||||
}
|
||||
|
||||
// Allows us to fill the first 8 CGRAM locations
|
||||
// with custom characters
|
||||
void lcd_createChar_P(uint8_t location, const uint8_t* charmap)
|
||||
{
|
||||
location &= 0x7; // we only have 8 locations 0-7
|
||||
lcd_command(LCD_SETCGRAMADDR | (location << 3));
|
||||
for (int i=0; i<8; i++)
|
||||
lcd.send(pgm_read_byte(&charmap[i]), HIGH);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int lcd_putc(int c)
|
||||
{
|
||||
return fputc(c, lcdout);
|
||||
|
@ -388,7 +454,7 @@ void lcd_implementation_init(void)
|
|||
{
|
||||
lcd.begin(LCD_WIDTH, LCD_HEIGHT);
|
||||
lcd_set_custom_characters();
|
||||
lcd.clear();
|
||||
lcd_clear();
|
||||
}
|
||||
|
||||
|
||||
|
@ -567,21 +633,21 @@ const uint8_t lcd_chardata_arrdown[8] PROGMEM = {
|
|||
|
||||
void lcd_set_custom_characters(void)
|
||||
{
|
||||
lcd.createChar_P(LCD_STR_BEDTEMP[0], lcd_chardata_bedTemp);
|
||||
lcd.createChar_P(LCD_STR_DEGREE[0], lcd_chardata_degree);
|
||||
lcd.createChar_P(LCD_STR_THERMOMETER[0], lcd_chardata_thermometer);
|
||||
lcd.createChar_P(LCD_STR_UPLEVEL[0], lcd_chardata_uplevel);
|
||||
lcd.createChar_P(LCD_STR_REFRESH[0], lcd_chardata_refresh);
|
||||
lcd.createChar_P(LCD_STR_FOLDER[0], lcd_chardata_folder);
|
||||
lcd.createChar_P(LCD_STR_FEEDRATE[0], lcd_chardata_feedrate);
|
||||
lcd.createChar_P(LCD_STR_CLOCK[0], lcd_chardata_clock);
|
||||
//lcd.createChar_P(LCD_STR_ARROW_UP[0], lcd_chardata_arrup);
|
||||
//lcd.createChar_P(LCD_STR_ARROW_DOWN[0], lcd_chardata_arrdown);
|
||||
lcd_createChar_P(LCD_STR_BEDTEMP[0], lcd_chardata_bedTemp);
|
||||
lcd_createChar_P(LCD_STR_DEGREE[0], lcd_chardata_degree);
|
||||
lcd_createChar_P(LCD_STR_THERMOMETER[0], lcd_chardata_thermometer);
|
||||
lcd_createChar_P(LCD_STR_UPLEVEL[0], lcd_chardata_uplevel);
|
||||
lcd_createChar_P(LCD_STR_REFRESH[0], lcd_chardata_refresh);
|
||||
lcd_createChar_P(LCD_STR_FOLDER[0], lcd_chardata_folder);
|
||||
lcd_createChar_P(LCD_STR_FEEDRATE[0], lcd_chardata_feedrate);
|
||||
lcd_createChar_P(LCD_STR_CLOCK[0], lcd_chardata_clock);
|
||||
//lcd_createChar_P(LCD_STR_ARROW_UP[0], lcd_chardata_arrup);
|
||||
//lcd_createChar_P(LCD_STR_ARROW_DOWN[0], lcd_chardata_arrdown);
|
||||
}
|
||||
|
||||
void lcd_set_custom_characters_arrows(void)
|
||||
{
|
||||
lcd.createChar_P(1, lcd_chardata_arrdown);
|
||||
lcd_createChar_P(1, lcd_chardata_arrdown);
|
||||
}
|
||||
|
||||
const uint8_t lcd_chardata_progress[8] PROGMEM = {
|
||||
|
@ -596,7 +662,7 @@ const uint8_t lcd_chardata_progress[8] PROGMEM = {
|
|||
|
||||
void lcd_set_custom_characters_progress(void)
|
||||
{
|
||||
lcd.createChar_P(1, lcd_chardata_progress);
|
||||
lcd_createChar_P(1, lcd_chardata_progress);
|
||||
}
|
||||
|
||||
const uint8_t lcd_chardata_arr2down[8] PROGMEM = {
|
||||
|
@ -620,12 +686,12 @@ const uint8_t lcd_chardata_confirm[8] PROGMEM = {
|
|||
|
||||
void lcd_set_custom_characters_nextpage(void)
|
||||
{
|
||||
lcd.createChar_P(1, lcd_chardata_arr2down);
|
||||
lcd.createChar_P(2, lcd_chardata_confirm);
|
||||
lcd_createChar_P(1, lcd_chardata_arr2down);
|
||||
lcd_createChar_P(2, lcd_chardata_confirm);
|
||||
}
|
||||
|
||||
void lcd_set_custom_characters_degree(void)
|
||||
{
|
||||
lcd.createChar_P(1, lcd_chardata_degree);
|
||||
lcd_createChar_P(1, lcd_chardata_degree);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,39 @@ extern void lcd_command(uint8_t value);
|
|||
|
||||
extern uint8_t lcd_write(uint8_t value);
|
||||
|
||||
extern void lcd_clear(void);
|
||||
|
||||
extern void lcd_set_cursor(uint8_t col, uint8_t row);
|
||||
|
||||
extern void lcd_createChar_P(uint8_t, const uint8_t*);
|
||||
|
||||
|
||||
extern int lcd_putc(int c);
|
||||
extern int lcd_puts_P(const char* str);
|
||||
extern int lcd_puts_at_P(uint8_t c, uint8_t r, const char* str);
|
||||
extern int lcd_printf_P(const char* format, ...);
|
||||
|
||||
extern void lcd_printNumber(unsigned long n, uint8_t base);
|
||||
extern void lcd_printFloat(double number, uint8_t digits);
|
||||
|
||||
extern void lcd_print(const char*);
|
||||
extern void lcd_print(char, int = 0);
|
||||
extern void lcd_print(unsigned char, int = 0);
|
||||
extern void lcd_print(int, int = 10);
|
||||
extern void lcd_print(unsigned int, int = 10);
|
||||
extern void lcd_print(long, int = 10);
|
||||
extern void lcd_print(unsigned long, int = 10);
|
||||
extern void lcd_print(double, int = 2);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -71,27 +104,6 @@ extern lcd_lcdupdate_func_t lcd_lcdupdate_func;
|
|||
|
||||
|
||||
|
||||
extern void lcd_clear(void);
|
||||
extern void lcd_set_cursor(uint8_t c, uint8_t r);
|
||||
extern int lcd_putc(int c);
|
||||
extern int lcd_puts_P(const char* str);
|
||||
extern int lcd_puts_at_P(uint8_t c, uint8_t r, const char* str);
|
||||
extern int lcd_printf_P(const char* format, ...);
|
||||
|
||||
extern void lcd_printNumber(unsigned long n, uint8_t base);
|
||||
extern void lcd_printFloat(double number, uint8_t digits);
|
||||
|
||||
extern void lcd_print(const char*);
|
||||
extern void lcd_print(char, int = 0);
|
||||
extern void lcd_print(unsigned char, int = 0);
|
||||
extern void lcd_print(int, int = 10);
|
||||
extern void lcd_print(unsigned int, int = 10);
|
||||
extern void lcd_print(long, int = 10);
|
||||
extern void lcd_print(unsigned long, int = 10);
|
||||
extern void lcd_print(double, int = 2);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
extern uint8_t lcd_clicked(void);
|
||||
|
|
Loading…
Reference in a new issue