You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
5.3 KiB
277 lines
5.3 KiB
#include <string.h>
|
|
#include "display.h"
|
|
|
|
char display_content[40]; // is zeroed by being in .bss
|
|
uint8_t display_currpos;
|
|
|
|
|
|
/* char layout is "line-addr" | "data" */
|
|
const prog_uint8_t lcd_halfbar_char[] = {0x1c, /* 11100 */
|
|
0x1c, /* 11100 */
|
|
0x1c, /* 11100 */
|
|
0x1c, /* 11100 */
|
|
0x1c, /* 11100 */
|
|
0x1c, /* 11100 */
|
|
0x1c, /* 11100 */
|
|
0x00}; /* 00000 */ /* cursor line */
|
|
|
|
const prog_uint8_t lcd_bar_char[] = {0x1f, /* 11111 */
|
|
0x1f, /* 11111 */
|
|
0x1f, /* 11111 */
|
|
0x1f, /* 11111 */
|
|
0x1f, /* 11111 */
|
|
0x1f, /* 11111 */
|
|
0x1f, /* 11111 */
|
|
0x00}; /* 00000 */ /* cursor line */
|
|
|
|
const prog_uint8_t lcd_degree_char[] = {0x12, /* 10010 */
|
|
0x05, /* 00101 */
|
|
0x04, /* 00100 */
|
|
0x05, /* 00101 */
|
|
0x02, /* 00010 */
|
|
0x00, /* 00000 */
|
|
0x00, /* 00000 */
|
|
0x00}; /* 00000 */ /* cursor line */
|
|
|
|
|
|
|
|
|
|
void lcd_defchar(uint8_t contr, uint8_t addr, const prog_uint8_t * chargraph) {
|
|
int i=0;
|
|
|
|
lcd_command(contr, _BV(LCD_CGRAM) | addr*8);
|
|
|
|
for (i=0; i<=7; i++) {
|
|
lcd_data(contr, pgm_read_byte(chargraph+i) & 0x1F); /* only the lower 5 bits */
|
|
}
|
|
lcd_command(contr, _BV(LCD_DDRAM));
|
|
}
|
|
|
|
|
|
void display_puts(const char * printstr) {
|
|
|
|
while (*printstr){
|
|
if (*printstr == '\n') {
|
|
display_put_eol();
|
|
} else {
|
|
display_putc(*printstr);
|
|
}
|
|
printstr++;
|
|
}
|
|
}
|
|
|
|
void display_puts_P(const prog_char * printstr) {
|
|
|
|
while(pgm_read_byte(printstr)) {
|
|
if (pgm_read_byte(printstr) == '\n') {
|
|
display_put_eol();
|
|
} else {
|
|
display_putc(pgm_read_byte(printstr));
|
|
}
|
|
printstr++;
|
|
}
|
|
}
|
|
|
|
void display_put_eol() {
|
|
/* fill until end of display line */
|
|
|
|
uint8_t j = 0;
|
|
|
|
if (display_currpos <= 16) {
|
|
/* first line */
|
|
for (j = display_currpos; j < 16; j++) {
|
|
display_putc(' ');
|
|
}
|
|
} else if (display_currpos <= 32) {
|
|
/* second line */
|
|
for (j = display_currpos; j < 32; j++) {
|
|
display_putc(' ');
|
|
}
|
|
}
|
|
}
|
|
|
|
void display_putc(char printchar) {
|
|
uint8_t lcdaddr;
|
|
if (display_currpos >= 32) {
|
|
return;
|
|
}
|
|
if (printchar != display_content[display_currpos]) {
|
|
display_content[display_currpos] = printchar;
|
|
lcdaddr = display_currpos;
|
|
if (display_currpos >= 16) {
|
|
lcdaddr = LCD_LINE2_ADDR - 16 + display_currpos;
|
|
}
|
|
lcd_command(1,_BV(LCD_DDRAM) | lcdaddr);
|
|
lcd_data(1,printchar);
|
|
}
|
|
display_currpos++;
|
|
}
|
|
|
|
|
|
void display_fillblank() {
|
|
while (display_currpos < 32){
|
|
display_putc(' ');
|
|
}
|
|
}
|
|
|
|
void display_gotoyx(uint8_t y, uint8_t x) {
|
|
/* first line is line 0 */
|
|
|
|
if (y > 1) {
|
|
/* caller error, we only have two lines! set to first line */
|
|
y = 0;
|
|
}
|
|
if (x > 15) {
|
|
/* caller error, we only have 16 chars! set to first char */
|
|
x = 0;
|
|
}
|
|
|
|
display_currpos = y * 16 + x;
|
|
}
|
|
|
|
|
|
extern void display_update() {
|
|
uint8_t i=0;
|
|
|
|
lcd_command(1, _BV(LCD_DDRAM));
|
|
for (i = 0; i <= 15; i++) {
|
|
lcd_data(1,display_content[i]);
|
|
}
|
|
|
|
lcd_command(1, _BV(LCD_DDRAM) | LCD_LINE2_ADDR);
|
|
for (i = 16; i <= 32; i++) {
|
|
lcd_data(1,display_content[i]);
|
|
}
|
|
}
|
|
|
|
|
|
extern void display_force_redraw() {
|
|
display_update();
|
|
}
|
|
|
|
|
|
|
|
|
|
int16_t intexp10(int8_t a){
|
|
int8_t i;
|
|
int16_t ret=1;
|
|
for(i=0; i<a; ++i){
|
|
ret *= 10;
|
|
}
|
|
return(ret);
|
|
}
|
|
|
|
void display_temperature(int16_t temperature){
|
|
// temperature is a signed int of 16* the actual temperature
|
|
int8_t fillzero=0, i;
|
|
char c;
|
|
|
|
temperature *= 10;
|
|
for(i=3; i>=0; i--){
|
|
if(i==1) {
|
|
fillzero = 1;
|
|
}
|
|
c = getdigit(&temperature, intexp10(i)*16, &fillzero); // hundred-digit
|
|
display_putc(c);
|
|
if(i==1) {
|
|
display_putc('.');
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void display_putint(int16_t number){
|
|
int8_t fillzero=0, i;
|
|
char c;
|
|
|
|
for(i=2; i>=0; i--){
|
|
if(i==1) {
|
|
fillzero = 1;
|
|
}
|
|
c = getdigit(&number, intexp10(i), &fillzero); // hundred-digit
|
|
display_putc(c);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
char getdigit(int16_t *input, int16_t div, int8_t *fillzero){
|
|
char digit;
|
|
if(*input < 0){
|
|
*input = - *input; /* to convert from (binary) 2s-complement
|
|
to (ascii) sign and magnitude */
|
|
return '-';
|
|
} else {
|
|
digit = *input / div;
|
|
*input -= digit * div;
|
|
}
|
|
digit += '0'; //converts to ascii
|
|
if(digit == '0' && ! *fillzero){
|
|
digit = ' ';
|
|
} else {
|
|
*fillzero = 1;
|
|
}
|
|
return digit;
|
|
}
|
|
|
|
|
|
|
|
void display_puthex(uint8_t outbyte) {
|
|
uint8_t lownibble, highnibble;
|
|
|
|
lownibble = outbyte & 0x0F;
|
|
highnibble = (outbyte & 0xF0) >> 4;
|
|
|
|
if (highnibble >= 10) {
|
|
display_putc(0x41 - 10 + highnibble);
|
|
} else {
|
|
display_putc(0x30 + highnibble);
|
|
}
|
|
if (lownibble >= 10) {
|
|
display_putc(0x41 - 10 + lownibble);
|
|
} else {
|
|
display_putc(0x30 + lownibble);
|
|
}
|
|
}
|
|
|
|
void display_bar(int8_t value, int8_t min, int8_t max) {
|
|
/* paint contrast bar */
|
|
uint16_t tmp_var = 0;
|
|
|
|
max -= min;
|
|
value -= min;
|
|
|
|
tmp_var = value * 32;
|
|
tmp_var = tmp_var / max;
|
|
|
|
while (tmp_var >= 2) {
|
|
display_putc(LCD_CHAR_BAR);
|
|
tmp_var -= 2;
|
|
}
|
|
if (tmp_var >=1) {
|
|
display_putc(LCD_CHAR_HALFBAR);
|
|
tmp_var -= 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void updateTemperature() {
|
|
if(newThermoData==1) {
|
|
newThermoData = 0;
|
|
|
|
char str[34];
|
|
snprintf(str, 34, "%3d.%02d\x03 %3d.%02d\x03\n%3d.%02d\x03 %3d.%02d\x03", thermoData[0]/100, thermoData[0]%100,
|
|
thermoData[1]/100, thermoData[1]%100,
|
|
thermoData[2]/100, thermoData[2]%100,
|
|
thermoData[3]/100, thermoData[3]%100
|
|
);
|
|
display_gotoyx(0,0);
|
|
display_puts(str);
|
|
display_update();
|
|
}
|
|
}
|