DIGILIGHT
lcd_show.c
См. документацию.
1 
12 #include <avr/io.h>
13 #include "avr_helper.h"
14 #include <string.h>
15 #include <stdlib.h>
16 #include <avr/wdt.h>
17 #include "lcd.h"
18 #include "global.h"
19 #include "lcd_show.h"
20 
21 #define SYMBOL_SPECTRUM 0
22 #define SYMBOL_SCALE 1
23 
24 static uint8_t lcd_symbol_mode;
25 
29 static void set_chargen_spectrum(){
30  lcd_command(0x40); // установка адреса знакогенератора
31  for(uint8_t i=0; i<8; i++) // запись всех дополнительных символов
32  for(uint8_t j=0; j < 8; j++) // строки символа
33  lcd_data(j<(7-i) ? 0 : 0xFF); // постепенное заполнение
34  lcd_symbol_mode = SYMBOL_SPECTRUM;
35 }
36 
40 static void set_chargen_scale(){
41  uint8_t mask = 0;
42 
43  lcd_command(0x40); // установка адреса знакогенератора
44  for(uint8_t i=0; i<8; i++){ // запись всех дополнительных символов
45  for(uint8_t j=0; j < 8; j++){ // строки символа
46  lcd_data(j==3 ? 0xFF : mask); // постепенное заполнение
47  }
48  mask = (mask >> 1) | 0x10;
49  }
50  lcd_symbol_mode = SYMBOL_SCALE;
51 }
52 
57 INIT(0){
58  // важно - запрет WDT на самом раннем этапе
59  wdt_disable(); //
60 }
61 
62 
63 INIT(7){
64  // отработка наличия LCD
65 #if defined(__AVR_ATmega32__)
66  if(MCUCSR & (_BV(PORF) | _BV(EXTRF))){
67  // подано питание
68  MCUCSR &= ~(_BV(PORF) | _BV(EXTRF));
69 #elif defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
70  if(MCUSR & (_BV(PORF) | _BV(EXTRF))){
71  MCUSR &= ~(_BV(PORF) | _BV(EXTRF));
72 #endif
73  wdt_enable(WDTO_30MS); // включаем сторожа
74  lcd_init(); // пробуем инициализировать
75  wdt_disable(); // сюда попадаем, если не зависли
76  lcd_clrscr();
77  cfg.lcd_enabled = 1; // ЖКИ есть
78  set_chargen_spectrum();
79  } else {
80  wdt_disable();
81  cfg.lcd_enabled = 0; // ЖКИ нет
82  }
83 
84 }
85 
86 // размер вспомогательного буфера на 1 байт больше, чем строка ЖКИ
87 #define BUF_SZ (LCD_DISP_LENGTH+1)
88 // вспомогательный буфер
89 static char tmps[BUF_SZ];
94 static void put_tmps(uint8_t row){
95  tmps[LCD_DISP_LENGTH] = 0;
96  lcd_gotoxy(0, row);
97  lcd_puts(tmps);
98 }
99 
100 void show_number(int32_t num){
101  char str[17];
102  ltoa(num, str, 10);
103  show_rpad_str(1, str);
104 }
105 
111 void center_str_p(uint8_t row, const char *src){
112  memset(tmps, ' ', LCD_DISP_LENGTH);
113  uint8_t l = strlen_P(src);
114  memcpy_P(&tmps[(LCD_DISP_LENGTH-l)/2], src, l);
115  put_tmps(row);
116 }
117 
123 void center_str(uint8_t row, char *src){
124  memset(tmps, ' ', LCD_DISP_LENGTH);
125  uint8_t l = strlen(src);
126  memcpy(&tmps[(LCD_DISP_LENGTH-l)/2], src, l);
127  put_tmps(row);
128 }
129 
135 void show_rpad_str_p(uint8_t line, const char *src){
136  memset(tmps, ' ', LCD_DISP_LENGTH);
137  uint8_t l = strlen_P(src);
138  memcpy_P(tmps, src, l);
139  put_tmps(line);
140 }
141 
147 void show_rpad_str(uint8_t line, char *src){
148  memset(tmps, ' ', LCD_DISP_LENGTH);
149  uint8_t l = strlen(src);
150  memcpy(tmps, src, l);
151  put_tmps(line);
152 }
153 
154 #define D0 5
155 #define D1 1
156 #define D2 1
157 
163  static uint8_t div;
164  static uint8_t v[F_CNT];
165  static uint8_t d[F_CNT];
166 
167  if(--div) return;
168  div = D0;
169 
170  if(lcd_symbol_mode != SYMBOL_SPECTRUM) set_chargen_spectrum();
171 
172  uint8_t ch;
173  lcd_gotoxy(0,1);
174  for(uint8_t i=0; i<F_CNT; i++){
175  ch = (s->harmonics[i] / ((i < 2) ? 40 : 20));
176  if(ch > 8) ch = 8;
177  if(v[i] < ch){
178  v[i] = ch;
179  d[i] = D1;
180  }
181  if(d[i]){
182  d[i]--;
183  if(!d[i]){
184  if(v[i]) v[i]--;
185  if(v[i]) d[i] = D2;
186  }
187  }
188 
189  lcd_putc(v[i] ? v[i]-1 : ' ');
190  }
191 }
192 
201 void show_scale(uint8_t row, uint8_t val){
202  if(lcd_symbol_mode != SYMBOL_SCALE) set_chargen_scale();
203 
204  //val = MAX_LEVEL - val;
205 
206  uint8_t full = val / (MAX_LEVEL / LCD_DISP_LENGTH);
207  uint8_t nf = val % (MAX_LEVEL / LCD_DISP_LENGTH);
208  lcd_gotoxy(0,row);
209  for(uint8_t i=0; i<LCD_DISP_LENGTH; i++){
210  if(i < full) lcd_putc(6);
211  if(i > (full)) lcd_putc(0);
212  if(i == (full)) lcd_putc(nf);
213  }
214 }
215 
216 void show_hex_long(uint32_t num){
217  static __flash const char chr[16] = "0123456789ABCDEF";
218  uint8_t *ptr = (void*)&num;
219  for(int8_t i=3; i >= 0; i--){
220  lcd_putc(chr[ptr[i] >> 4]);
221  lcd_putc(chr[ptr[i] & 0x0F]);
222  }
223  for(uint8_t x=8; x < LCD_DISP_LENGTH; x++)
224  lcd_putc(' ');
225 }
226 
void lcd_gotoxy(uint8_t x, uint8_t y)
Set cursor to specified position.
Definition: lcd.c:380
#define MAX_LEVEL
фиксированное количество уровней регулирования чувствительности
Definition: global.h:81
void center_str(uint8_t row, char *src)
вывод строки по центру дисплея
Definition: lcd_show.c:123
void lcd_clrscr(void)
Clear display and set cursor to home position.
Definition: lcd.c:416
void show_scale(uint8_t row, uint8_t val)
отображение псевдографической горизонтальной шкалы
Definition: lcd_show.c:201
uint8_t lcd_enabled
ЖКИ присутствует
Definition: global.h:91
Вспомогательные эффекты ЖКИ
Общие описания
структура параметров звукового сигнала
Definition: global.h:72
uint16_t harmonics[F_CNT]
амплитуды всех гармоник сигнала
Definition: global.h:77
void show_hex_long(uint32_t num)
вывод 4 байтового числа в HEX формате с лидирующими нулями
Definition: lcd_show.c:216
void lcd_command(uint8_t cmd)
Send LCD controller instruction command.
Definition: lcd.c:354
void show_rpad_str(uint8_t line, char *src)
вывод строки с очисткой дисплея справа
Definition: lcd_show.c:147
void center_str_p(uint8_t row, const char *src)
вывод строки из flash по центру дисплея
Definition: lcd_show.c:111
#define LCD_DISP_LENGTH
Definition: lcd.h:65
void lcd_data(uint8_t data)
Send data byte to LCD controller.
Definition: lcd.c:366
void show_spectrum(signal_t *s)
отображение "мгновенного спектра" на 2-й строке ЖКИ
Definition: lcd_show.c:162
void lcd_puts(const char *s)
Display string without auto linefeed.
Definition: lcd.c:483
void lcd_init(void)
Initialize display and select type of cursor.
Definition: lcd.c:520
Общее количество гармоник
Definition: global.h:44
void lcd_putc(char c)
Display character at current cursor position.
Definition: lcd.c:436
void show_number(int32_t num)
вывод десятичного числа
Definition: lcd_show.c:100
void show_rpad_str_p(uint8_t line, const char *src)
вывод строки из flash с очисткой дисплея справа
Definition: lcd_show.c:135