diff --git a/lib/card10/display.c b/lib/card10/display.c index 1e334202880580c194a843f8dc81ca4374ca4a35..e1d66276646f480cde27c063f162d7bd85dd6138 100644 --- a/lib/card10/display.c +++ b/lib/card10/display.c @@ -9,38 +9,37 @@ #include <stdint.h> #include <stdio.h> /***** Globals *****/ -const gpio_cfg_t DEV_DC_PIN = {PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE}; +const gpio_cfg_t DEV_DC_PIN = { PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE }; // Parameters for PWM output -#define PORT_PWM PORT_0 // port -#define PIN_PWM PIN_28 // pin -#define FREQ 200 // (Hz) -//#define DUTY_CYCLE 75 // (%) -#define DUTY_CYCLE 20 // (%) -#define PWM_TIMER MXC_TMR4 // must change PORT_PWM and PIN_PWM if changed - +#define PORT_PWM PORT_0 // port +#define PIN_PWM PIN_28 // pin +#define FREQ 200 // (Hz) +//#define DUTY_CYCLE 75 // (%) +#define DUTY_CYCLE 20 // (%) +#define PWM_TIMER MXC_TMR4 // must change PORT_PWM and PIN_PWM if changed /***** Functions *****/ void PWM_Output(void) { - // Declare variables - gpio_cfg_t gpio_pwm; // to configure GPIO - tmr_cfg_t tmr; // to congigure timer - tmr_pwm_cfg_t tmr_pwm; // for configure PWM - unsigned int period_ticks = PeripheralClock / FREQ; - unsigned int duty_ticks = period_ticks * DUTY_CYCLE / 100; - - // Congfigure GPIO port and pin for PWM - gpio_pwm.func = GPIO_FUNC_ALT4; - gpio_pwm.port = PORT_PWM; - gpio_pwm.mask = PIN_PWM; - gpio_pwm.pad = GPIO_PAD_PULL_DOWN; - - if (GPIO_Config(&gpio_pwm) != E_NO_ERROR) { - printf("Failed GPIO_Config for pwm.\n"); - } - - /* + // Declare variables + gpio_cfg_t gpio_pwm; // to configure GPIO + tmr_cfg_t tmr; // to congigure timer + tmr_pwm_cfg_t tmr_pwm; // for configure PWM + unsigned int period_ticks = PeripheralClock / FREQ; + unsigned int duty_ticks = period_ticks * DUTY_CYCLE / 100; + + // Congfigure GPIO port and pin for PWM + gpio_pwm.func = GPIO_FUNC_ALT4; + gpio_pwm.port = PORT_PWM; + gpio_pwm.mask = PIN_PWM; + gpio_pwm.pad = GPIO_PAD_PULL_DOWN; + + if (GPIO_Config(&gpio_pwm) != E_NO_ERROR) { + printf("Failed GPIO_Config for pwm.\n"); + } + + /* Steps for configuring a timer for PWM mode: 1. Disable the timer 2. Set the prescale value @@ -49,55 +48,55 @@ void PWM_Output(void) 5. Enable Timer */ - TMR_Disable(PWM_TIMER); + TMR_Disable(PWM_TIMER); - TMR_Init(PWM_TIMER, TMR_PRES_1, 0); + TMR_Init(PWM_TIMER, TMR_PRES_1, 0); - tmr.mode = TMR_MODE_PWM; - tmr.cmp_cnt = period_ticks; - tmr.pol = 0; - TMR_Config(PWM_TIMER, &tmr); + tmr.mode = TMR_MODE_PWM; + tmr.cmp_cnt = period_ticks; + tmr.pol = 0; + TMR_Config(PWM_TIMER, &tmr); - tmr_pwm.pol = 1; - tmr_pwm.per_cnt = period_ticks; - tmr_pwm.duty_cnt = duty_ticks; + tmr_pwm.pol = 1; + tmr_pwm.per_cnt = period_ticks; + tmr_pwm.duty_cnt = duty_ticks; - if (TMR_PWMConfig(PWM_TIMER, &tmr_pwm) != E_NO_ERROR) { - printf("Failed TMR_PWMConfig.\n"); - } + if (TMR_PWMConfig(PWM_TIMER, &tmr_pwm) != E_NO_ERROR) { + printf("Failed TMR_PWMConfig.\n"); + } - TMR_Enable(PWM_TIMER); + TMR_Enable(PWM_TIMER); - printf("PWM started.\n"); + printf("PWM started.\n"); } void display_set_reset_pin(uint8_t state) { - if(!portexpander_detected()) { - MAX77650_setDO(state ? true:false); - } else { - portexpander_set(4, state); - } + if (!portexpander_detected()) { + MAX77650_setDO(state ? true : false); + } else { + portexpander_set(4, state); + } } void display_init(void) { - if(!portexpander_detected()) { - // Open-drain - MAX77650_setDRV(false); - // Output - MAX77650_setDIR(false); - } + if (!portexpander_detected()) { + // Open-drain + MAX77650_setDRV(false); + // Output + MAX77650_setDIR(false); + } - GPIO_Config(&DEV_DC_PIN); + GPIO_Config(&DEV_DC_PIN); - PWM_Output(); - LCD_SetBacklight(500); - LCD_Init(); - LCD_Clear(BLACK); + PWM_Output(); + LCD_SetBacklight(500); + LCD_Init(); + LCD_Clear(BLACK); - Paint_NewImage(LCD_WIDTH, LCD_HEIGHT,0,WHITE); + Paint_NewImage(LCD_WIDTH, LCD_HEIGHT, 0, WHITE); - Paint_Clear(BLACK); - Paint_SetRotate(180); + Paint_Clear(BLACK); + Paint_SetRotate(180); } diff --git a/lib/card10/portexpander.c b/lib/card10/portexpander.c index 67192cc06d767f62cdd5942ca05a75d6350422f4..e372e71fe3c389c617c3934f355bfc58d548bb10 100644 --- a/lib/card10/portexpander.c +++ b/lib/card10/portexpander.c @@ -12,72 +12,76 @@ static uint8_t output_state; void portexpander_init(void) { - uint8_t addr = 0x21; - int ret; - - // Enable pull-ups for buttons - uint8_t command[] = {0x43, 0x68}; - ret = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); - - if(ret != 2) { - printf("portexpander NOT detected\n"); - detected = false; - return; - } - detected = true; - - // Set _all_ outputs to open-drain to support the high side p-channel transistors. - command[0] = 0x4F; command[1] = 0x01; - I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); - - // Enable outputs for the transistors, the LED and the LCD reset - command[0] = 0x03; command[1] = 0x68; - I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); - - // Set outputs to high (i.e. open-drain) - output_state = 0x97; - command[0] = 0x01; command[1] = output_state; - I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); - - // Turn on LEDs - // TODO: only turn on LEDs if value != 0,0,0 && dim > 0 - command[0] = 0x01; command[1] = 0x90; - I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); - + uint8_t addr = 0x21; + int ret; + + // Enable pull-ups for buttons + uint8_t command[] = { 0x43, 0x68 }; + ret = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); + + if (ret != 2) { + printf("portexpander NOT detected\n"); + detected = false; + return; + } + detected = true; + + // Set _all_ outputs to open-drain to support the high side p-channel transistors. + command[0] = 0x4F; + command[1] = 0x01; + I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); + + // Enable outputs for the transistors, the LED and the LCD reset + command[0] = 0x03; + command[1] = 0x68; + I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); + + // Set outputs to high (i.e. open-drain) + output_state = 0x97; + command[0] = 0x01; + command[1] = output_state; + I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); + + // Turn on LEDs + // TODO: only turn on LEDs if value != 0,0,0 && dim > 0 + command[0] = 0x01; + command[1] = 0x90; + I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); } uint8_t portexpander_get(void) { - uint8_t addr = 0x21; - uint8_t command[] = {0x00}; - uint8_t buf = 0xFF; + uint8_t addr = 0x21; + uint8_t command[] = { 0x00 }; + uint8_t buf = 0xFF; - if(detected) { - I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 1, 1); - I2C_MasterRead(MXC_I2C1_BUS0, addr << 1, &buf, 1, 0); - } + if (detected) { + I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 1, 1); + I2C_MasterRead(MXC_I2C1_BUS0, addr << 1, &buf, 1, 0); + } - return buf; + return buf; } bool portexpander_detected(void) { - return detected; + return detected; } void portexpander_set(uint8_t pin, uint8_t value) { - uint8_t addr = 0x21; - uint8_t command[2]; - - if(detected && pin < 8) { - if(value) { - output_state |= (1 << pin); - } else { - output_state &= ~(1 << pin); - } - - command[0] = 0x01; command[1] = output_state; - I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); - } + uint8_t addr = 0x21; + uint8_t command[2]; + + if (detected && pin < 8) { + if (value) { + output_state |= (1 << pin); + } else { + output_state &= ~(1 << pin); + } + + command[0] = 0x01; + command[1] = output_state; + I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); + } } diff --git a/lib/gfx/LCD/LCD_Driver.c b/lib/gfx/LCD/LCD_Driver.c index 7005fda5244f2fa109bba77e40c8cc30948fd095..7cc1d15f1282df8506290471e87720b73bc246b0 100644 --- a/lib/gfx/LCD/LCD_Driver.c +++ b/lib/gfx/LCD/LCD_Driver.c @@ -1,315 +1,316 @@ -/***************************************************************************** -* | File : LCD_Driver.c -* | Author : Waveshare team -* | Function : Electronic paper driver -* | Info : -*---------------- -* | This version: V1.0 -* | Date : 2018-11-18 -* | Info : -# -# Permission is hereby granted, free of UBYTEge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -******************************************************************************/ -#include "LCD_Driver.h" -static uint8_t screen[LCD_HEIGHT][LCD_WIDTH][2]; - -/******************************************************************************* -function: - Hardware reset -*******************************************************************************/ -static void LCD_Reset(void) -{ - //DEV_Digital_Write(DEV_CS_PIN,0); - DEV_Delay_ms(20); - DEV_RESET_LOW(); - DEV_Delay_ms(20); - DEV_RESET_HIGH(); - DEV_Delay_ms(20); -} - -/******************************************************************************* -function: - Setting backlight -parameter : - value : Range 0~1000 Duty cycle is value/1000 -*******************************************************************************/ -void LCD_SetBacklight(UWORD Value) -{ - DEV_Set_BL(Value); -} - -/******************************************************************************* -function: - Write register address and data -*******************************************************************************/ -void LCD_WriteData_Byte(UBYTE da) -{ - //DEV_Digital_Write(DEV_CS_PIN,0); - DEV_Digital_Write(DEV_DC_PIN,1); - DEV_SPI_WRITE(da); - //DEV_Digital_Write(DEV_CS_PIN,1); -} - - void LCD_WriteData_Word(UWORD da) -{ - UBYTE i=(da>>8)&0xff; - //DEV_Digital_Write(DEV_CS_PIN,0); - DEV_Digital_Write(DEV_DC_PIN,1); - DEV_SPI_WRITE(i); - uint8_t tmp = da; - DEV_SPI_WRITE(tmp); - //DEV_Digital_Write(DEV_CS_PIN,1); -} - -void LCD_WriteReg(UBYTE da) -{ - //DEV_Digital_Write(DEV_CS_PIN,0); - DEV_Digital_Write(DEV_DC_PIN,0); - DEV_SPI_WRITE(da); - //DEV_Digital_Write(DEV_CS_PIN,1); -} - -/****************************************************************************** -function: - Common register initialization -******************************************************************************/ -void LCD_Init(void) -{ - LCD_Reset(); - - //************* Start Initial Sequence **********// - LCD_WriteReg(0x11);//Sleep exit - DEV_Delay_ms (120); - LCD_WriteReg(0x21); - LCD_WriteReg(0x21); - - LCD_WriteReg(0xB1); - LCD_WriteData_Byte(0x05); - LCD_WriteData_Byte(0x3A); - LCD_WriteData_Byte(0x3A); - - LCD_WriteReg(0xB2); - LCD_WriteData_Byte(0x05); - LCD_WriteData_Byte(0x3A); - LCD_WriteData_Byte(0x3A); - - LCD_WriteReg(0xB3); - LCD_WriteData_Byte(0x05); - LCD_WriteData_Byte(0x3A); - LCD_WriteData_Byte(0x3A); - LCD_WriteData_Byte(0x05); - LCD_WriteData_Byte(0x3A); - LCD_WriteData_Byte(0x3A); - - LCD_WriteReg(0xB4); - LCD_WriteData_Byte(0x03); - - LCD_WriteReg(0xC0); - LCD_WriteData_Byte(0x62); - LCD_WriteData_Byte(0x02); - LCD_WriteData_Byte(0x04); - - LCD_WriteReg(0xC1); - LCD_WriteData_Byte(0xC0); - - LCD_WriteReg(0xC2); - LCD_WriteData_Byte(0x0D); - LCD_WriteData_Byte(0x00); - - LCD_WriteReg(0xC3); - LCD_WriteData_Byte(0x8D); - LCD_WriteData_Byte(0x6A); - - LCD_WriteReg(0xC4); - LCD_WriteData_Byte(0x8D); - LCD_WriteData_Byte(0xEE); - - LCD_WriteReg(0xC5); /*VCOM*/ - LCD_WriteData_Byte(0x0E); - - LCD_WriteReg(0xE0); - LCD_WriteData_Byte(0x10); - LCD_WriteData_Byte(0x0E); - LCD_WriteData_Byte(0x02); - LCD_WriteData_Byte(0x03); - LCD_WriteData_Byte(0x0E); - LCD_WriteData_Byte(0x07); - LCD_WriteData_Byte(0x02); - LCD_WriteData_Byte(0x07); - LCD_WriteData_Byte(0x0A); - LCD_WriteData_Byte(0x12); - LCD_WriteData_Byte(0x27); - LCD_WriteData_Byte(0x37); - LCD_WriteData_Byte(0x00); - LCD_WriteData_Byte(0x0D); - LCD_WriteData_Byte(0x0E); - LCD_WriteData_Byte(0x10); - - LCD_WriteReg(0xE1); - LCD_WriteData_Byte(0x10); - LCD_WriteData_Byte(0x0E); - LCD_WriteData_Byte(0x03); - LCD_WriteData_Byte(0x03); - LCD_WriteData_Byte(0x0F); - LCD_WriteData_Byte(0x06); - LCD_WriteData_Byte(0x02); - LCD_WriteData_Byte(0x08); - LCD_WriteData_Byte(0x0A); - LCD_WriteData_Byte(0x13); - LCD_WriteData_Byte(0x26); - LCD_WriteData_Byte(0x36); - LCD_WriteData_Byte(0x00); - LCD_WriteData_Byte(0x0D); - LCD_WriteData_Byte(0x0E); - LCD_WriteData_Byte(0x10); - - LCD_WriteReg(0x3A); - LCD_WriteData_Byte(0x05); - - LCD_WriteReg(0x36); - LCD_WriteData_Byte(0xA8);// - - LCD_WriteReg(0x29); -} - -/****************************************************************************** -function: Set the cursor position -parameter : - Xstart: Start UWORD x coordinate - Ystart: Start UWORD y coordinate - Xend : End UWORD coordinates - Yend : End UWORD coordinatesen -******************************************************************************/ -void LCD_SetCursor(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend) -{ - Xstart = Xstart + 1; - Xend = Xend + 1; - Ystart = Ystart + 26; - Yend = Yend+26; - LCD_WriteReg(0x2a); - LCD_WriteData_Byte(Xstart>>8); - LCD_WriteData_Byte(Xstart); - LCD_WriteData_Byte(Xend >>8); - LCD_WriteData_Byte(Xend ); - - LCD_WriteReg(0x2b); - LCD_WriteData_Byte(Ystart>>8); - LCD_WriteData_Byte(Ystart); - LCD_WriteData_Byte(Yend>>8); - LCD_WriteData_Byte(Yend); - - LCD_WriteReg(0x2C); -} -#if 0 -/****************************************************************************** -function: Clear screen function, refresh the screen to a certain color -parameter : - Color : The color you want to clear all the screen -******************************************************************************/ -void LCD_Clear(UWORD Color) -{ - UWORD i,j; - LCD_SetCursor(0,0,LCD_WIDTH-1,LCD_HEIGHT-1); - for(i = 0; i < LCD_WIDTH; i++){ - for(j = 0; j < LCD_HEIGHT; j++){ - LCD_WriteData_Word(Color); - } - } -} -#endif - -/****************************************************************************** -function: Refresh a certain area to the same color -parameter : - Xstart: Start UWORD x coordinate - Ystart: Start UWORD y coordinate - Xend : End UWORD coordinates - Yend : End UWORD coordinates - color : Set the color -******************************************************************************/ -void LCD_ClearWindow(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend,UWORD color) -{ - UWORD i,j; - LCD_SetCursor(Xstart, Ystart, Xend-1,Yend-1); - for(i = Ystart; i <= Yend-1; i++){ - for(j = Xstart; j <= Xend-1; j++){ - LCD_WriteData_Word(color); - } - } -} - -/****************************************************************************** -function: Set the color of an area -parameter : - Xstart: Start UWORD x coordinate - Ystart: Start UWORD y coordinate - Xend : End UWORD coordinates - Yend : End UWORD coordinates - Color : Set the color -******************************************************************************/ -void LCD_SetWindowColor(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend,UWORD Color) -{ - LCD_SetCursor( Xstart,Ystart,Xend,Yend); - LCD_WriteData_Word(Color); -} - -/****************************************************************************** -function: Draw a UWORD -parameter : - X : Set the X coordinate - Y : Set the Y coordinate - Color : Set the color -******************************************************************************/ -#if 0 -void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color) -{ - LCD_SetCursor(x,y,x,y); - LCD_WriteData_Word(Color); -} -#endif - -void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color) -{ - screen[y][x][0] = (Color >> 8); - screen[y][x][1] = (Color & 0xFF); -} - -void LCD_Clear(UWORD Color) -{ - UWORD i,j; - for(i = 0; i < LCD_WIDTH; i++){ - for(j = 0; j < LCD_HEIGHT; j++){ - LCD_SetUWORD(i, j, Color); - } - } -} - -void LCD_Set(uint8_t *data, int len) -{ - LCD_SetCursor(0,0,160-1,80-1); - DEV_Digital_Write(DEV_DC_PIN,1); - lcd_write(data, len); -} - -void LCD_Update(void) -{ - LCD_Set((uint8_t*)screen, sizeof(screen)); -} - +/***************************************************************************** +* | File : LCD_Driver.c +* | Author : Waveshare team +* | Function : Electronic paper driver +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2018-11-18 +* | Info : +# +# Permission is hereby granted, free of UBYTEge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "LCD_Driver.h" +static uint8_t screen[LCD_HEIGHT][LCD_WIDTH][2]; + +/******************************************************************************* +function: + Hardware reset +*******************************************************************************/ +static void LCD_Reset(void) +{ + //DEV_Digital_Write(DEV_CS_PIN,0); + DEV_Delay_ms(20); + DEV_RESET_LOW(); + DEV_Delay_ms(20); + DEV_RESET_HIGH(); + DEV_Delay_ms(20); +} + +/******************************************************************************* +function: + Setting backlight +parameter : + value : Range 0~1000 Duty cycle is value/1000 +*******************************************************************************/ +void LCD_SetBacklight(UWORD Value) +{ + DEV_Set_BL(Value); +} + +/******************************************************************************* +function: + Write register address and data +*******************************************************************************/ +void LCD_WriteData_Byte(UBYTE da) +{ + //DEV_Digital_Write(DEV_CS_PIN,0); + DEV_Digital_Write(DEV_DC_PIN, 1); + DEV_SPI_WRITE(da); + //DEV_Digital_Write(DEV_CS_PIN,1); +} + +void LCD_WriteData_Word(UWORD da) +{ + UBYTE i = (da >> 8) & 0xff; + //DEV_Digital_Write(DEV_CS_PIN,0); + DEV_Digital_Write(DEV_DC_PIN, 1); + DEV_SPI_WRITE(i); + uint8_t tmp = da; + DEV_SPI_WRITE(tmp); + //DEV_Digital_Write(DEV_CS_PIN,1); +} + +void LCD_WriteReg(UBYTE da) +{ + //DEV_Digital_Write(DEV_CS_PIN,0); + DEV_Digital_Write(DEV_DC_PIN, 0); + DEV_SPI_WRITE(da); + //DEV_Digital_Write(DEV_CS_PIN,1); +} + +/****************************************************************************** +function: + Common register initialization +******************************************************************************/ +void LCD_Init(void) +{ + LCD_Reset(); + + //************* Start Initial Sequence **********// + LCD_WriteReg(0x11); //Sleep exit + DEV_Delay_ms(120); + LCD_WriteReg(0x21); + LCD_WriteReg(0x21); + + LCD_WriteReg(0xB1); + LCD_WriteData_Byte(0x05); + LCD_WriteData_Byte(0x3A); + LCD_WriteData_Byte(0x3A); + + LCD_WriteReg(0xB2); + LCD_WriteData_Byte(0x05); + LCD_WriteData_Byte(0x3A); + LCD_WriteData_Byte(0x3A); + + LCD_WriteReg(0xB3); + LCD_WriteData_Byte(0x05); + LCD_WriteData_Byte(0x3A); + LCD_WriteData_Byte(0x3A); + LCD_WriteData_Byte(0x05); + LCD_WriteData_Byte(0x3A); + LCD_WriteData_Byte(0x3A); + + LCD_WriteReg(0xB4); + LCD_WriteData_Byte(0x03); + + LCD_WriteReg(0xC0); + LCD_WriteData_Byte(0x62); + LCD_WriteData_Byte(0x02); + LCD_WriteData_Byte(0x04); + + LCD_WriteReg(0xC1); + LCD_WriteData_Byte(0xC0); + + LCD_WriteReg(0xC2); + LCD_WriteData_Byte(0x0D); + LCD_WriteData_Byte(0x00); + + LCD_WriteReg(0xC3); + LCD_WriteData_Byte(0x8D); + LCD_WriteData_Byte(0x6A); + + LCD_WriteReg(0xC4); + LCD_WriteData_Byte(0x8D); + LCD_WriteData_Byte(0xEE); + + LCD_WriteReg(0xC5); /*VCOM*/ + LCD_WriteData_Byte(0x0E); + + LCD_WriteReg(0xE0); + LCD_WriteData_Byte(0x10); + LCD_WriteData_Byte(0x0E); + LCD_WriteData_Byte(0x02); + LCD_WriteData_Byte(0x03); + LCD_WriteData_Byte(0x0E); + LCD_WriteData_Byte(0x07); + LCD_WriteData_Byte(0x02); + LCD_WriteData_Byte(0x07); + LCD_WriteData_Byte(0x0A); + LCD_WriteData_Byte(0x12); + LCD_WriteData_Byte(0x27); + LCD_WriteData_Byte(0x37); + LCD_WriteData_Byte(0x00); + LCD_WriteData_Byte(0x0D); + LCD_WriteData_Byte(0x0E); + LCD_WriteData_Byte(0x10); + + LCD_WriteReg(0xE1); + LCD_WriteData_Byte(0x10); + LCD_WriteData_Byte(0x0E); + LCD_WriteData_Byte(0x03); + LCD_WriteData_Byte(0x03); + LCD_WriteData_Byte(0x0F); + LCD_WriteData_Byte(0x06); + LCD_WriteData_Byte(0x02); + LCD_WriteData_Byte(0x08); + LCD_WriteData_Byte(0x0A); + LCD_WriteData_Byte(0x13); + LCD_WriteData_Byte(0x26); + LCD_WriteData_Byte(0x36); + LCD_WriteData_Byte(0x00); + LCD_WriteData_Byte(0x0D); + LCD_WriteData_Byte(0x0E); + LCD_WriteData_Byte(0x10); + + LCD_WriteReg(0x3A); + LCD_WriteData_Byte(0x05); + + LCD_WriteReg(0x36); + LCD_WriteData_Byte(0xA8); // + + LCD_WriteReg(0x29); +} + +/****************************************************************************** +function: Set the cursor position +parameter : + Xstart: Start UWORD x coordinate + Ystart: Start UWORD y coordinate + Xend : End UWORD coordinates + Yend : End UWORD coordinatesen +******************************************************************************/ +void LCD_SetCursor(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend) +{ + Xstart = Xstart + 1; + Xend = Xend + 1; + Ystart = Ystart + 26; + Yend = Yend + 26; + LCD_WriteReg(0x2a); + LCD_WriteData_Byte(Xstart >> 8); + LCD_WriteData_Byte(Xstart); + LCD_WriteData_Byte(Xend >> 8); + LCD_WriteData_Byte(Xend); + + LCD_WriteReg(0x2b); + LCD_WriteData_Byte(Ystart >> 8); + LCD_WriteData_Byte(Ystart); + LCD_WriteData_Byte(Yend >> 8); + LCD_WriteData_Byte(Yend); + + LCD_WriteReg(0x2C); +} +#if 0 +/****************************************************************************** +function: Clear screen function, refresh the screen to a certain color +parameter : + Color : The color you want to clear all the screen +******************************************************************************/ +void LCD_Clear(UWORD Color) +{ + UWORD i,j; + LCD_SetCursor(0,0,LCD_WIDTH-1,LCD_HEIGHT-1); + for(i = 0; i < LCD_WIDTH; i++){ + for(j = 0; j < LCD_HEIGHT; j++){ + LCD_WriteData_Word(Color); + } + } +} +#endif + +/****************************************************************************** +function: Refresh a certain area to the same color +parameter : + Xstart: Start UWORD x coordinate + Ystart: Start UWORD y coordinate + Xend : End UWORD coordinates + Yend : End UWORD coordinates + color : Set the color +******************************************************************************/ +void LCD_ClearWindow( + UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD color +) { + UWORD i, j; + LCD_SetCursor(Xstart, Ystart, Xend - 1, Yend - 1); + for (i = Ystart; i <= Yend - 1; i++) { + for (j = Xstart; j <= Xend - 1; j++) { + LCD_WriteData_Word(color); + } + } +} + +/****************************************************************************** +function: Set the color of an area +parameter : + Xstart: Start UWORD x coordinate + Ystart: Start UWORD y coordinate + Xend : End UWORD coordinates + Yend : End UWORD coordinates + Color : Set the color +******************************************************************************/ +void LCD_SetWindowColor( + UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color +) { + LCD_SetCursor(Xstart, Ystart, Xend, Yend); + LCD_WriteData_Word(Color); +} + +/****************************************************************************** +function: Draw a UWORD +parameter : + X : Set the X coordinate + Y : Set the Y coordinate + Color : Set the color +******************************************************************************/ +#if 0 +void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color) +{ + LCD_SetCursor(x,y,x,y); + LCD_WriteData_Word(Color); +} +#endif + +void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color) +{ + screen[y][x][0] = (Color >> 8); + screen[y][x][1] = (Color & 0xFF); +} + +void LCD_Clear(UWORD Color) +{ + UWORD i, j; + for (i = 0; i < LCD_WIDTH; i++) { + for (j = 0; j < LCD_HEIGHT; j++) { + LCD_SetUWORD(i, j, Color); + } + } +} + +void LCD_Set(uint8_t *data, int len) +{ + LCD_SetCursor(0, 0, 160 - 1, 80 - 1); + DEV_Digital_Write(DEV_DC_PIN, 1); + lcd_write(data, len); +} + +void LCD_Update(void) +{ + LCD_Set((uint8_t *)screen, sizeof(screen)); +}