说明
在HC32F460平台上以验证,通过模拟SPI的方式,驱动三线制双通道GC9306 LCD屏幕。(GC9306屏幕有多种规格有并口,3线制SPI,4线制SPI等多种规格)使用前一定要确认好自己屏幕的模式。若本文对你有有用,欢迎点赞收藏。
1. 三线制双通道 GC9306屏幕硬件介绍
引脚 |
功能 |
说明 |
1 |
gnd |
电源地 |
2 |
Led_A+ |
背光+极 |
3 |
VCC(2V8) |
电源+ |
4 |
/Cs |
片选信号 |
5 |
RSTB |
复位信号 |
6 |
LSCK |
SCK SPI时钟信号 |
7 |
LSDA |
LSDA SPI数据通道1 |
8 |
LSA0 |
A0 SPI数据通道2 |
9 |
LPTE |
帧同步 |
10 |
LOVCC |
- |
11 |
Led_k |
背光 -极 |
12 |
gnd |
电源地 |
13 |
YD/NC |
NC |
14 |
XL/NC |
NC |
15 |
YU/NC |
NC |
16 |
XR/NC |
NC |
2.与HC32F460芯片引脚连接
屏幕 |
|
单片机 |
/cs |
-> |
PB10 |
LSCK |
-> |
PB13 |
LSDA |
-> |
PB14 |
RSTB |
-> |
PB12 |
A0 |
-> |
PB15 |
gc9306.h
#ifndef GC9306_H
#define GC9306_H
#define LCDCS(X) (X? (M4_PORT->POSRB_f.POS10 = 1) : (M4_PORT->PORRB_f.POR10 = 1))
#define LCDSDA(X) (X? (M4_PORT->POSRB_f.POS14 = 1) : (M4_PORT->PORRB_f.POR14 = 1))
#define RLCDSDA() M4_PORT->PIDRB_f.PIN14
#define LCDSCL(X) (X? (M4_PORT->POSRB_f.POS13 = 1) : (M4_PORT->PORRB_f.POR13 = 1))
#define LCDRESET(X) (X? (M4_PORT->POSRB_f.POS12 = 1) : (M4_PORT->PORRB_f.POR12 = 1))
#define RS(X) (X? (M4_PORT->POSRB_f.POS15 = 1) : (M4_PORT->PORRB_f.POR15 = 1))
#define LCD_Width 240
#define LCD_Height 320
void write_comm(INT16U command);
void write_data(INT16U datum);
void serial(INT8U send_data,INT8U comm_data);
void IC_code_init(void);
void read_ID(INT16U comm,INT8U count);
INT8U serial_read();
void writePixel(INT8U x_start, INT8U y_start, INT16U color);
void set_windows_x(INT16U x_strat_add,INT16U x_end_add);
void set_windows_y(INT16U y_strat_add,INT16U y_end_add);
void addres_set(INT16U strat_x,INT16U strat_y,INT16U end_x,INT16U end_y);
void grayotp();
gc9306.C
#include "gc9306.h"
INT8U SRGB = 0x08;
INT16U driver_clar = 0;
INT8U scan = 0x80;
INT8U r_datum = 0;
INT8U r_data[128] = {
0};
INT8U move_y=0;
INT8U move_x=0;
INT8U win_starty=0x00;
INT8U win_startx=0x00;
INT16U addy=320;
INT16U addx=240;
INT16U win_endy = 0x013F;
INT16U win_endx = 0xeF;
void delay(INT16U ms)
{
for(INT16U jj = 0; jj < ms; jj++)
{
for(int ii = 0; ii <10 ; ii++);
}
}
void write_comm(INT16U command)
{
serial(command, 0);
}
void write_data(INT16U datum)
{
serial(datum, 1);
}
void serial(INT8U send_data,INT8U comm_data)
{
INT16U serial1 = 0;
LCDCS(0);
#if serial_SPI4
RS=comm_data;
#else
LCDSDA(comm_data); delay(1);LCDSCL(0); delay(1); LCDSCL(1); delay(1);
#endif
serial1 = send_data;
delay(1);
LCDSDA((serial1 & 0X80) >> 7); LCDSCL(0); delay(1);LCDSCL(1);delay(1);
LCDSDA((serial1 & 0X40) >> 6); LCDSCL(0); delay(1);LCDSCL(1);delay(1);
LCDSDA((serial1 & 0X20) >> 5); LCDSCL(0); delay(1);LCDSCL(1);delay(1);
LCDSDA((serial1 & 0X10) >> 4); LCDSCL(0); delay(1);LCDSCL(1);delay(1);
LCDSDA((serial1 & 0X08) >> 3); LCDSCL(0); delay(1); LCDSCL(1);delay(1);
LCDSDA((serial1 & 0X04) >> 2); LCDSCL(0); delay(1);LCDSCL(1);delay(1);
LCDSDA((serial1 & 0X02) >> 1); LCDSCL(0); delay(1);LCDSCL(1);delay(1);
LCDSDA((serial1 & 0X01) >> 0); LCDSCL(0); delay(1);LCDSCL(1);delay(1);
delay(1);