435 lines
9.0 KiB
C
435 lines
9.0 KiB
C
// LCM resolution:240x320,
|
||
// driver IC:ST7789V,
|
||
|
||
#include <chinese_code.h>
|
||
|
||
// 液晶屏IC所需要的信号线的接口定义
|
||
/*
|
||
sbit DC0 = P3 ^ 4;
|
||
sbit WR0 = P3 ^ 0;
|
||
sbit RD0 = P3 ^ 1;
|
||
sbit CS0 = P3 ^ 5;
|
||
sbit reset = P3 ^ 3;
|
||
sbit IM1 = P3 ^ 6;
|
||
sbit IM2 = P3 ^ 7;
|
||
sbit key = P2 ^ 0; // P2.0口与GND之间接一个按键
|
||
*/
|
||
|
||
|
||
#pragma pack(push,1)
|
||
|
||
typedef struct ST_TEST
|
||
{
|
||
unsigned char ucA:1;
|
||
unsigned char ucB:1;
|
||
unsigned char ucC:1;
|
||
unsigned char ucD:1;
|
||
unsigned char ucE:1;
|
||
unsigned char ucF:1;
|
||
unsigned char ucG:1;
|
||
unsigned char ucH:1;
|
||
} ST_TEST;
|
||
#pragma pack(pop)
|
||
|
||
|
||
union data_port
|
||
{
|
||
uint8_t data;
|
||
#pragma pack(push,1)
|
||
struct
|
||
{
|
||
uint8_t bit0 : 1;
|
||
uint8_t bit1 : 1;
|
||
uint8_t bit2 : 1;
|
||
uint8_t bit3 : 1;
|
||
uint8_t bit4 : 1;
|
||
uint8_t bit5 : 1;
|
||
uint8_t bit6 : 1;
|
||
uint8_t bit7 : 1;
|
||
} bit;
|
||
#pragma pack(pop)
|
||
}
|
||
|
||
transfer_command(int com1)
|
||
{
|
||
CS0 = 0;
|
||
DC0 = 0;
|
||
RD0 = 1;
|
||
P1 = com1;
|
||
WR0 = 0;
|
||
delay_us(1);
|
||
WR0 = 1;
|
||
CS0 = 1;
|
||
}
|
||
|
||
void transfer_data(int data1)
|
||
{
|
||
CS0 = 0;
|
||
DC0 = 1;
|
||
RD0 = 1;
|
||
P1 = data1;
|
||
WR0 = 0;
|
||
WR0 = 1;
|
||
CS0 = 1;
|
||
}
|
||
|
||
// 连写2个字节(即16位)数据到LCD模块
|
||
void transfer_data_16(uint data_16bit)
|
||
{
|
||
transfer_data(data_16bit >> 8);
|
||
transfer_data(data_16bit);
|
||
}
|
||
|
||
void delay(long i)
|
||
{
|
||
int j, k;
|
||
for (j = 0; j < i; j++)
|
||
for (k = 0; k < 110; k++)
|
||
;
|
||
}
|
||
|
||
void delay_us(long i)
|
||
{
|
||
int j, k;
|
||
for (j = 0; j < i; j++)
|
||
;
|
||
for (k = 0; k < 1; k++)
|
||
;
|
||
}
|
||
|
||
void Switch()
|
||
{
|
||
repeat:
|
||
if (key == 1)
|
||
goto repeat;
|
||
else
|
||
delay(1000);
|
||
if (key)
|
||
goto repeat;
|
||
else
|
||
;
|
||
}
|
||
|
||
void lcd_initial()
|
||
{
|
||
reset = 0;
|
||
delay(200);
|
||
reset = 1;
|
||
delay(200);
|
||
//************* Start Initial Sequence **********//
|
||
|
||
//------------------------------display and color format setting--------------------------------//
|
||
transfer_command(0x36); // 行扫描顺序及RGB,列扫描顺序,横放/竖放
|
||
transfer_data(0x00);
|
||
transfer_data(0x48);
|
||
|
||
transfer_command(0xB6); // 显示功能设置:列/行 显示顺序
|
||
transfer_data(0x0A);
|
||
transfer_data(0x82); // 改变SOURCE线的方向:0xa2:左到右,0x82:右到左
|
||
|
||
transfer_command(0x3a); // 256K 16bit/pixel
|
||
transfer_data(0x05);
|
||
//--------------------------------ST7789V Frame rate setting----------------------------------//
|
||
transfer_command(0xb2);
|
||
transfer_data(0x0c);
|
||
transfer_data(0x0c);
|
||
transfer_data(0x00);
|
||
transfer_data(0x33);
|
||
transfer_data(0x33);
|
||
transfer_command(0xb7);
|
||
transfer_data(0x35);
|
||
//---------------------------------ST7789V Power setting--------------------------------------//
|
||
transfer_command(0xbb);
|
||
transfer_data(0x28);
|
||
transfer_command(0xc0);
|
||
transfer_data(0x2c);
|
||
transfer_command(0xc2);
|
||
transfer_data(0x01);
|
||
transfer_command(0xc3);
|
||
transfer_data(0x10);
|
||
transfer_command(0xc4);
|
||
transfer_data(0x20);
|
||
transfer_command(0xc6);
|
||
transfer_data(0x0f);
|
||
transfer_command(0xd0);
|
||
transfer_data(0xa4);
|
||
transfer_data(0xa1);
|
||
//--------------------------------ST7789V gamma setting---------------------------------------//
|
||
transfer_command(0xe0);
|
||
transfer_data(0xd0);
|
||
transfer_data(0x00);
|
||
transfer_data(0x02);
|
||
transfer_data(0x07);
|
||
transfer_data(0x0a);
|
||
transfer_data(0x28);
|
||
transfer_data(0x32);
|
||
transfer_data(0x44);
|
||
transfer_data(0x42);
|
||
transfer_data(0x06);
|
||
transfer_data(0x0e);
|
||
transfer_data(0x12);
|
||
transfer_data(0x14);
|
||
transfer_data(0x17);
|
||
|
||
transfer_command(0xe1);
|
||
transfer_data(0xd0);
|
||
transfer_data(0x00);
|
||
transfer_data(0x02);
|
||
transfer_data(0x07);
|
||
transfer_data(0x0a);
|
||
transfer_data(0x28);
|
||
transfer_data(0x31);
|
||
transfer_data(0x54);
|
||
transfer_data(0x47);
|
||
transfer_data(0x0e);
|
||
transfer_data(0x1c);
|
||
transfer_data(0x17);
|
||
transfer_data(0x1b);
|
||
transfer_data(0x1e);
|
||
|
||
transfer_command(0x11); // 退出睡眠
|
||
delay(200);
|
||
transfer_command(0x29); // 打开显示
|
||
}
|
||
|
||
// 定义窗口坐标:开始坐标(XS,YS)以及窗口大小(x_total,y_total)
|
||
void lcd_address(int XS, int YS, int x_total, int y_total)
|
||
{
|
||
int XE, YE;
|
||
XE = XS + x_total - 1;
|
||
YE = YS + y_total - 1;
|
||
transfer_command(0x2a); // 设置X开始及结束的地址
|
||
transfer_data_16(XS); // X开始地址(16位)
|
||
transfer_data_16(XE); // X结束地址(16位)
|
||
|
||
transfer_command(0x2b); // 设置Y开始及结束的地址
|
||
transfer_data_16(YS); // Y开始地址(16位)
|
||
transfer_data_16(YE); // Y结束地址(16位)
|
||
|
||
transfer_command(0x2c); // 写数据开始
|
||
}
|
||
|
||
void mono_transfer_data_16(int mono_data, int font_color, int back_color)
|
||
{
|
||
int i;
|
||
for (i = 0; i < 8; i++)
|
||
{
|
||
if (mono_data & 0x80)
|
||
{
|
||
transfer_data_16(font_color); // 当数据是1时,显示字体颜色
|
||
}
|
||
else
|
||
{
|
||
transfer_data_16(back_color); // 当数据是0时,显示底色
|
||
}
|
||
mono_data <<= 1;
|
||
}
|
||
}
|
||
|
||
// 全屏显示一种颜色
|
||
void display_color(int color_data)
|
||
{
|
||
int i, j;
|
||
lcd_address(0, 0, 240, 320);
|
||
for (i = 0; i < 240; i++)
|
||
{
|
||
for (j = 0; j < 320; j++)
|
||
{
|
||
transfer_data_16(color_data);
|
||
}
|
||
}
|
||
}
|
||
|
||
void display_black(void)
|
||
{
|
||
int i, j, k;
|
||
transfer_command(0x2c); // 写数据开始
|
||
for (i = 0; i < 240; i++)
|
||
{
|
||
transfer_data_16(0xffff);
|
||
}
|
||
for (i = 0; i < 318; i++)
|
||
{
|
||
for (k = 0; k < 1; k++)
|
||
{
|
||
transfer_data_16(0xffff);
|
||
}
|
||
for (j = 0; j < 238; j++)
|
||
{
|
||
transfer_data_16(0x0000);
|
||
}
|
||
for (k = 0; k < 1; k++)
|
||
{
|
||
transfer_data_16(0xffff);
|
||
}
|
||
}
|
||
for (i = 0; i < 320; i++)
|
||
{
|
||
transfer_data_16(0xffff);
|
||
}
|
||
}
|
||
|
||
// 显示8x16点阵的字符串
|
||
void disp_string_8x16(int x, int y, char *text, int font_color, int back_color)
|
||
{
|
||
int i = 0, j, k;
|
||
while (text[i] > 0x00)
|
||
{
|
||
if ((text[i] >= 0x20) && (text[i] <= 0x7e))
|
||
{
|
||
j = text[i] - 0x20;
|
||
lcd_address(x, y, 8, 16);
|
||
for (k = 0; k < 16; k++)
|
||
{
|
||
mono_transfer_data_16(ascii_table_8x16[j * 16 + k], font_color, back_color); //?a??"ascii_table_8x16[]"?a??êy×é?ú"ASCII_TABLE_5X8_8X16_horizontal.h"à?
|
||
}
|
||
x += 8;
|
||
i++;
|
||
}
|
||
else
|
||
i++;
|
||
}
|
||
}
|
||
|
||
void display_string_16x16(int x, int y, uchar *text, int font_color, int back_color)
|
||
{
|
||
uchar i, j, k;
|
||
uint address;
|
||
j = 0;
|
||
while (text[j] != '\0') //'\0' 字符串结束标志
|
||
{
|
||
i = 0;
|
||
address = 1;
|
||
while (Chinese_horizontal_text_16x16[i] > 0x7e) // >0x7f即说明不是ASCII码字符
|
||
{
|
||
if (Chinese_horizontal_text_16x16[i] == text[j])
|
||
{
|
||
if (Chinese_horizontal_text_16x16[i + 1] == text[j + 1])
|
||
{
|
||
address = i * 16;
|
||
break;
|
||
}
|
||
}
|
||
i += 2;
|
||
}
|
||
if (y > 320)
|
||
{
|
||
y = 0;
|
||
x += 16;
|
||
}
|
||
|
||
if (address != 1) // 显示汉字
|
||
{
|
||
lcd_address(x, y, 16, 16);
|
||
for (i = 0; i < 2; i++)
|
||
{
|
||
for (k = 0; k < 16; k++)
|
||
{
|
||
mono_transfer_data_16(Chinese_horizontal_code_16x16[address], font_color, back_color);
|
||
address++;
|
||
}
|
||
}
|
||
j += 2;
|
||
}
|
||
else // 显示空白字符
|
||
{
|
||
lcd_address(x, y, 16, 16);
|
||
for (i = 0; i < 2; i++)
|
||
{
|
||
for (k = 0; k < 16; k++)
|
||
{
|
||
mono_transfer_data_16(0x00, font_color, back_color);
|
||
}
|
||
}
|
||
j += 2;
|
||
}
|
||
x = x + 16;
|
||
}
|
||
}
|
||
|
||
// 显示32x32点阵的单色的图像
|
||
void disp_32x32(int x, int y, char *dp, int font_color, int back_color)
|
||
{
|
||
int i, j;
|
||
lcd_address(x, y, 32, 32);
|
||
for (i = 0; i < 32; i++)
|
||
{
|
||
for (j = 0; j < 4; j++)
|
||
{
|
||
mono_transfer_data_16(*dp, font_color, back_color);
|
||
dp++;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 显示一幅彩图
|
||
void display_image(int x, int y, uchar *dp)
|
||
{
|
||
uchar i, j, k = 0;
|
||
lcd_address(x, y, 120, 160);
|
||
for (i = 0; i < 120; i++)
|
||
{
|
||
for (j = 0; j < 160; j++)
|
||
{
|
||
transfer_data(*dp); // 传一个像素的图片数据的高位
|
||
dp++;
|
||
transfer_data(*dp); // 传一个像素的图片数据的低位
|
||
dp++;
|
||
}
|
||
}
|
||
}
|
||
|
||
void main(void)
|
||
{
|
||
P1M1 = 0x00;
|
||
P1M0 = 0x00; // P1配置为准双向
|
||
P2M1 = 0x00;
|
||
P2M0 = 0x00; // P2配置为准双向
|
||
P3M1 = 0x00;
|
||
P3M0 = 0x00; // P3配置为准双向
|
||
IM1 = 0; // IM1=0、IM2=0并行接口;IM1=1、IM2=1串行接口
|
||
IM2 = 0;
|
||
lcd_initial();
|
||
while (1)
|
||
{
|
||
display_color(blue);
|
||
disp_32x32(40 + 32 * 0, 8, jing_32x32, white, blue);
|
||
disp_32x32(40 + 32 * 1, 8, lian_32x32, white, blue);
|
||
disp_32x32(40 + 32 * 2, 8, xun_32x32, white, blue);
|
||
disp_32x32(40 + 32 * 3, 8, dian_32x32, white, blue);
|
||
disp_32x32(40 + 32 * 4, 8, zi_32x32, white, blue);
|
||
|
||
display_string_16x16(24, 56, "深圳市晶联讯电子有限公司", white, blue);
|
||
display_string_16x16(48, 88, "型号", white, blue);
|
||
disp_string_8x16(80, 88, ":JLX240-00303-BN", white, blue);
|
||
display_string_16x16(48, 120, "视窗", white, blue);
|
||
disp_string_8x16(80, 120, ":36.7x48.9mm", white, blue);
|
||
display_string_16x16(48, 152, "驱动", white, blue);
|
||
disp_string_8x16(80, 152, "IC:ST7789V", white, blue);
|
||
|
||
display_string_16x16(0, 184, "经营宗旨:制造高品质产品及服务", white, blue);
|
||
display_string_16x16(0, 216, "质量方针:客户至上,质量保证", white, blue);
|
||
display_string_16x16(79, 236, "持续改进,服务到位", white, blue);
|
||
display_string_16x16(0, 270, "经营目标:做最好的液晶模块厂家", white, blue);
|
||
display_string_16x16(79, 292, "做客户信得过的企业", white, blue);
|
||
Switch();
|
||
|
||
display_image(0, 0, pic1);
|
||
display_image(120, 0, pic1);
|
||
display_image(0, 160, pic1);
|
||
display_image(120, 160, pic1);
|
||
Switch();
|
||
|
||
display_color(0xf800);
|
||
Switch();
|
||
display_color(0x07e0);
|
||
Switch();
|
||
display_color(0x001f);
|
||
Switch();
|
||
display_black();
|
||
Switch();
|
||
display_color(0xffff);
|
||
Switch();
|
||
}
|
||
}
|