资源描述
先介绍ILI9320的几个重要命令:
R0,这个命令有两个功能,如果对它写,则最低位为OSC,用于开启和关闭振荡器。而如果对它读操作,则返回的是控制器的型号。这个命令最大的功能是通过读它可以得到控制器的型号,而我们的代码知道了控制器的型号之后,可以针对不同型号的控制器,进行不同的初始化。因为93xx系列的初始化,其实都比较类似,我们完全可以用一个代码兼容好几个控制器。
R3,入口模式命令。我们重点关注的是I/D0、I/D1、AM这三个位,因为这三个位控制了屏幕的显示方向。
AM:控制GRAM更新方向。当AM=0的时候,地址以行方向更新。当AM=1的时候,地址以列方向更新。
I/D[1:0]:当更新一个数据之后,根据这两个位的设置来控制地址计数器自动增加/减少1,其关系如下:
通过这几个位置的设置,我们就可以控制屏幕的显示方向了。
R7,显示控制命令。该命令CL位用来控制是8位彩色,还是26万色。为0时26万色,为1时8位色。D1、D0、BASEE这个三个位用来控制显示开关与否的。当全部设置为1的时候开启显示,全为0是关闭。我们一般通过该命令的设置来开启或关闭显示器,以降低功耗。
R32,R33,设置GRAM的行地址和列地址。R32用于设置列地址(X坐标,0~239),R33用于设置行地址(Y坐标,0~319)。当我们要在某个指定点写入一个颜色的时候,先通过这两个命令设置到改点,然后写入颜色值就可以了。
R34,写数据到GRAM命令,当写了这个命令之后,地址计数器才会自动的增加和减少。该命令是我们要介绍的这一组命令里面唯一的单个操作的命令,只需要写入该值就可以了,其他的都是要先写入命令编号,然后写入操作数。
R80~R83,行列GRAM地址位置设置。这几个命令用于设定你显示区域的大小,我们整个屏的大小为240*320,但是有时候我们只需要在其中的一部分区域写入数据,如果先用写坐标,后写数据这样的方式来实现,则速度大打折扣。此时我们就可以通过这几个命令,在其中开辟一个区域,然后不停的丢数据,地址计数器就会根据R3的设置自动增加/减少,这样就不需要频繁的写地址了,大大提高了刷新的速度。
通过以上介绍,我们可以得出TFT-lcd显示需要的相关设置步骤如下:
(1) 设置单片机(STM32)与TFT-LCD模块相连的IO口
这一步,先将我们与TFT-LCD模块相连的IO口设置为输出,具体使用哪些IO口,这里需要根据连接电路以及TFT-LCD模块的设置来确定;
(2) 初始化TFT-LCD模块
通过向TFT-LCD写入一系列的设置,来启动TFT-LCD的显示,为后续显示字符和数字做准备;
(3) 通过函数将字符和数字显示到TFT-LCD模块上
这里就是通过我们设计的程序,将要显示的字符送到TFT-LCD模块就可以了。
#include "lcd.h"
#include "fonts.h"
static vu16 TextColor = 0x0000, BackColor = 0xFFFF;
void Delay(int n)
{
unsigned int i,j;
for (i = 0;i<n;++i)
for(j=0;j<3000;++j);
}
//LCD寄存器初始化
#define lcm_mdelay(X) Delay(X)
void lcd_reg_init( void)
{
LCD_WriteReg(0x0000,0x0001);
lcm_mdelay(1000); //at least 100ms
LCD_WriteReg(0x0001,0x0000); // set SS and SM bit
//LCD_CtrlWrite(0x0003,0x1030); // set GRAM write direction and BGR=1.
LCD_WriteReg(0x0010,0x1790);
LCD_WriteReg(0x0060,0x2700);
LCD_WriteReg(0x0061,0x0001);
LCD_WriteReg(0x0046,0x0002);
LCD_WriteReg(0x0013,0x8010);
LCD_WriteReg(0x0012,0x80fe);
LCD_WriteReg(0x0002,0x0500);
LCD_WriteReg(0x0003,0x1030);
LCD_WriteReg(0x0030,0x0303);
LCD_WriteReg(0x0031,0x0303);
LCD_WriteReg(0x0032,0x0303);
LCD_WriteReg(0x0033,0x0300);
LCD_WriteReg(0x0034,0x0003);
LCD_WriteReg(0x0035,0x0303);
LCD_WriteReg(0x0036,0x0014);
LCD_WriteReg(0x0037,0x0303);
LCD_WriteReg(0x0038,0x0303);
LCD_WriteReg(0x0039,0x0303);
LCD_WriteReg(0x003a,0x0300);
LCD_WriteReg(0x003b,0x0003);
LCD_WriteReg(0x003c,0x0303);
LCD_WriteReg(0x003d,0x1400);
LCD_WriteReg(0x0092,0x0200);
LCD_WriteReg(0x0093,0x0303);
LCD_WriteReg(0x0090,0x080d);
LCD_WriteReg(0x0003,0x1018); // set GRAM write direction and BGR=1.
LCD_WriteReg(0x0007,0x0173);
}
//LCD初始化
void STM3210B_LCD_Init(void)
{
vu16 dummy = 0;
LCD_CtrlLinesConfig();
lcd_reg_init();
dummy = LCD_ReadReg(0);
}
//设置文字颜色
void LCD_SetTextColor(vu16 Color)
{
TextColor = Color;
}
//设置背景色
void LCD_SetBackColor(vu16 Color)
{
BackColor = Color;
}
//清除行,Line:0-9
void LCD_ClearLine(u8 Line)
{
LCD_DisplayStringLine(Line, " ");
}
//LCD清屏
void LCD_Clear(u16 Color)
{
u32 index = 0;
LCD_SetCursor(0x00, 0x0000);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(index = 0; index < 76800; index++)
{
LCD_WriteRAM(Color);
}
}
//LCD光标设置
void LCD_SetCursor(u8 Xpos, u16 Ypos)
{
LCD_WriteReg(R32, Xpos);
LCD_WriteReg(R33, Ypos);
}
//在LCD指定位置上显示
void LCD_DrawChar(u8 Xpos, u16 Ypos, uc16 *c)
{
u32 index = 0, i = 0;
u8 Xaddress = 0;
Xaddress = Xpos;
LCD_SetCursor(Xaddress, Ypos);
for(index = 0; index < 24; index++)
{
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(i = 0; i < 16; i++)
{
if((c[index] & (1 << i)) == 0x00)
{
LCD_WriteRAM(BackColor);
}
else
{
LCD_WriteRAM(TextColor);
}
}
Xaddress++;
LCD_SetCursor(Xaddress, Ypos);
}
}
//显示一个字符
void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii)
{
Ascii -= 32;
LCD_DrawChar(Line, Column, &ASCII_Table[Ascii * 24]);
}
//LCD显示字符串
void LCD_DisplayStringLine(u8 Line, u8 *ptr)
{
u32 i = 0;
u16 refcolumn = 319;//319;
while ((*ptr != 0) && (i < 20)) // 20
{
/* Display one character on LCD */
LCD_DisplayChar(Line, refcolumn, *ptr);
/* Decrement the column position by 16 */
refcolumn -= 16;
/* Point on the next character */
ptr++;
/* Increment the character counter */
i++;
}
}
//设置LCD显示模式
void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width)
{
if(Xpos >= Height)
{
LCD_WriteReg(R80, (Xpos - Height + 1));
}
else
{
LCD_WriteReg(R80, 0);
}
LCD_WriteReg(R81, Xpos);
if(Ypos >= Width)
{
LCD_WriteReg(R82, (Ypos - Width + 1));
}
else
{
LCD_WriteReg(R82, 0);
}
/* Vertical GRAM End Address */
LCD_WriteReg(R83, Ypos);
LCD_SetCursor(Xpos, Ypos);
}
//LCD窗口模式配置
void LCD_WindowModeDisable(void)
{
LCD_SetDisplayWindow(239, 0x13F, 240, 320);
LCD_WriteReg(R3, 0x1018);
}
//LCD画线
void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction)
{
u32 i = 0;
LCD_SetCursor(Xpos, Ypos);
if(Direction == Horizontal)
{
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(i = 0; i < Length; i++)
{
LCD_WriteRAM(TextColor);
}
}
else
{
for(i = 0; i < Length; i++)
{
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
Xpos++;
LCD_SetCursor(Xpos, Ypos);
}
}
}
//LCD画矩形
void LCD_DrawRect(u8 Xpos, u16 Ypos, u8 Height, u16 Width)
{
LCD_DrawLine(Xpos, Ypos, Width, Horizontal);
LCD_DrawLine((Xpos + Height), Ypos, Width, Horizontal);
LCD_DrawLine(Xpos, Ypos, Height, Vertical);
LCD_DrawLine(Xpos, (Ypos - Width + 1), Height, Vertical);
}
//LCD 画圆
void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius)
{
s32 D;
u32 CurX;
u32 CurY;
D = 3 - (Radius << 1);
CurX = 0;
CurY = Radius;
while (CurX <= CurY)
{
LCD_SetCursor(Xpos + CurX, Ypos + CurY);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos + CurX, Ypos - CurY);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos - CurX, Ypos + CurY);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos - CurX, Ypos - CurY);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos + CurY, Ypos + CurX);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos + CurY, Ypos - CurX);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos - CurY, Ypos + CurX);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos - CurY, Ypos - CurX);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
if (D < 0)
{
D += (CurX << 2) + 6;
}
else
{
D += ((CurX - CurY) << 2) + 10;
CurY--;
}
CurX++;
}
}
//显示灰阶图片(Monocolor Picture)
void LCD_DrawMonoPict(uc32 *Pict)
{
u32 index = 0, i = 0;
LCD_SetCursor(0, 319);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(index = 0; index < 2400; index++)
{
for(i = 0; i < 32; i++)
{
if((Pict[index] & (1 << i)) == 0x00)
{
LCD_WriteRAM(BackColor);
}
else
{
LCD_WriteRAM(TextColor);
}
}
}
}
//显示位图(BMP Picture)
void LCD_WriteBMP(u32 BmpAddress)
{
u32 index = 0, size = 0;
size = *(vu16 *) (BmpAddress + 2);
size |= (*(vu16 *) (BmpAddress + 4)) << 16;
index = *(vu16 *) (BmpAddress + 10);
index |= (*(vu16 *) (BmpAddress + 12)) << 16;
size = (size - index)/2;
BmpAddress += index;
LCD_WriteReg(R3, 0x1008);
LCD_WriteRAM_Prepare();
for(index = 0; index < size; index++)
{
LCD_WriteRAM(*(vu16 *)BmpAddress);
BmpAddress += 2;
}
LCD_WriteReg(R3, 0x1018);
}
//写LCD寄存器
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
GPIOB->BRR = 0x0200; //LCD_NCS_LOW();
GPIOB->BRR = 0x0100; //LCD_RS_LOW();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOC->ODR = LCD_Reg; //GPIO_Write(LCD_DataPort,LCD_Reg);
GPIOB->BRR = 0x0020; //LCD_NWR_LOW();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOB->BSRR = 0x0100; //LCD_RS_HIGH();
GPIOC->ODR = LCD_RegValue; //GPIO_Write(LCD_DataPort,LCD_RegValue);
GPIOB->BRR = 0x0020; //LCD_NWR_LOW();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOB->BSRR = 0x0100; //LCD_RS_HIGH();
}
//读LCD寄存器
u16 LCD_ReadReg(u8 LCD_Reg)
{
u16 temp;
GPIOB->BRR = 0x0200; //LCD_NCS_LOW();
GPIOB->BRR = 0x0100; //LCD_RS_LOW();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOC->ODR = LCD_Reg; //GPIO_Write(LCD_DataPort,LCD_Reg);
GPIOB->BRR = 0x0020; //LCD_NWR_LOW();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOB->BSRR = 0x0100; //LCD_RS_HIGH();
LCD_BusIn();
GPIOB->BRR = 0x0400; //LCD_NRD_LOW();
temp = GPIOC->IDR; //temp=GPIO_ReadInputData(LCD_DataPort);
GPIOB->BSRR = 0x0400; //LCD_NRD_HIGH();
LCD_BusOut();
GPIOB->BSRR = 0x0200; //LCD_NCS_HIGH();
return temp;
}
//写LCD-RAM预处理
void LCD_WriteRAM_Prepare(void)
{
GPIOB->BRR = 0x0200; //LCD_NCS_LOW();
GPIOB->BRR = 0x0100; //LCD_RS_LOW();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOC->ODR = R34; //GPIO_Write(LCD_DataPort,R34);
GPIOB->BRR = 0x0020; //LCD_NWR_LOW();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOB->BSRR = 0x0100; //LCD_RS_HIGH();
GPIOB->BSRR = 0x0200; //LCD_NCS_HIGH();
}
//写LCD-RAM
void LCD_WriteRAM(u16 RGB_Code)
{
GPIOB->BRR = 0x0200; //LCD_NCS_LOW();
GPIOB->BSRR = 0x0100; //LCD_RS_HIGH();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOC->ODR = RGB_Code; //GPIO_Write(LCD_DataPort,RGB_Code);
GPIOB->BRR = 0x0020; //LCD_NWR_LOW();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOB->BSRR = 0x0100; //LCD_RS_HIGH();
GPIOB->BSRR = 0x0200; //LCD_NCS_HIGH();
}
//读取LCD-RAM
u16 LCD_ReadRAM(void)
{
u16 temp;
GPIOB->BRR = 0x0200; //LCD_NCS_LOW();
GPIOB->BRR = 0x0100; //LCD_RS_LOW();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOC->ODR = R34; //GPIO_Write(LCD_DataPort,R34);
GPIOB->BRR = 0x0020; //LCD_NWR_LOW();
GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH();
GPIOB->BSRR = 0x0100; //LCD_RS_HIGH();
LCD_BusIn();
GPIOB->BRR = 0x0400; //LCD_NRD_LOW();
temp = GPIOC->IDR; //temp=GPIO_ReadInputData(LCD_DataPort);
GPIOB->BSRR = 0x0400; //LCD_NRD_HIGH();
LCD_BusOut();
GPIOB->BSRR = 0x0200; //LCD_NCS_HIGH();
return temp;
}
//LCD上电
void LCD_PowerOn(void)
{
LCD_WriteReg(R16, 0x0000);
LCD_WriteReg(R17, 0x0000);
LCD_WriteReg(R18, 0x0000);
LCD_WriteReg(R19, 0x0000);
Delay(20);
LCD_WriteReg(R16, 0x17B0);
LCD_WriteReg(R17, 0x0137);
Delay(5);
LCD_WriteReg(R18, 0x0139);
Delay(5);
LCD_WriteReg(R19, 0x1d00);
LCD_WriteReg(R41, 0x0013);
Delay(5);
LCD_WriteReg(R7, 0x0173);
}
//开启LCD显示
void LCD_DisplayOn(void)
{
LCD_WriteReg(R7, 0x0173);
}
//关闭LCD显示
void LCD_DisplayOff(void)
{
LCD_WriteReg(R7, 0x0);
}
//LCD控制引脚配置
void LCD_CtrlLinesConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
LCD_BusOut();
GPIOB->BSRR |= 0x0620;
}
//数据总线输入配置
void LCD_BusIn(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//数据总线输出配置
void LCD_BusOut(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//
void LCD_DrawPicture(const u8* picture)
{
int index;
LCD_SetCursor(0x00, 0x0000);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(index = 0; index < 76800; index++)
{
LCD_WriteRAM(picture[2*index+1]<<8|picture[2*index]);
}
}
============================================================
#ifndef __LCD_H
#define __LCD_H
#include "stm32f10x.h"
/* LCD Registers */
#define R0 0x00
#define R1 0x01
#define R2 0x02
#define R3 0x03
#define R4 0x04
#define R5 0x05
#define R6 0x06
#define R7 0x07
#define R8 0x08
#define R9 0x09
#define R10 0x0A
#define R12 0x0C
#define R13 0x0D
#define R14 0x0E
#define R15 0x0F
#define R16 0x10
#define R17 0x11
#define R18 0x12
#define R19 0x13
#define R20 0x14
#define R21 0x15
#define R22 0x16
#define R23 0x17
#define R24 0x18
#define R25 0x19
#define R26 0x1A
#define R27 0x1B
#define R28 0x1C
#define R29 0x1D
#define R30 0x1E
#define R31 0x1F
#define R32 0x20
#define R33 0x21
#define R34 0x22
#define R36 0x24
#define R37 0x25
#define R40 0x28
#define R41 0x29
#define R43 0x2B
#define R45 0x2D
#define R48 0x30
#define R49 0x31
#define R50 0x32
#define R51 0x33
#define R52 0x34
#define R53 0x35
#define R54 0x36
#define R55 0x37
#define R56 0x38
#define R57 0x39
#define R59 0x3B
#define R60 0x3C
#define R61 0x3D
#define R62 0x3E
#define R63 0x3F
#define R64 0x40
#define R65 0x41
#define R66 0x42
#define R67 0x43
#define R68 0x44
#define R69 0x45
#define R70 0x46
#define R71 0x47
#define R72 0x48
#define R73 0x49
#define R74 0x4A
#define R75 0x4B
#define R76 0x4C
#define R77 0x4D
#define R78 0x4E
#define R79 0x4F
#define R80 0x50
#define R81 0x51
#define R82 0x52
#define R83 0x53
#define R96
展开阅读全文