This is a test for my lcd display.
PINS DB7:0 connected to A7:0
Other pins connected as described in lcd.h
#include "lcd.h" | |
uint8_t fch, fcl, bch, bcl; | |
uint8_t orient; | |
//int disp_x_size, disp_y_size; | |
bool _transparent; | |
uint16_t disp_x_size = 239; | |
uint16_t disp_y_size = 319; | |
static void pin_mode_output(GPIO_TypeDef *GPIOx, uint32_t pin) | |
{ | |
GPIO_InitTypeDef GPIO_InitStruct; | |
HAL_GPIO_WritePin(GPIOx, pin, GPIO_PIN_RESET); | |
GPIO_InitStruct.Pin = pin; | |
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | |
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; | |
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); | |
} | |
static void lcd_data_output(void){ | |
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; | |
GPIOA->CRL = 0x33333333; | |
} | |
//static void lcd_data_input(void){ | |
// RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; | |
// GPIOA->CRL = 0x88888888; | |
//} | |
static void lcd_pulse_low(void){ | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_WR, GPIO_PIN_RESET); | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_WR, GPIO_PIN_SET); | |
} | |
static void lcd_bus_write(uint8_t vh, uint8_t vl){ | |
GPIOA->BSRR = vh; // set true values | |
GPIOA->BSRR = (~vh)<<16; | |
lcd_pulse_low(); | |
GPIOA->BSRR = vl; // set true values | |
GPIOA->BSRR = (~vl)<<16; | |
lcd_pulse_low(); | |
} | |
void lcd_write_cmd(uint8_t vl){ | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_RS, GPIO_PIN_RESET); | |
lcd_bus_write(0x00, vl); | |
} | |
void lcd_write_data(uint8_t vh, uint8_t vl){ | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_RS, GPIO_PIN_SET); | |
lcd_bus_write(vh, vl); | |
} | |
//void lcd_write_data(uint8_t vl){ | |
// HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_RS, GPIO_PIN_SET); | |
// lcd_bus_write(0x00, vl); | |
//} | |
void lcd_write_cmd_data(uint8_t cmd, uint16_t data){ | |
lcd_write_cmd(cmd); | |
lcd_write_data(data>>8, data&0xff ); | |
} | |
void lcd_set_color(uint8_t r, uint8_t g, uint8_t b) | |
{ | |
fch=((r&248)|g>>5); | |
fcl=((g&28)<<3|b>>3); | |
} | |
uint32_t lcd_get_color() | |
{ | |
return (fch<<8) | fcl; | |
} | |
void lcd_set_bg_color(uint8_t r, uint8_t g, uint8_t b) | |
{ | |
bch=((r&248)|g>>5); | |
bcl=((g&28)<<3|b>>3); | |
_transparent=false; | |
} | |
void lcd_set_xy(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2){ | |
// if (orient==LANDSCAPE) | |
// { | |
// swap(word, x1, y1); | |
// swap(word, x2, y2) | |
// y1=disp_y_size-y1; | |
// y2=disp_y_size-y2; | |
// swap(word, y1, y2) | |
// } | |
lcd_write_cmd_data(0x46,(x2 << 8) | x1); | |
lcd_write_cmd_data(0x47,y2); | |
lcd_write_cmd_data(0x48,y1); | |
lcd_write_cmd_data(0x20,x1); | |
lcd_write_cmd_data(0x21,y1); | |
lcd_write_cmd(0x22); | |
} | |
void lcd_clear_xy() | |
{ | |
// if (orient==PORTRAIT) | |
lcd_set_xy(0,0,disp_x_size,disp_y_size); | |
// else | |
// setXY(0,0,disp_y_size,disp_x_size); | |
} | |
uint32_t lcd_get_bg_color() | |
{ | |
return (bch<<8) | bcl; | |
} | |
void lcd_fast_fill_8(uint16_t ch, long pix) | |
{ | |
long blocks; | |
GPIOA->BSRR = ch; // set 1 values | |
GPIOA->BSRR = (~ch)<<16; // set 0 values | |
int i; | |
blocks = pix/16; | |
for (i=0; i<blocks; i++) | |
{ | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
lcd_pulse_low();lcd_pulse_low(); | |
} | |
if ((pix % 16) != 0) | |
for (int i=0; i<(pix % 16)+1; i++) | |
{ | |
lcd_pulse_low();lcd_pulse_low(); | |
} | |
} | |
void lcd_clear_screen() | |
{ | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_CS, GPIO_PIN_RESET); | |
lcd_clear_xy(); | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_RS, GPIO_PIN_SET); | |
lcd_fast_fill_8(0,((disp_x_size+1)*(disp_y_size+1))); | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_CS, GPIO_PIN_SET); | |
} | |
void lcd_fill_rect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2){ | |
if (x1>x2) | |
{ | |
swap(uint16_t, x1, x2); | |
} | |
if (y1>y2) | |
{ | |
swap(uint16_t, y1, y2); | |
} | |
if (fch==fcl) | |
{ | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_CS, GPIO_PIN_RESET); | |
lcd_set_xy(x1, y1, x2, y2); | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_RS, GPIO_PIN_SET); | |
lcd_fast_fill_8(fch, ((x2-x1)+1)*((y2-y1)+1) ); | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_CS, GPIO_PIN_SET); | |
} | |
// else | |
// { | |
// | |
// for (int i=0; i<((y2-y1)/2)+1; i++) | |
// { | |
// drawHLine(x1, y1+i, x2-x1); | |
// drawHLine(x1, y2-i, x2-x1); | |
// } | |
// | |
// | |
// } | |
} | |
void lcd_init(){ | |
pin_mode_output(LCD_CTRL_PORT, LCD_CS | LCD_RS | LCD_WR | LCD_RST); | |
lcd_data_output(); | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_RST, GPIO_PIN_SET); | |
HAL_Delay(5); | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_RST, GPIO_PIN_RESET); | |
HAL_Delay(15); | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_RST, GPIO_PIN_SET); | |
HAL_Delay(15); | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_CS, GPIO_PIN_RESET); | |
lcd_write_cmd_data(0x11,0x2004); | |
lcd_write_cmd_data(0x13,0xCC00); | |
lcd_write_cmd_data(0x15,0x2600); | |
lcd_write_cmd_data(0x14,0x252A); | |
lcd_write_cmd_data(0x12,0x0033); | |
lcd_write_cmd_data(0x13,0xCC04); | |
lcd_write_cmd_data(0x13,0xCC06); | |
lcd_write_cmd_data(0x13,0xCC4F); | |
lcd_write_cmd_data(0x13,0x674F); | |
lcd_write_cmd_data(0x11,0x2003); | |
lcd_write_cmd_data(0x30,0x2609); | |
lcd_write_cmd_data(0x31,0x242C); | |
lcd_write_cmd_data(0x32,0x1F23); | |
lcd_write_cmd_data(0x33,0x2425); | |
lcd_write_cmd_data(0x34,0x2226); | |
lcd_write_cmd_data(0x35,0x2523); | |
lcd_write_cmd_data(0x36,0x1C1A); | |
lcd_write_cmd_data(0x37,0x131D); | |
lcd_write_cmd_data(0x38,0x0B11); | |
lcd_write_cmd_data(0x39,0x1210); | |
lcd_write_cmd_data(0x3A,0x1315); | |
lcd_write_cmd_data(0x3B,0x3619); | |
lcd_write_cmd_data(0x3C,0x0D00); | |
lcd_write_cmd_data(0x3D,0x000D); | |
lcd_write_cmd_data(0x16,0x0007); | |
lcd_write_cmd_data(0x02,0x0013); | |
lcd_write_cmd_data(0x03,0x0003); | |
lcd_write_cmd_data(0x01,0x0127); | |
lcd_write_cmd_data(0x08,0x0303); | |
lcd_write_cmd_data(0x0A,0x000B); | |
lcd_write_cmd_data(0x0B,0x0003); | |
lcd_write_cmd_data(0x0C,0x0000); | |
lcd_write_cmd_data(0x41,0x0000); | |
lcd_write_cmd_data(0x50,0x0000); | |
lcd_write_cmd_data(0x60,0x0005); | |
lcd_write_cmd_data(0x70,0x000B); | |
lcd_write_cmd_data(0x71,0x0000); | |
lcd_write_cmd_data(0x78,0x0000); | |
lcd_write_cmd_data(0x7A,0x0000); | |
lcd_write_cmd_data(0x79,0x0007); | |
lcd_write_cmd_data(0x07,0x0051); | |
lcd_write_cmd_data(0x07,0x0053); | |
lcd_write_cmd_data(0x79,0x0000); | |
lcd_write_cmd(0x22); | |
HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_CS, GPIO_PIN_SET); | |
lcd_set_color(255,255,255); | |
lcd_set_bg_color(255,255,255); | |
lcd_clear_screen(); | |
lcd_fill_rect(disp_x_size/2-25,disp_y_size/2-25,disp_x_size/2+25, disp_y_size/2+25); | |
} |
#ifndef LCD_H_ | |
#define LCD_H_ | |
/* | |
* DB0:DB7 will be A0:A7 | |
* | |
* */ | |
#include "stdbool.h" | |
#include "stm32f1xx_hal.h" | |
#define swap(type, i, j) {type t = i; i = j; j = t;} | |
#define LCD_CTRL_PORT GPIOB | |
#define LCD_DATA_PORT GPIOA | |
#define LCD_CS GPIO_PIN_0 | |
#define LCD_RS GPIO_PIN_1 | |
#define LCD_WR GPIO_PIN_10 | |
//#define LCD_RD GPIO_PIN_11 | |
#define LCD_RST GPIO_PIN_11 | |
void lcd_init(void); | |
#endif /* LCD_H_ */ |