AVR1631 - Energy Meter Reference Design with ATxmega32A4  Rev 1.0
 All Data Structures Files Functions Variables Typedefs Macros
meter_lcd_module.c
Go to the documentation of this file.
1 /* This file has been prepared for Doxygen automatic documentation generation.*/
48 #include "meter.h"
49 __eeprom RTC_BCD_t eepromTime @ 0x02;
51  // 0 1 2 3 4 5 6 7 8 9 A B C D E F
52 uint16_t number_arr[16] = {125,96,62,122,99,91,95,112,127,123,119,127,29,125,31,23};
53 
69 void lcd_disp_key(void)
70 {
72  lcd_clear_all();
74  lcd_read_write(LCD_DATA_READ_WRITE,18,number_arr[key_flag]);
76  switch(key_flag)
77  {
78  case 0x00:
79  lcd_disp_time();
80  break;
81  case 0x01:
82  lcd_disp_date();
83  break;
84  case 0x02:
86  break;
87  case 0x03:
89  break;
90  case 0x04:
92  break;
93  case 0x05:
95  break;
96  case 0x06:
97  lcd_disp_power_factor(power_factor);
98  break;
99  case 0x07:
100  lcd_disp_energy();
101  break;
102  case 0x08:
104  break;
105  case 0x09:
106  lcd_disp_frequency(frequency);
107  break;
108  case 0x0A:
109  lcd_show_all();
110  break;
111  default:
112  lcd_disp_time();
113  }
114 
115 }
116 
120 void lcd_disp_date(void)
121 {
122  uint32_t disp_time = 0;
123  uint16_t disp_temp = 0;
124  disp_time = (uint32_t)rtcTime.day*10000;
125  disp_time += (uint32_t)rtcTime.month*100;
126  disp_time += (uint32_t)rtcTime.year%100;
127 
128  for (uint8_t k = 14;k > 3;k-=2)
129  {
130  disp_temp = disp_time % 10;
131  disp_time /= 10;
132  lcd_data(LCD_DATA_WRITE,k,number_arr[disp_temp]); // display the date
133  }
134  delay_us(1);
135  lcd_read_write(LCD_DATA_READ_WRITE,6,128); // dispaly ':'
136  delay_us(1);
137  lcd_read_write(LCD_DATA_READ_WRITE,10,128); // display ':'
138  delay_us(1);
139  lcd_read_write(LCD_DATA_READ_WRITE,20,number_arr[0]); // display 'D'
140 }
141 
145 void lcd_disp_time(void)
146 {
147  uint32_t disp_time = 0;
148  uint8_t disp_temp = 0;
149  disp_time = (int32_t)rtcTime.hr*10000;
150  disp_time += (int32_t)rtcTime.min*100;
151  disp_time += (int32_t)rtcTime.sec;
152 
153  for (uint8_t k = 14;k > 3;k-=2)
154  {
155  disp_temp = (uint8_t)(disp_time % 10);
156  disp_time = (disp_time / 10);
157  lcd_data(LCD_DATA_WRITE,k,number_arr[disp_temp]);
158  }
159  delay_us(1);
160  lcd_read_write(LCD_DATA_READ_WRITE,6,128); // dispaly ':'
161  delay_us(1);
162  lcd_read_write(LCD_DATA_READ_WRITE,10,128); // dispaly ':'
163  delay_us(1);
164  lcd_read_write(LCD_DATA_READ_WRITE,22,8); // dispaly 'T'
165 }
166 
170 void lcd_disp_energy(void)
171 {
172  uint16_t disp_temp = 0;
173  uint32_t energy;
174  energy = (uint32_t)(meter.kwh*100000);
175  lcd_data(LCD_DATA_WRITE,26,3); //display kwh
176  for (uint8_t k =14;k>1;k-=2)
177  {
178  disp_temp = energy % 10;
179  energy /= 10;
180  lcd_data(LCD_DATA_WRITE,k,number_arr[disp_temp]);
181  }
182  lcd_read_write(LCD_DATA_READ_WRITE,4,128); //6,8,128 display '.'
183 }
184 
188 void lcd_disp_power_factor(int16_t pf)
189 {
190  uint16_t disp_temp = 0;
191  lcd_read_write(LCD_DATA_READ_WRITE,24,64); //disp pf
192  for (uint8_t k =14;k>7;k-=2)
193  {
194  disp_temp = pf % 10;
195  pf /= 10;
196  lcd_data(LCD_DATA_WRITE,k,number_arr[disp_temp]);
197  }
198  lcd_read_write(LCD_DATA_READ_WRITE,8,128);
199 }
200 
204 void lcd_disp_frequency(uint16_t freq)
205 {
206  uint16_t disp_temp = 0;
207  for (uint8_t k =12;k>5;k-=2)
208  {
209  disp_temp = freq % 10;
210  freq /= 10;
211  lcd_data(LCD_DATA_WRITE,k,number_arr[disp_temp]);
212  }
213  lcd_read_write(LCD_DATA_READ_WRITE,8,128);
214 }
215 
216 
221 {
222  uint8_t disp_temp;
223  uint16_t act_power;
224 
225  act_power = (int32_t)active_power[0];
226  lcd_data(LCD_DATA_WRITE,26,1);
227  for (uint8_t k =14;k>5;k-=2)
228  {
229  disp_temp = act_power % 10;
230  act_power /= 10;
231  lcd_data(LCD_DATA_WRITE,k,number_arr[disp_temp]);
232  }
233  lcd_read_write(LCD_DATA_READ_WRITE,8,128);
234 }
235 
240 {
241  uint8_t disp_temp;
242  uint16_t act_power;
243 
244  act_power = (int32_t)max_demand;
245  lcd_data(LCD_DATA_WRITE,26,1);
246  for (uint8_t k =14;k>5;k-=2)
247  {
248  disp_temp = act_power % 10;
249  act_power /= 10;
250  lcd_data(LCD_DATA_WRITE,k,number_arr[disp_temp]);
251  }
252  lcd_read_write(LCD_DATA_READ_WRITE,8,128);
253  lcd_read_write(LCD_DATA_READ_WRITE,2,128);
254 }
255 
256 
257 
262 {
263  uint8_t disp_temp = 0;
264  uint16_t app_power;
265 
266  app_power = apparent_power;
267  lcd_data(LCD_DATA_WRITE,26,48);
268  for (uint8_t k =14;k>5;k-=2)
269  {
270  disp_temp = app_power % 10;
271  app_power = app_power / 10;
272  lcd_data(LCD_DATA_WRITE,k,number_arr[disp_temp]);
273  }
274  lcd_read_write(LCD_DATA_READ_WRITE,8,128);
275 }
276 
277 
282 {
283  uint8_t disp_temp = 0;
284  uint16_t volt;
285 
286  volt = Vrms[0];
287  lcd_data(LCD_DATA_WRITE,26,16);
288  for (uint8_t k =14;k>3;k-=2)
289  {
290  disp_temp = (uint8_t)(volt % 10);
291  volt = (volt / 10);
292  lcd_data(LCD_DATA_WRITE,k,number_arr[disp_temp]);
293  }
294  lcd_read_write(LCD_DATA_READ_WRITE,4,128); //disp "."
295 }
296 
301 {
302  uint8_t disp_temp = 0;
303  uint16_t amp;
304  amp = (uint16_t)Irms[0];
305  lcd_data(LCD_DATA_WRITE,26,32); //disp A
306  for (uint8_t k =14;k>5;k-=2)
307  {
308  disp_temp = (uint8_t)(amp % 10);
309  amp = amp / 10;
310  lcd_data(LCD_DATA_WRITE,k,number_arr[disp_temp]);
311  }
312  lcd_read_write(LCD_DATA_READ_WRITE,8,128); //disp "."
313 }
314 
315 
319 void lcd_command(uint8_t cmd1, uint8_t cmd2)
320 {
321  int cmd_count;
322  cmd1 <<= 5;
323  LCD_CS_CLEAR;
324  asm("nop");
325  delay_us(100);
326  for (cmd_count = 0;cmd_count < 3;cmd_count++)
327  {
328  LCD_WRITE_CLEAR;
329  delay_us(100);
330  LCD_DATA_OUT((cmd1 & 0x80)>>7);
331  cmd1 <<= 1;
332  delay_us(100);
333  LCD_WRITE_SET;
334  delay_us(100);
335  }
336 
337  for (cmd_count = 0;cmd_count < 9;cmd_count++)
338  {
339  LCD_WRITE_CLEAR;
340  delay_us(100);
341  LCD_DATA_OUT((cmd2 & 0x80)>>7);
342  cmd2 <<= 1;
343  delay_us(100);
344  LCD_WRITE_SET;
345  delay_us(100);
346  }
347  LCD_CS_SET;
348  delay_us(100);
349 }
350 
354 void lcd_data(uint8_t cmd, uint8_t lr_addr, uint8_t lr_data)
355 {
356  int cmd_count;
357  cmd <<= 5;
358  LCD_CS_CLEAR;
359  asm("nop");
360  asm("nop");
361  for (cmd_count = 0;cmd_count < 3;cmd_count++)
362  {
363  LCD_WRITE_CLEAR;
364  asm("nop");
365  asm("nop");
366  LCD_DATA_OUT((cmd & 0x80)>>7);
367  cmd <<= 1;
368  asm("nop");
369  asm("nop");
370  LCD_WRITE_SET;
371  asm("nop");
372  asm("nop");
373  }
374  lr_addr <<=2;
375  for (cmd_count = 0;cmd_count < 6 ;cmd_count++)
376  {
377  LCD_WRITE_CLEAR;
378  asm("nop");
379  asm("nop");
380  LCD_DATA_OUT((lr_addr & 0x80)>>7);
381  lr_addr <<= 1;
382  asm("nop");
383  asm("nop");
384  LCD_WRITE_SET;
385  asm("nop");
386  asm("nop");
387  }
388  for (cmd_count = 0;cmd_count < 9 ;cmd_count++)
389  {
390  LCD_WRITE_CLEAR;
391  asm("nop");
392  asm("nop");
393  LCD_DATA_OUT(lr_data & 0x01);
394  lr_data >>= 1;
395  asm("nop");
396  asm("nop");
397  LCD_WRITE_SET;
398  asm("nop");
399  asm("nop");
400  }
401  LCD_CS_SET;
402  asm("nop");
403  asm("nop");
404 
405 }
406 
410 void lcd_read_write(uint8_t cmd, uint8_t lr_addr, uint8_t lr_data)
411 {
412  int cmd_count = 0;
413  uint16_t rd = 0;
414  uint8_t lr_addr_b;
415  cmd <<= 5;
416  lr_addr_b = lr_addr;
417  LCD_CS_CLEAR;
418  delay_us(1);
419  for (cmd_count = 0;cmd_count < 3;cmd_count++)
420  {
421  LCD_WRITE_CLEAR;
422  delay_us(1);
423  LCD_DATA_OUT((cmd & 0x80)>>7);
424  cmd <<= 1;
425  delay_us(1);
426  LCD_WRITE_SET;
427  delay_us(1);
428  }
429  lr_addr <<=2;
430  for (cmd_count = 0;cmd_count < 6 ;cmd_count++)
431  {
432  LCD_WRITE_CLEAR;
433  delay_us(1);
434  LCD_DATA_OUT((lr_addr & 0x80)>>7);
435  lr_addr <<= 1;
436  delay_us(1);
437  LCD_WRITE_SET;
438  delay_us(1);
439  }
440  LCD.DIRCLR = LCD_DATA;
441  //LCD.PIN0CTRL = PORT_OPC_TOTEM_gc ;
442  for (cmd_count = 0;cmd_count < 8 ;cmd_count++)
443  {
444  LCD_READ_CLEAR;
445  delay_us(1);
446  rd |= (LCD.IN & 0x01)<<cmd_count;
447  delay_us(1);
448  LCD_READ_SET;
449  delay_us(1);
450  }
451  LCD_CS_SET;
452  LCD.DIRSET = LCD_DATA;
453  delay_us(1);
454  rd += lr_data;
455  lcd_data(LCD_DATA_WRITE,lr_addr_b,rd);
456 }
457 
458 
462 void lcd_clear_all(void)
463 {
464  for (int i = 0; i <= 0x1C; i+=2)
465  {
466  lcd_data(LCD_DATA_WRITE,i,0x00);
467  asm("nop");
468  asm("nop");
469  }
470 }
471 
475 void lcd_show_all(void)
476 {
477  for (int i = 0; i <= 0x1C; i+=2)
478  {
479  lcd_data(LCD_DATA_WRITE,i,0xFF);
480  asm("nop");
481  asm("nop");
482  }
483 }