#include "lcd.h"
#include "stdlib.h"
#include "font.h"
#include "usart.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//2.4/2.8寸TFT液晶驱动
//支持驱动IC型号包括:ILI9341/ILI9325/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/SPFD5408/SSD1289/1505/B505/C505等
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2011/1/13
//版本:V1.7
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//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的操作
//////////////////////////////////////////////////////////////////////////////////
//画笔颜色,背景颜色
u16 POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;
u16 DeviceCode;
#if LCD_FAST_IO==1 //快速IO
//写寄存器函数
//data:寄存器值
void LCD_WR_REG(u8 data)
{
LCD_RS_CLR;//写地址
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
#else//正常IO
//写寄存器函数
//data:寄存器值
void LCD_WR_REG(u8 data)
{
LCD_RS=0;//写地址
LCD_CS=0;
DATAOUT(data);
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;
}
#endif
//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
u16 t;
GPIOB->CRL=0X88888888; //PB0-7 上拉输入
GPIOB->CRH=0X88888888; //PB8-15 上拉输入
GPIOB->ODR=0X0000; //全部输出0
#if LCD_FAST_IO==1 //快速IO
LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD_CLR;
if(DeviceCode==0X8989)delay_us(2);//FOR 8989,延时2us
LCD_RD_SET;
t=DATAIN;
LCD_CS_SET;
#else
LCD_RS=1;
LCD_CS=0;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD=0;
LCD_RD=1;
t=DATAIN;
LCD_CS=1;
#endif
GPIOB->CRL=0X33333333; //PB0-7 上拉输出
GPIOB->CRH=0X33333333; //PB8-15 上拉输出
GPIOB->ODR=0XFFFF; //全部输出高
return t;
}
//写寄存器
//LCD_Reg:寄存器编号
//LCD_RegValue:要写入的值
void LCD_WriteReg(u8 LCD_Reg,u16 LCD_RegValue)
{
LCD_WR_REG(LCD_Reg);
LCD_WR_DATA(LCD_RegValue);
}
//读寄存器
//LCD_Reg:寄存器编号
//返回值:读到的值
u16 LCD_ReadReg(u8 LCD_Reg)
{
LCD_WR_REG(LCD_Reg); //写入要读的寄存器号
return LCD_RD_DATA();
}
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
if(DeviceCode==0X9341)LCD_WR_REG(0x2C);//ILI9341是以0X2C开始的
else LCD_WR_REG(R34);
}
//LCD写GRAM
//RGB_Code:颜色值
void LCD_WriteRAM(u16 RGB_Code)
{
LCD_WR_DATA(RGB_Code);//写十六位GRAM
}
//从ILI93xx读出的数据为GBR格式,而我们写入的时候为RGB格式。
//通过该函数转换
//c:GBR格式的颜色值
//返回值:RGB格式的颜色值
u16 LCD_BGR2RGB(u16 c)
{
u16 r,g,b,rgb;
b=(c>>0)&0x1f;
g=(c>>5)&0x3f;
r=(c>>11)&0x1f;
rgb=(b<<11)+(g<<5)+(r<<0);
return(rgb);
}
//读取个某点的颜色值
//x:0~239
//y:0~319
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
u16 r,g,b;
if(x>=LCD_W||y>=LCD_H)return 0; //超过了范围,直接返回
LCD_SetCursor(x,y);
if(DeviceCode==0X9341)LCD_WR_REG(0X2E); //ILI9341发送读GRAM指令
else LCD_WR_REG(R34); //其他IC发送读GRAM指令
GPIOB->CRL=0X88888888; //PB0-7 上拉输入
GPIOB->CRH=0X88888888; //PB8-15 上拉输入
GPIOB->ODR=0XFFFF; //全部输出高
#if LCD_FAST_IO==1 //快速IO
LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读GRAM时,第一次为假读)
LCD_RD_CLR;
delay_us(1);//延时1us
LCD_RD_SET;
//dummy READ
LCD_RD_CLR;
delay_us(1);//延时1us
LCD_RD_SET;
r=DATAIN;
if(DeviceCode==0X9341)
{
LCD_RD_CLR;
LCD_RD_SET;
b=DATAIN;//读取蓝色值
g=r&0XFF;//对于9341,第一次读取的是RG的值,R在前,G在后,各占8位
g<<=8;
}
LCD_CS_SET;
#else
LCD_RS=1;
LCD_CS=0;
//读取数据(读GRAM时,需要读2次)
LCD_RD=0;
LCD_RD=1;
//dummy READ
LCD_RD=0;
LCD_RD=1;
r=DATAIN;
if(DeviceCode==0X9341)
{
LCD_RD=0;
LCD_RD=1;
b=DATAIN;//读取蓝色值
g=r&0XFF;//对于9341,第一次读取的是RG的值,R在前,G在后,各占8位
g<<=8;
}
LCD_CS=1;
#endif
GPIOB->CRL=0X33333333; //PB0-7 上拉输出
GPIOB->CRH=0X33333333; //PB8-15 上拉输出
GPIOB->ODR=0XFFFF; //全部输出高
if(DeviceCode==0X9325||DeviceCode==0X4535||DeviceCode==0X4531||DeviceCode==0X8989||DeviceCode==0XB505)return r; //这几种IC直接返回颜色值
else if(DeviceCode==0X9341)return (((r>>11)<<11)|((g>>10)<<5)|(b>>11)); //ILI9341需要公式转换一下
else return LCD_BGR2RGB(r); //其他IC
}
//LCD开启显示
void LCD_DisplayOn(void)
{
if(DeviceCode==0X9341)LCD_WR_REG(0X29); //开启显示
else LCD_WriteReg(R7,0x0173); //开启显示
}
//LCD关闭显示
void LCD_DisplayOff(void)
{
if(DeviceCode==0X9341)LCD_WR_REG(0X28); //关闭显示
else LCD_WriteReg(R7, 0x0);//关闭显示
}
//设置光标位置
//Xpos:横坐标
//Ypos:纵坐标
__inline void LCD_SetCursor(u16 Xpos, u16 Ypos)
{
#if USE_HORIZONTAL==1
if(DeviceCode==0X8989)
{
Xpos=319-Xpos;
LCD_WriteReg(0X4E, Ypos);
LCD_WriteReg(0X4F, Xpos);
}else if(DeviceCode==0X9341)//9341,设置坐标
{
LCD_WR_REG(0x2B);
LCD_WR_DATA(Ypos>>8);
LCD_WR_DATA(Ypos&0XFF);
LCD_WR_REG(0x2A);
LCD_WR_DATA(Xpos>>8);
LCD_WR_DATA(Xpos&0XFF);
}else
{
Xpos=319-Xpos;
LCD_WriteReg(R32,Ypos);
LCD_WriteReg(R33,Xpos);
}
#else
if(DeviceCode==0X8989)
{
LCD_WriteReg(0X4E, Xpos);
LCD_WriteReg(0X4F, Ypos);
}else if(DeviceCode==0X9341)
{
LCD_WR_REG(0x2A);
LCD_WR_DATA(Xpos>>8);
LCD_WR_DATA(Xpos&0XFF);
LCD_WR_REG(0x2B);
LCD_WR_DATA(Ypos>>8);
LCD_WR_DATA(Ypos&0XFF);
}else
{
LCD_WriteReg(R32, Xpos);
LCD_WriteReg(R33, Ypos);
}
#endif
}
//设置LCD的自动扫描方向
//注意:其他函数可能会受到此函数设置的影响(尤其是9341这个奇葩),所以,
//一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
//0~7:代表8个方向(具体定义见lcd.h)
//9320/9325/9328/4531/4535/1505/b505/8989/5408/9341等IC已经实际测试
void LCD_Scan_Dir(u8 dir)
{
u16 regval=0;
u8 dirreg=0;
#if USE_HORIZONTAL//使用横屏
switch(dir)//方向转换
{
case 0:dir=6;break;
case 1:dir=7;break;
case 2:dir=4;break;
case 3:dir=5;break;
case 4:dir=1;break;
case 5:dir=0;break;
case 6:dir=3;break;
case 7:dir=2;break;
}
#endif
if(DeviceCode==0x9341)//9341,很特殊
{
switch(dir)
{
case L2R_U2D://从左到右,从上到下
regval|=(0<<7)|(0<<6)|(0<<5);
break;
case L2R_D2U://从左到右,从下到上
regval|=(1<<7)|(0<<6)|(0<<5);
break;
case R2L_U2D://从右到左,从上到下
regval|=(0<<7)|(1<<6)|(0<<5);
break;
case R2L_D2U://从右到左,从下到上
regval|=(1<<7)|(1<<6)|(0<<5);
break;
case U2D_L2R://从上到下,从左到右
regval|=(0<<7)|(0<<6)|(1<<5);
break;
case U2D_R2L://从上到下,从右到左
regval|=(0<<7)|(1<<6)|(1<<5);
break;
case D2U_L2R://从下到上,从左到右
regval|=(1<<7)|(0<<6)|(1<<5);
break;
case D2U_R2L://从下到上,从右到左
regval|=(1<<7)|(1<<6)|(1<<5);
break;
}
dirreg=0X36;
regval|=0X08;//BGR
LCD_WriteReg(dirreg,regval);
if(regval&0X20)
{
LCD_WR_REG(0x2A);
LCD_WR_DATA(0);LCD_WR_DATA(0);
LCD_WR_DATA(319>>8);LCD_WR_DATA(319&0XFF);
LCD_WR_REG(0x2B)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于STM32室内温度报警控制系统设计 (268个子文件)
remote.__i 664B
pelunarcal.__i 656B
ps2.__i 649B
pengtouc.__i 637B
perelay.__i 635B
ds18b20.__i 635B
jpegdecode.__i 635B
explainapp.__i 634B
ili93xx.__i 631B
adjustapp.__i 630B
datatable.__i 630B
pebeep.__i 630B
mmc_sd.__i 626B
sysfile.__i 626B
tcontrol.__i 626B
24cxx.__i 625B
pertc.__i 625B
flash.__i 625B
myiic.__i 625B
timer.__i 625B
usart.__i 623B
delay.__i 623B
fontupd.__i 623B
mooncal.__i 622B
settime.__i 622B
untogb.__i 619B
pegui.__i 616B
key.__i 615B
spi.__i 615B
led.__i 615B
pepid.__i 614B
alarm.__i 614B
sys.__i 613B
text.__i 611B
fat.__i 606B
test.__i 603B
pengrtc.__i 554B
24l01.__i 543B
rtc.__i 539B
wkup.__i 535B
dma.__i 534B
TEST.axf 223KB
TEST_uvopt.bak 94KB
TEST_uvproj.bak 21KB
TEST.Uv2.bak 4KB
TEST.opt.bak 4KB
ILI93xx.c 42KB
jpegdecode.c 31KB
FAT.C 20KB
TControl.c 18KB
peLunarCal.c 10KB
MMC_SD.C 9KB
flash.c 9KB
peRTC.c 8KB
PeGUI.c 7KB
sys.c 7KB
fontupd.c 7KB
TouchAdjust.c 6KB
SetTime.c 5KB
text.c 5KB
MoonCal.c 4KB
24cxx.c 4KB
test.c 4KB
pengTouc.c 4KB
ds18b20.c 3KB
usart.c 3KB
adc.c 3KB
myiic.c 3KB
AdjustApp.c 3KB
timer.c 3KB
spi.c 2KB
delay.c 2KB
untogb.c 2KB
key.c 2KB
pePID.c 714B
led.c 490B
peRelay.c 357B
peBeep.c 317B
sysfile.c 307B
DataTable.c 145B
ExplainApp.c 59B
Alarm.c 24B
ili93xx.crf 197KB
test.crf 193KB
tcontrol.crf 193KB
settime.crf 190KB
mooncal.crf 189KB
adjustapp.crf 188KB
pertc.crf 187KB
pengrtc.crf 186KB
pepid.crf 186KB
pegui.crf 185KB
jpegdecode.crf 185KB
datatable.crf 185KB
pelunarcal.crf 185KB
alarm.crf 184KB
fontupd.crf 176KB
touch.crf 174KB
fat.crf 167KB
flash.crf 165KB
共 268 条
- 1
- 2
- 3
PeOS
- 粉丝: 192
- 资源: 33
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- IMG_20240425_190941.jpg
- 基于stm32的pid控制算法附带串口控制台
- 实验项目一:线性表(模板 ).docx
- 基于LM317A设计交流220V输入可调5V-12V直流输出稳压电源电路multisim10仿真源文件.zip
- Screenshot_2024-04-25-17-04-18-55_2332cb9b27b851b548ba47a91682926c.jpg
- -基于AVR单片机的LNG加液机控制器设计.pdf
- ThePowerOfNow-EckhartTolle.mobi
- BLOCK_TYPE_HEARTBEAT_D70A3465D4EE4E9_046141_dump_1st.dmp
- 项目方法测试调用接口工具
- studyupdate
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页