示例#1
0
uint32_t lcd_drawchar(uint32_t x, uint32_t y, char c, uint32_t size, uint32_t fgcolor, uint32_t bgcolor, uint32_t clear_bg)
{
  uint32_t ret, i, x0, y0, x1, y1, h, data, mask;
  uint8_t *ptr;

  //size = (size==0)?1:size;

  x1 = x+(FONT_WIDTH*size);
  y1 = y+(FONT_HEIGHT*size);

  if((x1-1) >= width)
  {
    return width+1;
  }
  else if((y1-1) >= height)
  {
    return width+1;
  }
  else if(c < FONT_START)
  {
    return x;
  }
  size--;
  ret = x1;

  lcd_enable();

  ptr = (uint8_t*)&fontdata[(c-FONT_START)*(8*FONT_HEIGHT/8)];
  if(size == 0)
  {
    y0 = y;
    for(h=FONT_HEIGHT; h!=0; h--)
    {
      data = *ptr++;
      x0 = x;
      for(mask=(1<<(FONT_WIDTH-1)); mask!=0; mask>>=1)
      {
        if(data & mask)
        {
          lcd_setarea(x0, y0, x0, y0);
          lcd_drawstart();
          lcd_draw(fgcolor);
          lcd_drawstop();
        }
        else if(clear_bg)
        {
          lcd_setarea(x0, y0, x0, y0);
          lcd_drawstart();
          lcd_draw(bgcolor);
          lcd_drawstop();
        }
        x0++;
      }
      y0++;
    }
  }
示例#2
0
文件: main.c 项目: markusk/direcs
/**
  * @brief  Main program
  * @param  None
  * @retval None
  */
int main(void)
{
  lcdInit();

/*
// code from mikorcontroller.net graphics example with jpg pic:
  uint16_t x;
  uint8_t y;
  uint8_t r,g,b;
  lcd_area(0, 0, (LCD_WIDTH-1), (LCD_HEIGHT-1));
  lcd_drawstart();
  for(y = 0; y < LCD_HEIGHT; y++)
  {
    for(x = 0; x < LCD_WIDTH; x++)
    {
      r = x + y;
      g = x - y;
      b = y - x;
      lcd_draw(RGB(r,g,b));
    }
  }
  lcd_drawstop();
*/


// mk
  lcd_area(1, 1, 20, 20);
  lcd_drawstart();
  lcd_draw(COLOR_BLACK);
  lcd_drawstop();
  
}
示例#3
0
文件: lcd.c 项目: horazont/hint
inline void lcd_setpixel(const uint16_t x0, const uint16_t y0,
                         const colour_t colour)
{
    lcd_setarea(x0, y0, x0, y0);
    lcd_drawstart();
    lcd_draw(colour);
    lcd_drawstop();
}
示例#4
0
文件: main.c 项目: markusk/direcs
void lcd_clear(unsigned int color)
{
  unsigned int i;

  lcd_area(0, 0, (LCD_WIDTH-1), (LCD_HEIGHT-1));

  lcd_drawstart();
  for(i=(LCD_WIDTH*LCD_HEIGHT/8); i!=0; i--)
  {
    lcd_draw(color); //1
    lcd_draw(color); //2
    lcd_draw(color); //3
    lcd_draw(color); //4
    lcd_draw(color); //5
    lcd_draw(color); //6
    lcd_draw(color); //7
    lcd_draw(color); //8
  }
  lcd_drawstop();

  return;
}
示例#5
0
int main(int argc, char const *argv[])
{
    if (argc > 1) {
        char input[MAX_INPUT_LENGTH];
        int segments = 2;
        if (strcmp(argv[1], "-s") == 0) {
            if (argc == 4) {
                segments = atoi(argv[2]);
                strcpy(input, argv[3]);
            }
        } else {
            strcpy(input, argv[1]);
        }
        LCD *lcd = malloc(sizeof(LCD));
        lcd_init(lcd, input, segments);
        lcd_draw(lcd);
        free(lcd);
    } else {
        printf("Usage: %s [-s SEGMENTS] NUMBER\n", argv[0]);
    }
  return 0;
}
示例#6
0
void lcd_reset(void)
{
  uint32_t c, i, j;
  uint8_t initdata[] = 
  {
    //0x40| 1, LCD_CMD_RESET,
    //0xC0|60,
    //0xC0|60,
    0x40| 1, LCD_CMD_DISPLAY_OFF,
    0xC0|20,
    0x40| 1, LCD_CMD_POWER_CTRLB,
    0x80| 3, 0x00, 0x83, 0x30, //0x83 0x81 0xAA
    0x40| 1, LCD_CMD_POWERON_SEQ_CTRL,
    0x80| 4, 0x64, 0x03, 0x12, 0x81, //0x64 0x67
    0x40| 1, LCD_CMD_DRV_TIMING_CTRLA,
    0x80| 3, 0x85, 0x01, 0x79, //0x79 0x78
    0x40| 1, LCD_CMD_POWER_CTRLA,
    0x80| 5, 0x39, 0X2C, 0x00, 0x34, 0x02,
    0x40| 1, LCD_CMD_PUMP_RATIO_CTRL,
    0x80| 1, 0x20,
    0x40| 1, LCD_CMD_DRV_TIMING_CTRLB,
    0x80| 2, 0x00, 0x00,
    0x40| 1, LCD_CMD_POWER_CTRL1,
    0x80| 1, 0x26, //0x26 0x25
    0x40| 1, LCD_CMD_POWER_CTRL2,
    0x80| 1, 0x11,
    0x40| 1, LCD_CMD_VCOM_CTRL1,
    0x80| 2, 0x35, 0x3E,
    0x40| 1, LCD_CMD_VCOM_CTRL2,
    0x80| 1, 0xBE, //0xBE 0x94
    0x40| 1, LCD_CMD_FRAME_CTRL,
    0x80| 2, 0x00, 0x1B, //0x1B 0x70
    0x40| 1, LCD_CMD_ENABLE_3G,
    0x80| 1, 0x08, //0x08 0x00
    0x40| 1, LCD_CMD_GAMMA,
    0x80| 1, 0x01, //G2.2
    0x40| 1, LCD_CMD_POS_GAMMA,
    0x80|15, 0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00,
  //0x80|15, 0x0F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00,
    0x40| 1, LCD_CMD_NEG_GAMMA,
    0x80|15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F,
  //0x80|15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x0F,
    0x40| 1, LCD_CMD_DISPLAY_CTRL,
    0x80| 4, 0x0A, 0x82, 0x27, 0x00,
    0x40| 1, LCD_CMD_ENTRY_MODE,
    0x80| 1, 0x07,
    0x40| 1, LCD_CMD_PIXEL_FORMAT,
    0x80| 1, 0x55, //16bit
    0x40| 1, LCD_CMD_MEMACCESS_CTRL,
    0x80| 1, (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y),
    0x40| 1, LCD_CMD_COLUMN,
    0x80| 2, 0x00, 0x00,
    0x80| 2, ((LCD_HEIGHT-1)>>8)&0xFF, (LCD_HEIGHT-1)&0xFF,
    0x40| 1, LCD_CMD_PAGE,
    0x80| 2, 0x00, 0x00,
    0x80| 2, ((LCD_WIDTH-1)>>8)&0xFF, (LCD_WIDTH-1)&0xFF,
    0x40| 1, LCD_CMD_SLEEPOUT,
    0xC0|60,
    0xC0|60,
    0x40| 1, LCD_CMD_DISPLAY_ON,
    0xC0|20,
  };

  //init pins
  INIT_PINS();

  //hardware reset
  GPIO_CLRPIN(LCD_PORT, RST_PIN);
  delay_ms(20);
  GPIO_SETPIN(LCD_PORT, RST_PIN);
  delay_ms(120);

  lcd_enable();

  //send init commands and data
  for(i=0; i<sizeof(initdata);)
  {
    c = initdata[i++];
    switch(c&0xC0)
    {
      case 0x40: //command
        for(j=c&0x3F; j!=0; j--)
        {
          c = initdata[i++];
          lcd_wrcmd8(c);
        }
        break;

      case 0x80: //data
        for(j=c&0x3F; j!=0; j--)
        {
          c = initdata[i++];
          lcd_wrdata8(c);
        }
        break;

      case 0xC0: //delay
        delay_ms(c&0x3F);
        break;
    }
  }

  //clear display buffer
  lcd_drawstart();
  for(i=(LCD_WIDTH*LCD_HEIGHT); i!=0; i--)
  {
    lcd_draw(0);
  }
  lcd_drawstop();

  lcd_disable();

  return;
}
示例#7
0
void cmd_lcd_drawimage(uint_least16_t fgcolor, uint_least16_t bgcolor)
{
  uint_least8_t b, c, e, n;
  uint_least16_t a, x0, y0, x1, y1, w, h;
  uint_least32_t i, ms;

  x0 = if_read(); //x0
  y0 = if_read(); //y0
  w  = if_read(); //w
  h  = if_read(); //h
  x1 = x0+w-1;
  y1 = y0+h-1;
  c  = if_read8(); //color mode + encoding
  e  = c & COLOR_RLE;
  c  = c & ~COLOR_RLE;

  lcd_enable();
  lcd_setarea(x0, y0, x1, y1);
  lcd_drawstart();

  switch(c)
  {
    case COLOR_BW: //black/white
      fgcolor = RGB(0,0,0);
      bgcolor = RGB(255,255,255);
      break;
    case COLOR_WB: //white/black
      fgcolor = RGB(255,255,255);
      bgcolor = RGB(0,0,0);
      break;
    case COLOR_FG: //fg/bg
      fgcolor = fgcolor;
      bgcolor = bgcolor;
      break;
    case COLOR_BG: //bg/fg
      fgcolor ^= bgcolor;
      bgcolor ^= fgcolor;
      fgcolor ^= bgcolor;
      break;
  }

  ms = get_ms();
  if(e == 0) //no encoding
  {
    switch(c)
    {
      case COLOR_BW: //black/white
      case COLOR_WB: //white/black
      case COLOR_FG: //fg/bg
      case COLOR_BG: //bg/fg
        for(i=w*h; i!=0;)
        {
          if(if_available())
          {
            a = if_read8();
            for(b=0x80; (b!=0) && (i!=0); b>>=1)
            {
              if(a & b) { lcd_draw(fgcolor); }
              else      { lcd_draw(bgcolor); }
              i--;
            }
          }
          else if((get_ms()-ms) > 2000) //2s
          {
            break;
          }
        }
        break;
      case COLOR_RGB323:
      case COLOR_RGB332:
      case COLOR_RGB233:
      case COLOR_GRAY:
        for(i=w*h; i!=0;)
        {
          if(if_available())
          {
            a = if_read8();
                 if(c == COLOR_RGB323){ a = RGB323toRGB565(a); }
            else if(c == COLOR_RGB332){ a = RGB332toRGB565(a); }
            else if(c == COLOR_RGB233){ a = RGB233toRGB565(a); }
            else                      { a = GRAYtoRGB565(a);   }
            lcd_draw(a);
            i--;
          }
          else if((get_ms()-ms) > 2000) //2s
          {
            break;
          }
        }
        break;
      default:
      case COLOR_RGB565:
        for(i=w*h; i!=0;)
        {
          if(if_available())
          {
            a = if_read16();
            lcd_draw(a);
            i--;
          }
          else if((get_ms()-ms) > 2000) //2s
          {
            break;
          }
        }
        break;
      case COLOR_RGB888:
        for(i=w*h; i!=0;)
        {
          if(if_available())
          {
            a  = (if_read8()&0xF8)<<8; //R (5 bits)
            a |= (if_read8()&0xFC)<<3; //G (6 bits)
            a |= (if_read8()&0xF8)>>3; //B (5 bits)
            lcd_draw(a);
            i--;
          }
          else if((get_ms()-ms) > 2000) //2s
          {
            break;
          }
        }
        break;
    }
示例#8
0
文件: lcd.c 项目: horazont/hint
void lcd_init()
{
    const uint8_t MEM_BGR = 3;
    const uint8_t MEM_X = 6;
    const uint8_t MEM_Y = 7;

    uint8_t init_sequence[] = {
        VCMD_COMMAND | 1, LCD_CMD_RESET,
        VCMD_SLEEP   |20,
        VCMD_COMMAND | 1, LCD_CMD_DISPLAY_OFF,
        VCMD_SLEEP   |20,
        VCMD_COMMAND | 1, LCD_CMD_POWER_CTRLB,
        VCMD_DATA    | 3, 0x00, 0x83, 0x30, //0x83 0x81 0xAA
        VCMD_COMMAND | 1, LCD_CMD_POWERON_SEQ_CTRL,
        VCMD_DATA    | 4, 0x64, 0x03, 0x12, 0x81, //0x64 0x67
        VCMD_COMMAND | 1, LCD_CMD_DRV_TIMING_CTRLA,
        VCMD_DATA    | 3, 0x85, 0x01, 0x79, //0x79 0x78
        VCMD_COMMAND | 1, LCD_CMD_POWER_CTRLA,
        VCMD_DATA    | 5, 0x39, 0X2C, 0x00, 0x34, 0x02,
        VCMD_COMMAND | 1, LCD_CMD_PUMP_RATIO_CTRL,
        VCMD_DATA    | 1, 0x20,
        VCMD_COMMAND | 1, LCD_CMD_DRV_TIMING_CTRLB,
        VCMD_DATA    | 2, 0x00, 0x00,
        VCMD_COMMAND | 1, LCD_CMD_POWER_CTRL1,
        VCMD_DATA    | 1, 0x26, //0x26 0x25
        VCMD_COMMAND | 1, LCD_CMD_POWER_CTRL2,
        VCMD_DATA    | 1, 0x11,
        VCMD_COMMAND | 1, LCD_CMD_VCOM_CTRL1,
        VCMD_DATA    | 2, 0x35, 0x3E,
        VCMD_COMMAND | 1, LCD_CMD_VCOM_CTRL2,
        VCMD_DATA    | 1, 0xBE, //0xBE 0x94
        VCMD_COMMAND | 1, LCD_CMD_FRAME_CTRL,
        VCMD_DATA    | 2, 0x00, 0x1B, //0x1B 0x70
        VCMD_COMMAND | 1, LCD_CMD_ENABLE_3G,
        VCMD_DATA    | 1, 0x08, //0x08 0x00
        VCMD_COMMAND | 1, LCD_CMD_GAMMA,
        VCMD_DATA    | 1, 0x01, //G2.2
        VCMD_COMMAND | 1, LCD_CMD_POS_GAMMA,
        VCMD_DATA    |15, 0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00,
        VCMD_COMMAND | 1, LCD_CMD_NEG_GAMMA,
        VCMD_DATA    |15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F,
        VCMD_COMMAND | 1, LCD_CMD_DISPLAY_CTRL,
        VCMD_DATA    | 4, 0x0A, 0x82, 0x27, 0x00,
        VCMD_COMMAND | 1, LCD_CMD_ENTRY_MODE,
        VCMD_DATA    | 1, 0x07,
        VCMD_COMMAND | 1, LCD_CMD_PIXEL_FORMAT,
        VCMD_DATA    | 1, 0x55, //16bit
        VCMD_COMMAND | 1, LCD_CMD_MEMACCESS_CTRL,
        VCMD_DATA    | 1, (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y),
        VCMD_COMMAND | 1, LCD_CMD_COLUMN,
        VCMD_DATA    | 2, 0x00, 0x00,
        VCMD_DATA    | 2, ((LCD_HEIGHT-1)>>8)&0xFF, (LCD_HEIGHT-1)&0xFF,
        VCMD_COMMAND | 1, LCD_CMD_PAGE,
        VCMD_DATA    | 2, 0x00, 0x00,
        VCMD_DATA    | 2, ((LCD_WIDTH-1)>>8)&0xFF, (LCD_WIDTH-1)&0xFF,
        VCMD_COMMAND | 1, LCD_CMD_SLEEPOUT,
        VCMD_SLEEP   |60,
        VCMD_SLEEP   |60,
        VCMD_COMMAND | 1, LCD_CMD_DISPLAY_ON,
        VCMD_SLEEP   |20,
    };

    DISABLE_IRQ();

    // initialize pins
    IOCON_PIO2_0  &= ~IOCON_PIO2_0_FUNC_MASK;
    IOCON_PIO2_1  &= ~IOCON_PIO2_1_FUNC_MASK;
    IOCON_PIO2_2  &= ~IOCON_PIO2_2_FUNC_MASK;
    IOCON_PIO2_3  &= ~IOCON_PIO2_3_FUNC_MASK;
    IOCON_PIO2_4  &= ~IOCON_PIO2_4_FUNC_MASK;
    IOCON_PIO2_5  &= ~IOCON_PIO2_5_FUNC_MASK;
    IOCON_PIO2_6  &= ~IOCON_PIO2_6_FUNC_MASK;
    IOCON_PIO2_7  &= ~IOCON_PIO2_7_FUNC_MASK;
    IOCON_PIO2_8  &= ~IOCON_PIO2_8_FUNC_MASK;
    IOCON_PIO2_9  &= ~IOCON_PIO2_9_FUNC_MASK;
    IOCON_PIO2_10 &= ~IOCON_PIO2_10_FUNC_MASK;
    IOCON_PIO2_11 &= ~IOCON_PIO2_11_FUNC_MASK;

    IOCON_PIO3_5  &= ~IOCON_PIO3_5_FUNC_MASK;

    // set all 12 pins to output mode
    GPIO_GPIO2DIR |= 0xFFF;
    // set all pins high
    LCD_GPIO |= 0xFFF;

    // set pin 5 of gpio 3 to output mode
    GPIO_GPIO3DIR |= LCD_RD_MASK;
    GPIO_GPIO3DATA |= LCD_RD_MASK;

    ENABLE_IRQ();

    // trigger hard-reset
    LCD_MASKED_GPIO(LCD_RST_MASK, 0);
    delay_ms(20);
    LCD_MASKED_GPIO(LCD_RST_MASK, LCD_RST_MASK);
    delay_ms(120);

    lcd_enable();
    delay_ms(1);

    for (unsigned int i = 0; i < sizeof(init_sequence);) {
        uint8_t instruction = init_sequence[i++];
        switch (instruction & 0xC0) {
        case VCMD_COMMAND:
        {
            //~ printf("cmd 0x%02x", instruction & 0x3f);
            for (int j = (instruction & 0x3f); j > 0; j--) {
                uint8_t data = init_sequence[i++];
                //~ printf(" 0x%02x", data);
                lcd_wrcmd8(data);
            }
            //~ printf("\n");
            break;
        }
        case VCMD_DATA:
        {
            //~ printf("data 0x%02x\n", instruction & 0x3f);
            for (int j = (instruction & 0x3f); j > 0; j--) {
                uint8_t data = init_sequence[i++];
                //~ printf(" 0x%02x", data);
                lcd_wrdata8(data);
            }
            //~ printf("\n");
            break;
        }
        case VCMD_SLEEP:
        {
            //~ printf("sleep %d\n", instruction & 0x3f);
            delay_ms(instruction & 0x3f);
            break;
        }
        default:
            // cannot happen :)
            continue;
        };
    }

    lcd_drawstart();
    for (int i = (LCD_WIDTH*LCD_HEIGHT/8); i > 0; i--) {
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
    }
    lcd_drawstop();

    lcd_disable();
}