查看: 411|回复: 2
打印 上一主题 下一主题

STM32寄存器之TFT

[复制链接] qrcode

24

主题

24

帖子

74

积分

注册会员

Rank: 2

积分
74
楼主
跳转到指定楼层
发表于 2016-1-14 12:38 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

源代码:

lcd.h:

#ifndef __LCD_H
#define __LCD_H

#include "stdlib.h"
#include<STM32f10x.h>
#include
#include //所有STM32外设驱动
//#define u16 unsigned int
//#define u8  unsigned char
//#define u32 unsigned long int

typedef struct
{
u16 width;
u16 height;
u16 id;
u8 dir;
u16 wramcmd;
u16 setxcmd;
u16 setycmd;
}_lcd_dev;
extern _lcd_dev lcddev;
extern u16 POINT_COLOR;
extern u16 BACK_COLOR;

#define LCD_LED PCout(10)
#define LCD_CS_SET GPIOC->BSRR=1<<9
#define LCD_RS_SET GPIOC->BSRR=1<<8
#define LCD_WR_SET GPIOC->BSRR=1<<7
#define LCD_RD_SET GPIOC->BSRR=1<<6
#define LCD_CS_CLR GPIOC->BRR=1<<9
#define LCD_RS_CLR GPIOC->BRR=1<<8
#define LCD_WR_CLR GPIOC->BRR=1<<7
#define LCD_RD_CLR GPIOC->BRR=1<<6

#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_SSD_BackLightSet(u8 pwm); //SSD1963 背光控制
void LCD_Scan_Dir(u8 dir); //设置屏扫描方向
void LCD_Display_Dir(u8 dir); //设置屏幕显示方向
void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height); //设置窗口
void JTAG_Set(u8 mode);
void delay_ms(u32 nms);
//写数据函数
#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) 

//JTAG模式设置定义
#define JTAG_SWD_DISABLE   0X02
#define SWD_ENABLE         0X01
#define JTAG_SWD_ENABLE    0X00

#endif













回复

使用道具 举报

0

主题

89

帖子

18

积分

新手上路

Rank: 1

积分
18
沙发
发表于 2016-1-14 12:38 PM | 只看该作者

lcd.c

#include "lcd.h"
#include "stdlib.h"
#include "font.h" 


//LCD的画笔颜色和背景色   
u16 POINT_COLOR=0x0000; //画笔颜色
u16 BACK_COLOR=0xFFFF;  //背景色 

//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;

void LCD_WR_REG(u16 data)
{
LCD_RS_CLR;
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
void delay_us(u32 nus)
{
u32 i,j;
for(i=nus;i>0;i--)
for(j=8;j>0;j--);
}
void delay_ms(u32 nms)
{
u32 i;
for(i=nms;i>0;i--)
delay_us(1000);
}
u16 LCD_RD_DATA(void)
{
u16 t;
GPIOB->CRL=0X88888888;
GPIOB->CRH=0X88888888;
GPIOB->ODR=0X0000;
LCD_RS_SET;
LCD_CS_CLR;
LCD_RD_CLR;
if(lcddev.id==0x8989) delay_us(2);
t=DATAIN;
LCD_RD_SET;
LCD_CS_SET;
GPIOB->CRL=0X33333333;
GPIOB->CRH=0X33333333;
GPIOB->ODR=0XFFFF;
return t;
}
void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)
{
LCD_WR_REG(LCD_Reg);
LCD_WR_DATA(LCD_RegValue);
}

u16 LCD_ReadReg(u16 LCD_Reg)
{
LCD_WR_REG(LCD_Reg);
return LCD_RD_DATA();
}
void LCD_SetCursor(u16 Xpos,u16 Ypos)
{
if(lcddev.id==0x9341||lcddev.id==0x5310)
{
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(Xpos>>8);
LCD_WR_DATA(Xpos&0xff);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(Ypos>>8);
LCD_WR_DATA(Ypos&0xff);
}
}
//写数据函数
//可以替代LCD_WR_DATAX宏,拿时间换空间.
//data:寄存器值
void LCD_WR_DATAX(u16 data)
{
LCD_RS_SET;
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
//从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);
}
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
LCD_WR_REG(lcddev.wramcmd);

//LCD写GRAM
//RGB_Code:颜色值
void LCD_WriteRAM(u16 RGB_Code)
{    
LCD_WR_DATA(RGB_Code);//写十六位GRAM
}
void LCD_DrawPoint(u16 x,u16 y)
{
LCD_SetCursor(x,y);
LCD_WriteRAM_Prepare();
LCD_WR_DATA(POINT_COLOR);
}
u16 LCD_ReadPoint(u16 x,u16 y)
{
u16 r,g,b;
LCD_SetCursor(x,y);
if(lcddev.id==0x9341||lcddev.id==0x6804||lcddev.id==0x5310)LCD_WR_REG(0X2E);
else if(lcddev.id==0x5510)LCD_WR_REG(0X2E00);
else LCD_WR_REG(0X22);
GPIOB->CRL=0X88888888;
GPIOB->CRH=0X88888888;
GPIOB->ODR=0XFFFF;
LCD_RS_SET;
LCD_CS_CLR;
LCD_RD_CLR;
delay_us(1);
LCD_RD_SET;
LCD_RD_CLR;
delay_us(1);
r=DATAIN;
LCD_RD_SET;
if(lcddev.id==0x9341||lcddev.id==0x5310||lcddev.id==0x5510)
{
LCD_RD_CLR;
b=DATAIN;
LCD_RD_SET;
g=r&0xff;
g<<=8;
}
LCD_CS_SET;
GPIOB->CRL=0x33333333;
GPIOB->CRH=0x33333333;
GPIOB->ODR=0XFFFF;
if(lcddev.id==0x9325||lcddev.id==0x4535||lcddev.id==0x4531||lcddev.id==0x8989||lcddev.id==0xb505)return r;
else if(lcddev.id==0x9341||lcddev.id==0x5310||lcddev.id==0x5510)
return (((r>>11)<<11)|((g>>10)<<5)|(b>>11));
else 
return LCD_BGR2RGB(r);
}
//快速画点
//x,y:坐标
//color:颜色
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
{   
if(lcddev.id==0X9341||lcddev.id==0X5310)
{
LCD_WR_REG(lcddev.setxcmd); 
LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);    
LCD_WR_REG(lcddev.setycmd); 
LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);  
}else if(lcddev.id==0X5510)
{
LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(x>>8);  
LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(x&0XFF);  
LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(y>>8);  
LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(y&0XFF); 
}else if(lcddev.id==0X1963)
{
if(lcddev.dir==0)x=lcddev.width-1-x;
LCD_WR_REG(lcddev.setxcmd); 
LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);
LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);
LCD_WR_REG(lcddev.setycmd); 
LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);
LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);
}else if(lcddev.id==0X6804)
{    
if(lcddev.dir==1)x=lcddev.width-1-x;//横屏时处理
LCD_WR_REG(lcddev.setxcmd); 
LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);  
LCD_WR_REG(lcddev.setycmd); 
LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);
}else
{
  if(lcddev.dir==1)x=lcddev.width-1-x;//横屏其实就是调转x,y坐标
LCD_WriteReg(lcddev.setxcmd,x);
LCD_WriteReg(lcddev.setycmd,y);
}
LCD_RS_CLR;
  LCD_CS_CLR; 
DATAOUT(lcddev.wramcmd);//写指令  
LCD_WR_CLR; 
LCD_WR_SET; 
  LCD_CS_SET; 
LCD_WR_DATA(color); //写数据
}
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{
u8 temp,t1,t;
u16 y0=y;
u8 csize=(size/8+((size%8)?1:0))*(size/2);
num=num-' ';
for(t=0;t {
if(size==12)temp=asc2_1206[num][t];
else if(size==16) temp=asc2_1608[num][t];
else if(size==24)temp=asc2_2412[num][t];
else return;
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);
temp<<=1;
y++;
if(x>=lcddev.width)return;
if((y-y0)==size)
{
y=y0;x++;
if(x>=lcddev.width)return;
break;
}
}
}
}
//设置LCD的自动扫描方向
//注意:其他函数可能会受到此函数设置的影响(尤其是9341/6804这两个奇葩),
//所以,一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
//dir:0~7,代表8个方向(具体定义见lcd.h)
//9320/9325/9328/4531/4535/1505/b505/5408/9341/5310/5510/1963等IC已经实际测试     
void LCD_Scan_Dir(u8 dir)
{
u16 regval=0;
u16 dirreg=0;
u16 temp;  
if((lcddev.dir==1&&lcddev.id!=0X6804&&lcddev.id!=0X1963)||(lcddev.dir==0&&lcddev.id==0X1963))//横屏时,对6804和1963不改变扫描方向!竖屏时1963改变方向
{   
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;     
}

if(lcddev.id==0x9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X5510||lcddev.id==0X1963)//9341/6804/5310/5510/1963,特殊处理
{
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;  
}
if(lcddev.id==0X5510)dirreg=0X3600;
else dirreg=0X36;
  if((lcddev.id!=0X5310)&&(lcddev.id!=0X5510)&&(lcddev.id!=0X1963))regval|=0X08;//5310/5510/1963不需要BGR   
if(lcddev.id==0X6804)regval|=0x02;//6804的BIT6和9341的反了   
LCD_WriteReg(dirreg,regval);
if(lcddev.id!=0X1963)//1963不做坐标处理
{
if(regval&0X20)
{
if(lcddev.width {
temp=lcddev.width;
lcddev.width=lcddev.height;
lcddev.height=temp;
}
}else  
{
if(lcddev.width>lcddev.height)//交换X,Y
{
temp=lcddev.width;
lcddev.width=lcddev.height;
lcddev.height=temp;
}
}  
}
if(lcddev.id==0X5510)
{
LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(0); 
LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(0); 
LCD_WR_REG(lcddev.setxcmd+2);LCD_WR_DATA((lcddev.width-1)>>8); 
LCD_WR_REG(lcddev.setxcmd+3);LCD_WR_DATA((lcddev.width-1)&0XFF); 
LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(0); 
LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(0); 
LCD_WR_REG(lcddev.setycmd+2);LCD_WR_DATA((lcddev.height-1)>>8); 
LCD_WR_REG(lcddev.setycmd+3);LCD_WR_DATA((lcddev.height-1)&0XFF);
}else
{
LCD_WR_REG(lcddev.setxcmd); 
LCD_WR_DATA(0);LCD_WR_DATA(0);
LCD_WR_DATA((lcddev.width-1)>>8);LCD_WR_DATA((lcddev.width-1)&0XFF);
LCD_WR_REG(lcddev.setycmd); 
LCD_WR_DATA(0);LCD_WR_DATA(0);
LCD_WR_DATA((lcddev.height-1)>>8);LCD_WR_DATA((lcddev.height-1)&0XFF);  
}
  }else 
{
switch(dir)
{
case L2R_U2D://从左到右,从上到下
regval|=(1<<5)|(1<<4)|(0<<3); 
break;
case L2R_D2U://从左到右,从下到上
regval|=(0<<5)|(1<<4)|(0<<3); 
break;
case R2L_U2D://从右到左,从上到下
regval|=(1<<5)|(0<<4)|(0<<3);
break;
case R2L_D2U://从右到左,从下到上
regval|=(0<<5)|(0<<4)|(0<<3); 
break;  
case U2D_L2R://从上到下,从左到右
regval|=(1<<5)|(1<<4)|(1<<3); 
break;
case U2D_R2L://从上到下,从右到左
regval|=(1<<5)|(0<<4)|(1<<3); 
break;
case D2U_L2R://从下到上,从左到右
regval|=(0<<5)|(1<<4)|(1<<3); 
break;
case D2U_R2L://从下到上,从右到左
regval|=(0<<5)|(0<<4)|(1<<3); 
break;  

dirreg=0X03;
regval|=1<<12; 
LCD_WriteReg(dirreg,regval);
}
}     
//设置LCD显示方向
//dir:0,竖屏;1,横屏
void LCD_Display_Dir(u8 dir)
{
if(dir==0) //竖屏
{
lcddev.dir=0; //竖屏
lcddev.width=240;
lcddev.height=320;
if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310)
{
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;    
if(lcddev.id==0X6804||lcddev.id==0X5310)
{
lcddev.width=320;
lcddev.height=480;
}
}else if(lcddev.id==0x5510)
{
lcddev.wramcmd=0X2C00;
lcddev.setxcmd=0X2A00;
lcddev.setycmd=0X2B00; 
lcddev.width=480;
lcddev.height=800;
}else if(lcddev.id==0X1963)
{
lcddev.wramcmd=0X2C; //设置写入GRAM的指令 
lcddev.setxcmd=0X2B; //设置写X坐标指令
lcddev.setycmd=0X2A; //设置写Y坐标指令
lcddev.width=480; //设置宽度480
lcddev.height=800; //设置高度800  
}else
{
lcddev.wramcmd=0X22;
lcddev.setxcmd=0X20;
lcddev.setycmd=0X21;  
}
}else //横屏
{  
lcddev.dir=1; //横屏
lcddev.width=320;
lcddev.height=240;
if(lcddev.id==0X9341||lcddev.id==0X5310)
{
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;    
}else if(lcddev.id==0X6804)  
{
  lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2B;
lcddev.setycmd=0X2A; 
}else if(lcddev.id==0x5510)
{
lcddev.wramcmd=0X2C00;
lcddev.setxcmd=0X2A00;
lcddev.setycmd=0X2B00; 
lcddev.width=800;
lcddev.height=480;
}else if(lcddev.id==0X1963)
{
lcddev.wramcmd=0X2C; //设置写入GRAM的指令 
lcddev.setxcmd=0X2A; //设置写X坐标指令
lcddev.setycmd=0X2B; //设置写Y坐标指令
lcddev.width=800; //设置宽度800
lcddev.height=480; //设置高度480  
}else
{
lcddev.wramcmd=0X22;
lcddev.setxcmd=0X21;
lcddev.setycmd=0X20;  
}
if(lcddev.id==0X6804||lcddev.id==0X5310)
{  
lcddev.width=480;
lcddev.height=320;
}

LCD_Scan_Dir(DFT_SCAN_DIR); //默认扫描方向
}  
//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;   
//#define JTAG_SWD_DISABLE   0X02
//#define SWD_ENABLE         0X01
//#define JTAG_SWD_ENABLE    0X00  
void JTAG_Set(u8 mode)
{
u32 temp;
temp=mode;
temp<<=25;
RCC->APB2ENR|=1<<0;     //开启辅助时钟   
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->MAPR|=temp;       //设置jtag模式
}
//清屏函数
//color:要清屏的填充色
void LCD_Clear(u16 color)
{
u32 index=0;      
u32 totalpoint=lcddev.width;
totalpoint*=lcddev.height; //得到总点数
if((lcddev.id==0X6804)&&(lcddev.dir==1))//6804横屏的时候特殊处理  
{    
  lcddev.dir=0;  
  lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;  
LCD_SetCursor(0x00,0x0000); //设置光标位置  
  lcddev.dir=1;  
  lcddev.setxcmd=0X2B;
lcddev.setycmd=0X2A;    
  }else LCD_SetCursor(0x00,0x0000); //设置光标位置 
LCD_WriteRAM_Prepare();     //开始写入GRAM    
for(index=0;index }  
void LCD_Init(void)
{
RCC->APB2ENR|=1<<3;
RCC->APB2ENR|=1<<4;
RCC->APB2ENR|=1<<0;
JTAG_Set(SWD_ENABLE);
GPIOC->CRH&=0XFFFFF000;
GPIOC->CRH|=0X00000333;
GPIOC->CRL&=0X00FFFFFF;
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=0X07C0;
GPIOB->CRH=0X33333333;
GPIOB->CRL=0X33333333;
GPIOB->ODR=0XFFFF;
delay_ms(50);
LCD_WriteReg(0x0000,0x0001);
delay_ms(50);
lcddev.id=LCD_ReadReg(0x0000);
if(lcddev.id<0xff||lcddev.id==0xffff||lcddev.id==0x9300)
{
LCD_WR_REG(0XD3);
LCD_RD_DATA();
LCD_RD_DATA();
lcddev.id=LCD_RD_DATA();
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA();
if(lcddev.id!=0x9341)
{
LCD_WR_REG(0XBF);
LCD_RD_DATA();
LCD_RD_DATA();
LCD_RD_DATA();
lcddev.id=LCD_RD_DATA();
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA();
if(lcddev.id!=0x6804)
{
LCD_WR_REG(0XD4);
LCD_RD_DATA();
LCD_RD_DATA();

lcddev.id=LCD_RD_DATA();
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA();
if(lcddev.id!=0x5310)
{
LCD_WR_REG(0XDA00);
LCD_RD_DATA();
LCD_WR_REG(0XDB00);
lcddev.id=LCD_RD_DATA();
lcddev.id<<=8;
LCD_WR_REG(0XDC00);
lcddev.id|=LCD_RD_DATA();
if(lcddev.id==0x8000)lcddev.id=0x5510;
}
}
}
}
if(lcddev.id==0x9341)
{
LCD_WR_REG(0xCF);  
LCD_WR_DATAX(0x00); 
LCD_WR_DATAX(0xC1); 
LCD_WR_DATAX(0X30); 
LCD_WR_REG(0xED);  
LCD_WR_DATAX(0x64); 
LCD_WR_DATAX(0x03); 
LCD_WR_DATAX(0X12); 
LCD_WR_DATAX(0X81); 
LCD_WR_REG(0xE8);  
LCD_WR_DATAX(0x85); 
LCD_WR_DATAX(0x10); 
LCD_WR_DATAX(0x7A); 
LCD_WR_REG(0xCB);  
LCD_WR_DATAX(0x39); 
LCD_WR_DATAX(0x2C); 
LCD_WR_DATAX(0x00); 
LCD_WR_DATAX(0x34); 
LCD_WR_DATAX(0x02); 
LCD_WR_REG(0xF7);  
LCD_WR_DATAX(0x20); 
LCD_WR_REG(0xEA);  
LCD_WR_DATAX(0x00); 
LCD_WR_DATAX(0x00); 
LCD_WR_REG(0xC0);    //Power control 
LCD_WR_DATAX(0x1B);   //VRH[5:0] 
LCD_WR_REG(0xC1);    //Power control 
LCD_WR_DATAX(0x01);   //SAP[2:0];BT[3:0] 
LCD_WR_REG(0xC5);    //VCM control 
LCD_WR_DATAX(0x30); //3F
LCD_WR_DATAX(0x30); //3C
LCD_WR_REG(0xC7);    //VCM control2 
LCD_WR_DATAX(0XB7); 
LCD_WR_REG(0x36);    // Memory Access Control 
LCD_WR_DATAX(0x48); 
LCD_WR_REG(0x3A);   
LCD_WR_DATAX(0x55); 
LCD_WR_REG(0xB1);   
LCD_WR_DATAX(0x00);   
LCD_WR_DATAX(0x1A); 
LCD_WR_REG(0xB6);    // Display Function Control 
LCD_WR_DATAX(0x0A); 
LCD_WR_DATAX(0xA2); 
LCD_WR_REG(0xF2);    // 3Gamma Function Disable 
LCD_WR_DATAX(0x00); 
LCD_WR_REG(0x26);    //Gamma curve selected 
LCD_WR_DATAX(0x01); 
LCD_WR_REG(0xE0);    //Set Gamma 
LCD_WR_DATAX(0x0F); 
LCD_WR_DATAX(0x2A); 
LCD_WR_DATAX(0x28); 
LCD_WR_DATAX(0x08); 
LCD_WR_DATAX(0x0E); 
LCD_WR_DATAX(0x08); 
LCD_WR_DATAX(0x54); 
LCD_WR_DATAX(0XA9); 
LCD_WR_DATAX(0x43); 
LCD_WR_DATAX(0x0A); 
LCD_WR_DATAX(0x0F); 
LCD_WR_DATAX(0x00); 
LCD_WR_DATAX(0x00); 
LCD_WR_DATAX(0x00); 
LCD_WR_DATAX(0x00);  
LCD_WR_REG(0XE1);    //Set Gamma 
LCD_WR_DATAX(0x00); 
LCD_WR_DATAX(0x15); 
LCD_WR_DATAX(0x17); 
LCD_WR_DATAX(0x07); 
LCD_WR_DATAX(0x11); 
LCD_WR_DATAX(0x06); 
LCD_WR_DATAX(0x2B); 
LCD_WR_DATAX(0x56); 
LCD_WR_DATAX(0x3C); 
LCD_WR_DATAX(0x05); 
LCD_WR_DATAX(0x10); 
LCD_WR_DATAX(0x0F); 
LCD_WR_DATAX(0x3F); 
LCD_WR_DATAX(0x3F); 
LCD_WR_DATAX(0x0F); 
LCD_WR_REG(0x2B); 
LCD_WR_DATAX(0x00);
LCD_WR_DATAX(0x00);
LCD_WR_DATAX(0x01);
LCD_WR_DATAX(0x3f);
LCD_WR_REG(0x2A); 
LCD_WR_DATAX(0x00);
LCD_WR_DATAX(0x00);
LCD_WR_DATAX(0x00);
LCD_WR_DATAX(0xef);  
LCD_WR_REG(0x11); //Exit Sleep
delay_ms(120);
LCD_WR_REG(0x29); //display on
}
else if(lcddev.id==0x9325)//9325
{
LCD_WriteReg(0x00E5,0x78F0); 
LCD_WriteReg(0x0001,0x0100); 
LCD_WriteReg(0x0002,0x0700); 
LCD_WriteReg(0x0003,0x1030); 
LCD_WriteReg(0x0004,0x0000); 
LCD_WriteReg(0x0008,0x0202);  
LCD_WriteReg(0x0009,0x0000);
LCD_WriteReg(0x000A,0x0000); 
LCD_WriteReg(0x000C,0x0000); 
LCD_WriteReg(0x000D,0x0000);
LCD_WriteReg(0x000F,0x0000);
//power on sequence VGHVGL
LCD_WriteReg(0x0010,0x0000);   
LCD_WriteReg(0x0011,0x0007);  
LCD_WriteReg(0x0012,0x0000);  
LCD_WriteReg(0x0013,0x0000); 
LCD_WriteReg(0x0007,0x0000); 
//vgh 
LCD_WriteReg(0x0010,0x1690);   
LCD_WriteReg(0x0011,0x0227);
//delayms(100);
//vregiout 
LCD_WriteReg(0x0012,0x009D); //0x001b
//delayms(100); 
//vom amplitude
LCD_WriteReg(0x0013,0x1900);
//delayms(100); 
//vom H
LCD_WriteReg(0x0029,0x0025); 
LCD_WriteReg(0x002B,0x000D); 
//gamma
LCD_WriteReg(0x0030,0x0007);
LCD_WriteReg(0x0031,0x0303);
LCD_WriteReg(0x0032,0x0003);// 0006
LCD_WriteReg(0x0035,0x0206);
LCD_WriteReg(0x0036,0x0008);
LCD_WriteReg(0x0037,0x0406); 
LCD_WriteReg(0x0038,0x0304);//0200
LCD_WriteReg(0x0039,0x0007); 
LCD_WriteReg(0x003C,0x0602);// 0504
LCD_WriteReg(0x003D,0x0008); 
//ram
LCD_WriteReg(0x0050,0x0000); 
LCD_WriteReg(0x0051,0x00EF);
LCD_WriteReg(0x0052,0x0000); 
LCD_WriteReg(0x0053,0x013F);  
LCD_WriteReg(0x0060,0xA700); 
LCD_WriteReg(0x0061,0x0001); 
LCD_WriteReg(0x006A,0x0000); 
//
LCD_WriteReg(0x0080,0x0000); 
LCD_WriteReg(0x0081,0x0000); 
LCD_WriteReg(0x0082,0x0000); 
LCD_WriteReg(0x0083,0x0000); 
LCD_WriteReg(0x0084,0x0000); 
LCD_WriteReg(0x0085,0x0000); 
//
LCD_WriteReg(0x0090,0x0010); 
LCD_WriteReg(0x0092,0x0600); 

LCD_WriteReg(0x0007,0x0133);
LCD_WriteReg(0x00,0x0022);//
}else if(lcddev.id==0x9328)//ILI9328   OK  
{
  LCD_WriteReg(0x00EC,0x108F);// internal timeing      
  LCD_WriteReg(0x00EF,0x1234);// ADD        
//LCD_WriteReg(0x00e7,0x0010);      
        //LCD_WriteReg(0x0000,0x0001);//开启内部时钟
        LCD_WriteReg(0x0001,0x0100);     
        LCD_WriteReg(0x0002,0x0700);//电源开启                    
//LCD_WriteReg(0x0003,(1<<3)|(1<<4) ); //65K  RGB
//DRIVE TABLE(寄存器 03H)
//BIT3=AM BIT4:5=ID0:1
//AM ID0 ID1   FUNCATION
// 0  0   0   R->L D->U
// 1  0   0   D->U R->L
// 0  1   0   L->R D->U
// 1  1   0    D->U L->R
// 0  0   1   R->L U->D
// 1  0   1    U->D R->L
// 0  1   1    L->R U->D 正常就用这个.
// 1  1   1   U->D L->R
        LCD_WriteReg(0x0003,(1<<12)|(3<<4)|(0<<3) );//65K    
        LCD_WriteReg(0x0004,0x0000);                                   
        LCD_WriteReg(0x0008,0x0202);           
        LCD_WriteReg(0x0009,0x0000);         
        LCD_WriteReg(0x000a,0x0000);//display setting         
        LCD_WriteReg(0x000c,0x0001);//display setting          
        LCD_WriteReg(0x000d,0x0000);//0f3c          
        LCD_WriteReg(0x000f,0x0000);
//电源配置
        LCD_WriteReg(0x0010,0x0000);   
        LCD_WriteReg(0x0011,0x0007);
        LCD_WriteReg(0x0012,0x0000);                                                                 
        LCD_WriteReg(0x0013,0x0000);                 
      LCD_WriteReg(0x0007,0x0001);                 
        delay_ms(50); 
        LCD_WriteReg(0x0010,0x1490);   
        LCD_WriteReg(0x0011,0x0227);
        delay_ms(50); 
        LCD_WriteReg(0x0012,0x008A);                  
        delay_ms(50); 
        LCD_WriteReg(0x0013,0x1a00);   
        LCD_WriteReg(0x0029,0x0006);
        LCD_WriteReg(0x002b,0x000d);
        delay_ms(50); 
        LCD_WriteReg(0x0020,0x0000);                                                            
        LCD_WriteReg(0x0021,0x0000);           
delay_ms(50); 
//伽马校正
        LCD_WriteReg(0x0030,0x0000); 
        LCD_WriteReg(0x0031,0x0604);   
        LCD_WriteReg(0x0032,0x0305);
        LCD_WriteReg(0x0035,0x0000);
        LCD_WriteReg(0x0036,0x0C09); 
        LCD_WriteReg(0x0037,0x0204);
        LCD_WriteReg(0x0038,0x0301);        
        LCD_WriteReg(0x0039,0x0707);     
        LCD_WriteReg(0x003c,0x0000);
        LCD_WriteReg(0x003d,0x0a0a);
        delay_ms(50); 
        LCD_WriteReg(0x0050,0x0000); //水平GRAM起始位置 
        LCD_WriteReg(0x0051,0x00ef); //水平GRAM终止位置                    
        LCD_WriteReg(0x0052,0x0000); //垂直GRAM起始位置                    
        LCD_WriteReg(0x0053,0x013f); //垂直GRAM终止位置  
 
         LCD_WriteReg(0x0060,0xa700);        
        LCD_WriteReg(0x0061,0x0001); 
        LCD_WriteReg(0x006a,0x0000);
        LCD_WriteReg(0x0080,0x0000);
        LCD_WriteReg(0x0081,0x0000);
        LCD_WriteReg(0x0082,0x0000);
        LCD_WriteReg(0x0083,0x0000);
        LCD_WriteReg(0x0084,0x0000);
        LCD_WriteReg(0x0085,0x0000);
      
        LCD_WriteReg(0x0090,0x0010);     
        LCD_WriteReg(0x0092,0x0600);  
        //开启显示设置    
        LCD_WriteReg(0x0007,0x0133); 
}else if(lcddev.id==0x9320)//测试OK.
{
LCD_WriteReg(0x00,0x0000);
LCD_WriteReg(0x01,0x0100); //Driver Output Contral.
LCD_WriteReg(0x02,0x0700); //LCD Driver Waveform Contral.
LCD_WriteReg(0x03,0x1030);//Entry Mode Set.
//LCD_WriteReg(0x03,0x1018); //Entry Mode Set.

LCD_WriteReg(0x04,0x0000); //Scalling Contral.
LCD_WriteReg(0x08,0x0202); //Display Contral 2.(0x0207)
LCD_WriteReg(0x09,0x0000); //Display Contral 3.(0x0000)
LCD_WriteReg(0x0a,0x0000); //Frame Cycle Contal.(0x0000)
LCD_WriteReg(0x0c,(1<<0)); //Extern Display Interface Contral 1.(0x0000)
LCD_WriteReg(0x0d,0x0000); //Frame Maker Position.
LCD_WriteReg(0x0f,0x0000); //Extern Display Interface Contral 2.    
delay_ms(50); 
LCD_WriteReg(0x07,0x0101); //Display Contral.
delay_ms(50);  
LCD_WriteReg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); //Power Control 1.(0x16b0)
LCD_WriteReg(0x11,0x0007); //Power Control 2.(0x0001)
LCD_WriteReg(0x12,(1<<8)|(1<<4)|(0<<0)); //Power Control 3.(0x0138)
LCD_WriteReg(0x13,0x0b00); //Power Control 4.
LCD_WriteReg(0x29,0x0000); //Power Control 7.

LCD_WriteReg(0x2b,(1<<14)|(1<<4));    
LCD_WriteReg(0x50,0); //Set X Star
//水平GRAM终止位置Set X End.
LCD_WriteReg(0x51,239); //Set Y Star
LCD_WriteReg(0x52,0); //Set Y End.t.
LCD_WriteReg(0x53,319); //

LCD_WriteReg(0x60,0x2700); //Driver Output Control.
LCD_WriteReg(0x61,0x0001); //Driver Output Control.
LCD_WriteReg(0x6a,0x0000); //Vertical Srcoll Control.

LCD_WriteReg(0x80,0x0000); //Display Position? Partial Display 1.
LCD_WriteReg(0x81,0x0000); //RAM Address Start? Partial Display 1.
LCD_WriteReg(0x82,0x0000); //RAM Address End-Partial Display 1.
LCD_WriteReg(0x83,0x0000); //Displsy Position? Partial Display 2.
LCD_WriteReg(0x84,0x0000); //RAM Address Start? Partial Display 2.
LCD_WriteReg(0x85,0x0000); //RAM Address End? Partial Display 2.

LCD_WriteReg(0x90,(0<<7)|(16<<0)); //Frame Cycle Contral.(0x0013)
LCD_WriteReg(0x92,0x0000); //Panel Interface Contral 2.(0x0000)
LCD_WriteReg(0x93,0x0001); //Panel Interface Contral 3.
LCD_WriteReg(0x95,0x0110); //Frame Cycle Contral.(0x0110)
LCD_WriteReg(0x97,(0<<8)); //
LCD_WriteReg(0x98,0x0000); //Frame Cycle Contral.   
LCD_WriteReg(0x07,0x0173); //(0x0173)
}
LCD_Display_Dir(0);
//LCD_LED=1;
GPIOC->BSRR=1<<10; //点亮背光
LCD_Clear(WHITE);
}
//显示字符串
//x,y:起点坐标
//width,height:区域大小  
//size:字体大小
//*p:字符串起始地址  
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)
{         
u8 x0=x;
width+=x;
height+=y;
    while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
    {       
        if(x>=width){x=x0;y+=size;}
        if(y>=height)break;//退出
        LCD_ShowChar(x,y,*p,size,0);
        x+=size/2;
        p++;
    }  
}


回复 支持 反对

使用道具 举报

0

主题

87

帖子

22

积分

新手上路

Rank: 1

积分
22
板凳
发表于 2016-1-14 12:40 PM | 只看该作者

主程序:

int main(void)
{

u32 temp=0;
u8  x=0;
u8 lcd_id[12];
Stm32_Clock_Init(9);    //72MHz
uart_init(72,9600);
  delay(1000);
LED_Init();
KEY_Init();
LCD_Init();
POINT_COLOR=RED;
sprintf((char *)lcd_id,"LCD ID:%04X",lcddev.id);
while(1)
{
    switch(x)
{
case 0CD_Clear(WHITE);break;
case 1CD_Clear(BLACK);break;
case 2CD_Clear(BLUE);break;
case 3CD_Clear(RED);break;
case 4CD_Clear(MAGENTA);break;
case 5CD_Clear(GREEN);break;
case 6CD_Clear(CYAN);break;
case 7CD_Clear(YELLOW);break;
case 8CD_Clear(BRRED);break;
case 9CD_Clear(GRAY);break;
case 10CD_Clear(LGRAY);break;
case 11CD_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_ShowString(30,130,200,12,12,"2014/3/7");
x++;
if(x==12)x=0;
delay_ms(1000);
}
}


效果图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表