Subversion Repositories HomeAutomation

Rev

Rev 1268 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. #include "act_lcd_eg2401.h"
  2. #include "act_lcd_eg2401_tileset.h"
  3.  
  4. #define LCD_LP   (1 <<  9)
  5. #define LCD_FR   (1 << 10)
  6. #define LCD_YSCL (1 << 13)
  7. #define LCD_DIN  (1 <<  0)
  8. #define LCD_XSCL (1 <<  1)
  9. #define LCD_XECL (1 <<  2)
  10. #define LCD_PXLS (0x00F0)
  11.  
  12. #define MASK_ALL (LCD_XSCL | LCD_XECL | LCD_LP | LCD_YSCL | LCD_DIN | LCD_FR | LCD_PXLS)
  13.  
  14. #define DDR_LOW   DDRD
  15. #define PORT_LOW  PORTD
  16. #define DDR_HIGH  DDRC
  17. #define PORT_HIGH PORTC
  18.  
  19. uint8_t lcd_framebuffer[256] = {
  20.       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  21.       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  22.       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  23.       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  24.       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  25.       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  26.       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  27.       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
  28. };
  29.  
  30.  
  31. uint8_t act_lcd_eg2401_getPxls( uint8_t x, uint8_t y );
  32. void act_lcd_eg2401_setPortL( uint16_t data );
  33. void act_lcd_eg2401_setPort( uint16_t data );
  34.  
  35. void act_lcd_eg2401_Init(void)
  36. {
  37.     // Init contrastPWM
  38.     TCCR1A |= (1<<COM1A1) | (1<<WGM11); /* Set OC1A at TOP, mode 14 */
  39.     TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11); /* Timer uses main system clock with 1/8 prescale */
  40.     ICR1 = 4;
  41.     OCR1A = 1; /* Servo at min position */
  42.     DDRB |= (1<<DDB1); /* Enable pin as output */
  43.  
  44.  
  45.  
  46.     // Setup ports
  47.     DDR_LOW  |= (MASK_ALL&0x00FF);
  48.     DDR_HIGH |= (MASK_ALL&0xFF00)>>8;
  49. }
  50.  
  51. void act_lcd_eg2401_Process(void)
  52. {
  53.     uint8_t x, y; // x counting segments of 4 pxl
  54.     uint8_t pxldata;
  55.  
  56.     static uint16_t fr = 0;
  57.     fr ^= LCD_FR;
  58.  
  59.     act_lcd_eg2401_setPort( fr );
  60.     for( y=0; y<64; y++ ) {
  61.         for( x=0; x<7; x++ ) {
  62.             pxldata = act_lcd_eg2401_getPxls( x, y );
  63.             act_lcd_eg2401_setPortL( (pxldata&0xF0) | LCD_XSCL );
  64.             act_lcd_eg2401_setPortL( (pxldata&0xF0) );
  65.             pxldata <<= 4;
  66.             act_lcd_eg2401_setPortL( pxldata | LCD_XSCL );
  67.             act_lcd_eg2401_setPortL( pxldata );
  68.         }
  69.         pxldata = act_lcd_eg2401_getPxls( x, y );
  70.         act_lcd_eg2401_setPortL( (pxldata&0xF0) | LCD_XSCL );
  71.         act_lcd_eg2401_setPortL( (pxldata&0xF0) );
  72.  
  73.         pxldata <<= 4;
  74.         act_lcd_eg2401_setPortL( pxldata | LCD_XSCL | LCD_XECL );
  75.         act_lcd_eg2401_setPortL( pxldata | LCD_XECL );
  76.         act_lcd_eg2401_setPortL( pxldata );
  77.  
  78.         for( x=8; x<15; x++ ) {
  79.             pxldata = act_lcd_eg2401_getPxls( x, y );
  80.             act_lcd_eg2401_setPortL( (pxldata&0xF0) | LCD_XSCL );
  81.             act_lcd_eg2401_setPortL( (pxldata&0xF0) );
  82.             pxldata <<= 4;
  83.             act_lcd_eg2401_setPortL( pxldata | LCD_XSCL );
  84.             act_lcd_eg2401_setPortL( pxldata );
  85.         }
  86.         pxldata = act_lcd_eg2401_getPxls( x, y );
  87.         act_lcd_eg2401_setPortL( (pxldata&0xF0) | LCD_XSCL );
  88.         act_lcd_eg2401_setPortL( (pxldata&0xF0) );
  89.  
  90.         pxldata <<= 4;
  91.         act_lcd_eg2401_setPortL( pxldata | LCD_XSCL | LCD_XECL );
  92.         act_lcd_eg2401_setPortL( pxldata | LCD_XECL );
  93.         act_lcd_eg2401_setPortL( pxldata );
  94.  
  95.         for( x=16; x<23; x++ ) {
  96.             pxldata = act_lcd_eg2401_getPxls( x, y );
  97.             act_lcd_eg2401_setPortL( (pxldata&0xF0) | LCD_XSCL );
  98.             act_lcd_eg2401_setPortL( (pxldata&0xF0) );
  99.             pxldata <<= 4;
  100.             act_lcd_eg2401_setPortL( pxldata | LCD_XSCL );
  101.             act_lcd_eg2401_setPortL( pxldata );
  102.         }
  103.         pxldata = act_lcd_eg2401_getPxls( x, y );
  104.         act_lcd_eg2401_setPortL( (pxldata&0xF0) | LCD_XSCL );
  105.         act_lcd_eg2401_setPortL( (pxldata&0xF0) );
  106.  
  107.         pxldata <<= 4;
  108.         act_lcd_eg2401_setPortL( pxldata | LCD_XSCL | LCD_XECL );
  109.         act_lcd_eg2401_setPortL( pxldata | LCD_XECL );
  110.         act_lcd_eg2401_setPortL( pxldata );
  111.  
  112.         for( x=24; x<31; x++ ) {
  113.             pxldata = act_lcd_eg2401_getPxls( x, y );
  114.             act_lcd_eg2401_setPortL( (pxldata&0xF0) | LCD_XSCL );
  115.             act_lcd_eg2401_setPortL( (pxldata&0xF0) );
  116.             pxldata <<= 4;
  117.             act_lcd_eg2401_setPortL( pxldata | LCD_XSCL );
  118.             act_lcd_eg2401_setPortL( pxldata );
  119.         }
  120.         pxldata = act_lcd_eg2401_getPxls( x, y );
  121.         act_lcd_eg2401_setPortL( (pxldata&0xF0) | LCD_XSCL );
  122.         act_lcd_eg2401_setPortL( (pxldata&0xF0) );
  123.  
  124.         pxldata <<= 4;
  125.         if( y==0 ) {
  126.             act_lcd_eg2401_setPort( fr | pxldata | LCD_XSCL | LCD_XECL          | LCD_YSCL | LCD_DIN );
  127.             act_lcd_eg2401_setPort( fr | pxldata | LCD_XECL            | LCD_LP | LCD_YSCL | LCD_DIN );
  128.             act_lcd_eg2401_setPort( fr | pxldata                       | LCD_LP            | LCD_DIN );
  129.         } else {
  130.             act_lcd_eg2401_setPort( fr | pxldata | LCD_XSCL | LCD_XECL          | LCD_YSCL );
  131.             act_lcd_eg2401_setPort( fr | pxldata | LCD_XECL            | LCD_LP | LCD_YSCL );
  132.             act_lcd_eg2401_setPort( fr | pxldata                       | LCD_LP );
  133.         }
  134.         act_lcd_eg2401_setPort( fr | pxldata );
  135.     }
  136. /*    act_lcd_eg2401_setPort( fr | pxldata | LCD_YSCL );
  137.     act_lcd_eg2401_setPort( fr | pxldata );
  138. FIXME: clock away from last row... */
  139.  
  140. }
  141.  
  142. void act_lcd_eg2401_setPortL( uint16_t data ) {
  143.     PORT_LOW  = (  data&MASK_ALL     &0xFF) | (PORT_LOW & (~MASK_ALL)    &0xFF);
  144. }
  145.  
  146. void act_lcd_eg2401_setPort( uint16_t data ) {
  147.     PORT_LOW  = (  data&MASK_ALL     &0xFF) | (PORT_LOW & (~MASK_ALL)    &0xFF);
  148.     PORT_HIGH = (((data&MASK_ALL)>>8)&0xFF) | (PORT_HIGH&((~MASK_ALL)>>8)&0xFF);
  149. }
  150.  
  151. uint8_t act_lcd_eg2401_getPxls( uint8_t x, uint8_t y ) {
  152.     uint16_t i = lcd_framebuffer[ x | ((y<<2)&0xe0) ];
  153.     i <<= 3;
  154.     i |= y&0x07;
  155.     return pgm_read_byte( act_lcd_eg2401_tileset + i );
  156. }
  157.  
  158. void act_lcd_eg2401_HandleMessage(StdCan_Msg_t *rxMsg) {}
  159. void act_lcd_eg2401_List(uint8_t ModuleSequenceNumber) {}
  160.