/********************************************************** ILI9327 16位 240X320液晶屏 例程序 **********************************************************/ #include //C51单片机程序 #include "Font8x16.h" //8X16 字母 数字 符号 #include "GB1616.h" //16*16汉字字模 /********************************************************** 液晶屏 16位 引脚定义 **********************************************************/ #define DataBusH P2 //高8位 并行数据口 #define DataBusL P0 //底8位 并行数据口 sbit LCD_CS=P1^0; //片选 sbit LCD_RS=P1^1; //数据/命令选择 sbit LCD_WR=P1^2; //写数据 sbit LCD_RD=P1^3; //读数据 sbit LCD_RES=P1^4; //复位 /********************************************************** 时间延时函数 **********************************************************/ void delayms(unsigned int count) { unsigned int i,j; for(i=0;i>8,com); Lcd_Write_Data(dat>>8,dat); } /********************************************************** 读取内部 ID (2个8位) 16位 **********************************************************/ unsigned int LCD_READ_ID(void){ unsigned char idH,idL; unsigned int ID; DataBusH=0xff; DataBusL=0xff; LCD_CS=0; //片选 0选定 1移除 LCD_RS=1; //1数据/0命令 1 LCD_RD=0; //读数据 idH=DataBusH;//8位并口 数据P2 idL=DataBusL;//8位并口 数据P0 LCD_RD=1; //读数据 LCD_RS=0; //1数据/0命令 0 LCD_CS=1; //片选 0选定 1移除 LCD_RS=0; //1数据/0命令 ID=(idH<<8)|idL; return(ID); } /********************************************************** 写寄存器 2个16位 转换写地址/参数 **********************************************************/ void send_host_reg_command(int cmd,int dataa) { Lcd_Write_Cmd(cmd>>8,cmd); Lcd_Write_Data(dataa>>8,dataa); } /********************************************************** 写寄存器 写地址/参数 **********************************************************/ void adderset(int xs,int xe,int ys,int ye) { lcd_write_data_com(0x0210, 0x0000); // Horizontal GRAM Start Address lcd_write_data_com(0x0211, 0x00EF); // Horizontal GRAM End Address lcd_write_data_com(0x0212, 0x0000); // Vertical GRAM Start Address lcd_write_data_com(0x0213, 0x01AF); // Vertical GRAM Start Address lcd_write_data_com(0x0400, 0x3100); // Gate Scan Line lcd_write_data_com(0x0401, 0x0001); // NDL,VLE, REV lcd_write_data_com(0x0404, 0x0000); // set scrolling line } /********************************************************** 显示 中文 汉字 **********************************************************/ void PutGB1616(unsigned short x, unsigned short y, unsigned char c[2], unsigned int fColor,unsigned int bColor) { unsigned int i,j,k; adderset(x,x+16-1,y,y+16-1); //设定 内部 X,Y轴 寄存器 for (k=0;k<64;k++) { //64标示自建汉字库中的个数,循环查询内码 if((GB_16[k].Index[0]==c[0])&&(GB_16[k].Index[1]==c[1])){ for(i=0;i<32;i++) { unsigned short m=GB_16[k].Msk[i]; for(j=0;j<8;j++) { if((m&0x80)==0x80) Lcd_Write_Data(fColor>>8,fColor); else Lcd_Write_Data(bColor>>8,bColor); m<<=1; } } }}} void LCD_wenzhi(unsigned short x, unsigned short y, unsigned char *s, unsigned int fColor, unsigned int bColor) { unsigned char l=0; while(*s){ PutGB1616(x+l*8,y,(unsigned char*)s,fColor,bColor);s+=2;l+=2; } } /********************************************************** 显示 字母 数字 符号 **********************************************************/ void LCD_PutChar8x16(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor) { unsigned int i,j; adderset(x,x+8-1,y,y+16-1); //设定 内部 X,Y轴 寄存器 for(i=0; i<16;i++) { unsigned char m=Font8x16[c*16+i]; for(j=0;j<8;j++) { if((m&0x80)==0x80) Lcd_Write_Data(fColor>>8,fColor); else Lcd_Write_Data(bColor>>8,bColor); m<<=1; } } } void LCD_zhifu(unsigned short x, unsigned short y, unsigned char *s, unsigned int fColor, unsigned int bColor) { unsigned char l=0; while(*s) { if( *s < 0x80) { LCD_PutChar8x16(x+l*8,y,*s,fColor,bColor); s++;l++; } } } /********************************************************** 显示 变量数字 **********************************************************/ void LCD_shuzi(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor) { unsigned int i,j; adderset(x,x+8-1,y,y+16-1); //设定 内部 X,Y轴 寄存器 for(i=0; i<16;i++) { unsigned char m=SSZZ[c][i]; for(j=0;j<8;j++) { if((m&0x80)==0x80) Lcd_Write_Data(fColor>>8,fColor); else Lcd_Write_Data(bColor>>8,bColor); m<<=1; } } } /********************************************************** 写入图片 函数(X 起始轴,X 结束轴 , Y 起始轴,Y 结束轴 , 数组库) **********************************************************/ void LCD_TEST_JPG(int x1,int x2,int y1,int y2,unsigned char *id) { unsigned char i=0,j=0,pixH,pixL; int n=0; // adderset(x1,x2-1,y1,y2-1); //设定 内部 X,Y轴 寄存器 // // id++; //取模软件 进一位 lcd_write_data_com(0x0210, 0x0000); // Horizontal GRAM Start Address lcd_write_data_com(0x0211, 0x00EF); // Horizontal GRAM End Address lcd_write_data_com(0x0212, 0x0000); // Vertical GRAM Start Address lcd_write_data_com(0x0213, 0x01AF); // Vertical GRAM Start Address lcd_write_data_com(0x0400, 0x3100); // Gate Scan Line lcd_write_data_com(0x0401, 0x0001); // NDL,VLE, REV lcd_write_data_com(0x0404, 0x0000); // set scrolling line for(i=0;i<400;i++) { for (j=0;j<240;j++) { if(n == 19200) n = 0; Lcd_Write_Data(id[n*2+1],id[n*2]); n++; } } } /********************************************************** 局部刷色(0x00,0xff,x1,x2,y1,y2) **********************************************************/ void LCD_Color_with_ADD(int x1,int x2,int y1,int y2,unsigned int RPG) { unsigned char i,j; adderset(x1,x2,y1,y2); //设定 内部 X,Y轴 寄存器 for(i=0;i>8,RPG); } /********************************************************** 刷全屏刷色 **********************************************************/ void LCD_TEST_SingleColor(unsigned int RPG) { int i,j; lcd_write_data_com(0x0210, 0x0000); // Horizontal GRAM Start Address lcd_write_data_com(0x0211, 0x00EF); // Horizontal GRAM End Address lcd_write_data_com(0x0212, 0x0000); // Vertical GRAM Start Address lcd_write_data_com(0x0213, 0x01AF); // Vertical GRAM Start Address for (i=0;i<240;i++) for (j=0;j<400;j++) Lcd_Write_Data(RPG>>8,RPG); } /********************************************************** HX8352C 内部寄存器 初始化 **********************************************************/ void LCD_ILI9327_INT(void) { LCD_CS=1; delayms(50); LCD_RES=0;delayms(100); LCD_RES=1;delayms(100); //*********************************************初始化 lcd_write_data_com(0x0702, 0x3008);// Set internal timing, don’t change this value lcd_write_data_com(0x0705, 0x0036);// Set internal timing, don’t change this value lcd_write_data_com(0x070B, 0x1233);// Set internal timing, don’t change this value lcd_write_data_com(0x0001, 0x0100); // set SS and SM bit lcd_write_data_com(0x0002, 0x0100); // set 1 line inversion lcd_write_data_com(0x0003, 0x1030); // set GRAM write direction and BGR=1. lcd_write_data_com(0x0008, 0x0202); // set the back porch and front porch lcd_write_data_com(0x0009, 0x0000); // set non-display area refresh cycle ISC[3:0] lcd_write_data_com(0x000C, 0x0000); // RGB interface setting lcd_write_data_com(0x000F, 0x0000); // RGB interface polarity //*************Power On sequence ****************// lcd_write_data_com(0x0100, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB lcd_write_data_com(0x0102, 0x0000); // VREG1OUT voltage lcd_write_data_com(0x0103, 0x0000); // VDV[4:0] for VCOM amplitude delayms(200); // Dis-charge capacitor power voltage lcd_write_data_com(0x0100, 0x1190); // SAP, BT[3:0], AP, DSTB, SLP, STB lcd_write_data_com(0x0101, 0x0227); // DC1[2:0], DC0[2:0], VC[2:0] delayms(50); // Delay 50ms lcd_write_data_com(0x0102, 0x01BD); // VREG1OUT voltage delayms(50); // Delay 50ms lcd_write_data_com(0x0103, 0x3800); // VDV[4:0] for VCOM amplitude lcd_write_data_com(0x0281, 0x0013); // VCM[5:0] for VCOMH delayms(50); lcd_write_data_com(0x0200, 0x0000); // GRAM horizontal Address lcd_write_data_com(0x0201, 0x0000); // GRAM Vertical Address // ----------- Adjust the Gamma Curve ----------// lcd_write_data_com(0x0300, 0x0000); lcd_write_data_com(0x0301, 0x0707); lcd_write_data_com(0x0302, 0x0606); lcd_write_data_com(0x0305, 0x0000); lcd_write_data_com(0x0306, 0x0E00); lcd_write_data_com(0x0307, 0x0606); lcd_write_data_com(0x0308, 0x0005); lcd_write_data_com(0x0309, 0x0007); lcd_write_data_com(0x030C, 0x0002); lcd_write_data_com(0x030D, 0x000E); //------------------ Set GRAM area ---------------// lcd_write_data_com(0x0210, 0x0000); // Horizontal GRAM Start Address lcd_write_data_com(0x0211, 0x00EF); // Horizontal GRAM End Address lcd_write_data_com(0x0212, 0x0000); // Vertical GRAM Start Address lcd_write_data_com(0x0213, 0x01AF); // Vertical GRAM Start Address lcd_write_data_com(0x0400, 0x3100); // Gate Scan Line lcd_write_data_com(0x0401, 0x0001); // NDL,VLE, REV lcd_write_data_com(0x0404, 0x0000); // set scrolling line //-------------- Partial Display Control ---------// lcd_write_data_com(0x0500, 0x0000);//Partial Image 1 Display Position lcd_write_data_com(0x0501, 0x0000); //Partial Image 1 RAM Start/End Address lcd_write_data_com(0x0502, 0x0000); //Partial Image 1 RAM Start/End Address lcd_write_data_com(0x0503, 0x0000); //Partial Image 2 Display Position lcd_write_data_com(0x0504, 0x0000);//Partial Image 2 RAM Start/End Address lcd_write_data_com(0x0505, 0x0000); //Partial Image 2 RAM Start/End Address //-------------- Panel Control -------------------// lcd_write_data_com(0x0010, 0x0010); //DIVI[1:0];RTNI[4:0] lcd_write_data_com(0x0011, 0x0600); //NOWI[2:0];SDTI[2:0] lcd_write_data_com(0x0020, 0x0002); //DIVE[1:0];RTNE[5:0] lcd_write_data_com(0x0007, 0x0173); // 262K color and display ON } /********************************************************** 主函数 **********************************************************/ void main(void) { unsigned int ID; LCD_CS=1; delayms(50); LCD_RES=0;delayms(100); LCD_RES=1;delayms(1000); Lcd_Write_Cmd(0x00,0x00); //读取值 0X9327 LCD_READ_ID(); // ID=((LCD_READ_ID()<<8)+LCD_READ_ID()); //读出 液晶屏 IC的ID LCD_ILI9327_INT(); //寄存器 初始化 LCD_TEST_SingleColor(0xf800);delayms(3000);//红 LCD_TEST_SingleColor(0x07e0);delayms(3000);//绿 LCD_TEST_SingleColor(0x001f);delayms(3000);//蓝 LCD_TEST_SingleColor(0x0000);delayms(3000);//黑 LCD_TEST_SingleColor(0xffff);delayms(3000);//白 //高8底8位 颜色总和 0x0000(黑)0xffFF(白) // LCD_Color_with_ADD(50,200,50,100,0xaa77); delayms(1000); //局部刷色(x1,x2,y1,y2,0x00,0xff) LCD_TEST_JPG(0,239,0,399,image); // delayms(10000); //写入图片(X 起始轴,X 结束轴 , Y 起始轴,Y 结束轴 , 数组库) // LCD_wenzhi(20,200,"深圳市",0x07e0,0xf800); // LCD_wenzhi(68,200,"叁",0x07e0,0xf800); // LCD_wenzhi(84,200,"合",0x07e0,0xf800); // LCD_wenzhi(100,200,"巨",0x07e0,0xf800); // LCD_wenzhi(116,200,"力",0x07e0,0xf800); // LCD_wenzhi(132,200,"科技有限公司",0x07e0,0xf800); // LCD_zhifu(50,250,"0 1 2 3 4 5 6 7 8 9",0x001f,0xf800); // LCD_zhifu(10,280,"abcdefghijklmnopqistuvwxyz",0x001f,0xf800); // LCD_zhifu(15,300,"`,./<>';:[]{}\|?)(-=+*&^%$",0x001f,0xf800); // LCD_zhifu(20,20,"ID ILI",0xf800,0xffff); //显示 ID 字母 // LCD_shuzi(80,20,(ID>>8)/16,0xf800,0xffff); //写入变量 数字 // LCD_shuzi(90,20,(ID>>8)%16,0xf800,0xffff); //写入变量 数字 // LCD_shuzi(100,20,(ID<<8)%255/16,0xf800,0xffff); //写入变量 数字 // LCD_shuzi(110,20,(ID<<8)%255%16,0xf800,0xffff); //写入变量 数字 // LCD_shuzi(150,20,1,0xf800,0xffff); //写入变量 数字 // LCD_shuzi(160,20,6,0xf800,0xffff); //写入变量 数字 // LCD_wenzhi(170,20,"位",0xf800,0xffff); //写入中文 while(1) delayms(100); } /********************************************************** ILI9327 16位 240X320液晶屏 例程序 **********************************************************/