sggt/App/LCD/JLX240-00303-BN-S.c

398 lines
8.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//LCM resolution:240x320,
//driver IC:ST7789V,
#include <STC15F2K60S2.H>
#include <chinese_code.h>
//液晶屏IC所需要的信号线的接口定义
sbit cs1=P3^5;
sbit reset=P3^3;
sbit rs=P3^0;
sbit sclk=P3^4;
sbit sid=P3^2;
sbit IM1=P3^6;
sbit IM2=P3^7;
sbit key=P2^0; //P2.0口与GND之间接一个按键
/*写指令到LCD模块*/
void transfer_command(int data1)
{
char i;
cs1=0;
rs=0;
for(i=0;i<8;i++)
{
sclk=0;
if(data1&0x80) sid=1;
else sid=0;
sclk=1;
data1=data1<<=1;
}
cs1=1;
}
/*写数据到LCD模块*/
void transfer_data(int data1)
{
char i;
cs1=0;
rs=1;
for(i=0;i<8;i++)
{
sclk=0;
if(data1&0x80) sid=1;
else sid=0;
sclk=1;
data1=data1<<=1;
}
cs1=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 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=1; //IM1=0、IM2=0并行接口IM1=1、IM2=1串行接口
IM2=1;
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();
}
}