#ifndef __LCD_H #define __LCD_H #include "sys.h" #include "stdlib.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经做者许可,不得用于其它任何用途 //ALIENTEK MiniSTM32F103开发板 //2.4寸/2.8寸/3.5寸/4.3寸/7寸 TFT液晶驱动 //支持驱动IC型号包括:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/ // SPFD5408/1505/B505/C505/NT35310/NT35510/SSD1963等 //正点原子@ALIENTEK //技术论坛:www.openedv.com //建立日期:2010/7/4 //版本:V3.0 //版权全部,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2014-2024 //All rights reserved //******************************************************************************** //V1.2修改说明 //支持了SPFD5408的驱动,另外把液晶ID直接打印成HEX格式.方便查看LCD驱动IC. //V1.3 //加入了快速IO的支持 //修改了背光控制的极性(适用于V1.8及之后的开发板版本) //对于1.8版本以前(不包括1.8)的液晶模块,请修改LCD_Init函数的LCD_LED=1;为LCD_LED=1; //V1.4 //修改了LCD_ShowChar函数,使用画点功能画字符。 //加入了横竖屏显示的支持 //V1.5 20110730 //1,修改了B505液晶读颜色有误的bug. //2,修改了快速IO及横竖屏的设置方式. //V1.6 20111116 //1,加入对LGDP4535液晶的驱动支持 //V1.7 20120713 //1,增长LCD_RD_DATA函数 //2,增长对ILI9341的支持 //3,增长ILI9325的独立驱动代码 //4,增长LCD_Scan_Dir函数(慎重使用) //6,另外修改了部分原来的函数,以适应9341的操做 //V1.8 20120905 //1,加入LCD重要参数设置结构体lcddev //2,加入LCD_Display_Dir函数,支持在线横竖屏切换 //V1.9 20120911 //1,新增RM68042驱动(ID:6804),可是6804不支持横屏显示!!缘由:改变扫描方式, //致使6804坐标设置失效,试过不少方法都不行,暂时无解。 //V2.0 20120924 //在不硬件复位的状况下,ILI9341的ID读取会被误读成9300,修改LCD_Init,将没法识别 //的状况(读到ID为9300/非法ID),强制指定驱动IC为ILI9341,执行9341的初始化。 //V2.1 20120930 //修正ILI9325读颜色的bug。 //V2.2 20121007 //修正LCD_Scan_Dir的bug。 //V2.3 20130120 //新增6804支持横屏显示 //V2.4 20131120 //1,新增NT35310(ID:5310)驱动器的支持 //2,新增LCD_Set_Window函数,用于设置窗口,对快速填充,比较有用,可是该函数在横屏时,不支持6804. //V2.5 20140211 //1,新增NT35510(ID:5510)驱动器的支持 //V2.6 20140504 //1,新增ASCII 24*24字体的支持(更多字体用户能够自行添加) //2,修改部分函数参数,以支持MDK -O2优化 //3,针对9341/35310/35510,写时间设置为最快,尽量的提升速度 //4,去掉了SSD1289的支持,由于1289实在是太慢了,读周期要1us...简直奇葩.不适合F4使用 //5,修正68042及C505等IC的读颜色函数的bug. //V2.7 20140710 //1,修正LCD_Color_Fill函数的一个bug. //2,修正LCD_Scan_Dir函数的一个bug. //V2.8 20140721 //1,解决MDK使用-O2优化时LCD_ReadPoint函数读点失效的问题. //2,修正LCD_Scan_Dir横屏时设置的扫描方式显示不全的bug. //V2.9 20141130 //1,新增对SSD1963 LCD的支持. //2,新增LCD_SSD_BackLightSet函数 //3,取消ILI93XX的Rxx寄存器定义 //V3.0 20150423 //修改SSD1963 LCD屏的驱动参数. ////////////////////////////////////////////////////////////////////////////////// //LCD重要参数集 typedef struct { u16 width; //LCD 宽度 u16 height; //LCD 高度 u16 id; //LCD ID u8 dir; //横屏仍是竖屏控制:0,竖屏;1,横屏。 u16 wramcmd; //开始写gram指令 u16 setxcmd; //设置x坐标指令 u16 setycmd; //设置y坐标指令 }_lcd_dev; //LCD参数 extern _lcd_dev lcddev; //管理LCD重要参数 //LCD的画笔颜色和背景色 extern u16 POINT_COLOR;//默认红色 extern u16 BACK_COLOR; //背景颜色.默认为白色 //////////////////////////////////////////////////////////////////// //-----------------LCD端口定义---------------- #define LCD_LED PCout(10) //LCD背光 PC10 #define LCD_CS_SET GPIOC->BSRR=1<<9 //片选端口 PC9 #define LCD_RS_SET GPIOC->BSRR=1<<8 //数据/命令 PC8 #define LCD_WR_SET GPIOC->BSRR=1<<7 //写数据 PC7 #define LCD_RD_SET GPIOC->BSRR=1<<6 //读数据 PC6 #define LCD_CS_CLR GPIOC->BRR=1<<9 //片选端口 PC9 #define LCD_RS_CLR GPIOC->BRR=1<<8 //数据/命令 PC8 #define LCD_WR_CLR GPIOC->BRR=1<<7 //写数据 PC7 #define LCD_RD_CLR GPIOC->BRR=1<<6 //读数据 PC6 //PB0~15,做为数据线 #define DATAOUT(x) GPIOB->ODR=x; //数据输出 #define DATAIN GPIOB->IDR; //数据输入 ////////////////////////////////////////////////////////////////////// //扫描方向定义 #define L2R_U2D 0 //从左到右,从上到下 #define L2R_D2U 1 //从左到右,从下到上 #define R2L_U2D 2 //从右到左,从上到下 #define R2L_D2U 3 //从右到左,从下到上 #define U2D_L2R 4 //从上到下,从左到右 #define U2D_R2L 5 //从上到下,从右到左 #define D2U_L2R 6 //从下到上,从左到右 #define D2U_R2L 7 //从下到上,从右到左 #define DFT_SCAN_DIR L2R_U2D //默认的扫描方向 //扫描方向定义 #define L2R_U2D 0 //从左到右,从上到下 #define L2R_D2U 1 //从左到右,从下到上 #define R2L_U2D 2 //从右到左,从上到下 #define R2L_D2U 3 //从右到左,从下到上 #define U2D_L2R 4 //从上到下,从左到右 #define U2D_R2L 5 //从上到下,从右到左 #define D2U_L2R 6 //从下到上,从左到右 #define D2U_R2L 7 //从下到上,从右到左 #define DFT_SCAN_DIR L2R_U2D //默认的扫描方向 //画笔颜色 #define WHITE 0xFFFF #define BLACK 0x0000 #define BLUE 0x001F #define BRED 0XF81F #define GRED 0XFFE0 #define GBLUE 0X07FF #define RED 0xF800 #define MAGENTA 0xF81F #define GREEN 0x07E0 #define CYAN 0x7FFF #define YELLOW 0xFFE0 #define BROWN 0XBC40 //棕色 #define BRRED 0XFC07 //棕红色 #define GRAY 0X8430 //灰色 //GUI颜色 #define DARKBLUE 0X01CF //深蓝色 #define LIGHTBLUE 0X7D7C //浅蓝色 #define GRAYBLUE 0X5458 //灰蓝色 //以上三色为PANEL的颜色 #define LIGHTGREEN 0X841F //浅绿色 #define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色 #define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色) #define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色) void LCD_Init(void); //初始化 void LCD_DisplayOn(void); //开显示 void LCD_DisplayOff(void); //关显示 void LCD_Clear(u16 Color); //清屏 void LCD_SetCursor(u16 Xpos, u16 Ypos); //设置光标 void LCD_DrawPoint(u16 x,u16 y); //画点 void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color); //快速画点 u16 LCD_ReadPoint(u16 x,u16 y); //读点 void LCD_Draw_Circle(u16 x0,u16 y0,u8 r); //画圆 void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2); //画线 void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2); //画矩形 void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color); //填充单色 void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color); //填充指定颜色 void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode); //显示一个字符 void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size); //显示一个数字 void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode); //显示 数字 void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p); //显示一个字符串,12/16字体 void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue); u16 LCD_ReadReg(u16 LCD_Reg); void LCD_WriteRAM_Prepare(void); void LCD_WriteRAM(u16 RGB_Code); void LCD_Scan_Dir(u8 dir); //设置屏扫描方向 void LCD_Display_Dir(u8 dir); //设置屏幕显示方向 void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height); //设置窗口 //写数据函数 #define LCD_WR_DATA(data){\ LCD_RS_SET;\ LCD_CS_CLR;\ DATAOUT(data);\ LCD_WR_CLR;\ LCD_WR_SET;\ LCD_CS_SET;\ } //LCD分辨率设置 #define SSD_HOR_RESOLUTION 800 //LCD水平分辨率 #define SSD_VER_RESOLUTION 480 //LCD垂直分辨率 //LCD驱动参数设置 #define SSD_HOR_PULSE_WIDTH 1 //水平脉宽 #define SSD_HOR_BACK_PORCH 46 //水平前廊 #define SSD_HOR_FRONT_PORCH 210 //水平后廊 #define SSD_VER_PULSE_WIDTH 1 //垂直脉宽 #define SSD_VER_BACK_PORCH 23 //垂直前廊 #define SSD_VER_FRONT_PORCH 22 //垂直前廊 //以下几个参数,自动计算 #define SSD_HT (SSD_HOR_RESOLUTION+SSD_HOR_BACK_PORCH+SSD_HOR_FRONT_PORCH) #define SSD_HPS (SSD_HOR_BACK_PORCH) #define SSD_VT (SSD_VER_RESOLUTION+SSD_VER_BACK_PORCH+SSD_VER_FRONT_PORCH) #define SSD_VPS (SSD_VER_BACK_PORCH) #endif
#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "lcd.h" //ALIENTEK Mini STM32开发板范例代码11 //TFTLCD显示实验 //技术支持:www.openedv.com //广州市星翼电子科技有限公司 int main(void) { u8 x=0; u8 lcd_id[12]; //存放LCD ID字符串 delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600 LED_Init(); //初始化与LED链接的硬件接口 LCD_Init(); POINT_COLOR=RED; sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。 while(1) { switch(x) { case 0:LCD_Clear(WHITE);break; case 1:LCD_Clear(BLACK);break; case 2:LCD_Clear(BLUE);break; case 3:LCD_Clear(RED);break; case 4:LCD_Clear(MAGENTA);break; case 5:LCD_Clear(GREEN);break; case 6:LCD_Clear(CYAN);break; case 7:LCD_Clear(YELLOW);break; case 8:LCD_Clear(BRRED);break; case 9:LCD_Clear(GRAY);break; case 10:LCD_Clear(LGRAY);break; case 11:LCD_Clear(BROWN);break; } POINT_COLOR=RED; LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^"); LCD_ShowString(30,70,200,16,16,"TFTLCD TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,110,200,16,16,lcd_id); //显示LCD ID LCD_ShowString(30,130,200,12,12,"2014/3/7"); LCD_ShowString(30,150,200,18,12,"YYYYYYYYYYYYYYY"); x++; if(x==12)x=0; LED0=!LED0; delay_ms(1000); } }