#include "stm32f10x.h"
#include "bsp_ili9341_lcd.h"
//#include "bsp_usart1.h"
extern void Lcd_Delay(__IO uint32_t nCount);
uint32_t n;
int main(void)
{
LCD_Init();
//Lcd_Delay(0xAFFf>>4);
LCD_Clear(0, 0, 240, 320, YELLOW);
LCD_DispChar(60, 60, 'A', RED);
LCD_DispStr(10, 10, (uint8_t *)"This is a lcd demo to display ascii", RED);
LCD_DispStr(40, 100, (uint8_t *)"count:", RED);
for( n=0; n<500000; n++ )
{
LCD_DisNum(100, 100, n, RED);
Lcd_Delay(0xAFFf>>4);
}
while( 1 );
}
#include "bsp_ili9341_lcd.h"
#include "ascii.h"
#define DEBUG_DELAY()
void Lcd_Delay(__IO uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
| RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOG
| RCC_APB2Periph_GPIOF , ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;
GPIO_Init(GPIOG, &GPIO_InitStructure);
/*LCD引脚,FSMC-D0~D15: PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/ *LCD控制线
PD4-FSMC_NOE :LCD-RD
* PD5-FSMC_NWE :LCD-WR
* PG12-FSMC_NE4 :LCD-CS
* PG0-FSMC_A10 :LCD-DC
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
}
void LCD_FSMC_Config(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
p.FSMC_AddressSetupTime = 0x02;
p.FSMC_AddressHoldTime = 0x00;
p.FSMC_DataSetupTime = 0x05;
p.FSMC_BusTurnAroundDuration = 0x00;
p.FSMC_CLKDivision = 0x00;
p.FSMC_DataLatency = 0x00;
p.FSMC_AccessMode = FSMC_AccessMode_B; // Ò»°ãʹÓÃģʽBÀ´¿ØÖÆLCD
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
//FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
}
void LCD_Rst(void)
{
GPIO_ResetBits(GPIOG, GPIO_Pin_11); //µÍµçƽ¸´Î»
Lcd_Delay(0xAFFf<<2);
GPIO_SetBits(GPIOG, GPIO_Pin_11);
Lcd_Delay(0xAFFf<<2);
}
void LCD_REG_Config(void)
{太长了,官方的应该没错}
void LCD_Init(void)
{
LCD_GPIO_Config();
LCD_FSMC_Config();
LCD_Rst();
LCD_REG_Config();
}
void LCD_Clear(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)
{
uint32_t i = 0;
/* column address control set */
LCD_ILI9341_CMD(0X2A);
LCD_ILI9341_Parameter( x >> 8 ); /* Ïȸß8λ£¬È»ºóµÍ8λ */
LCD_ILI9341_Parameter( x & 0xff ); /* column start */
LCD_ILI9341_Parameter( (x+width-1) >> 8 ); /* column end */
LCD_ILI9341_Parameter( (x+width-1) & 0xff );
/* page address control set */
LCD_ILI9341_CMD(0X2B);
LCD_ILI9341_Parameter( y >> 8 ); /* page start */
LCD_ILI9341_Parameter( y & 0xff );
LCD_ILI9341_Parameter( (y+height-1) >> 8); /* page end */
LCD_ILI9341_Parameter( (y+height-1) & 0xff);
/* memory write */
LCD_ILI9341_CMD(0x2c);
for( i=0; i < width*height; i++ )
{
LCD_WR_Data( color );
//Delay(0x0FFf);
}
}
void LCD_SetCursor(uint16_t x, uint16_t y)
{
LCD_ILI9341_CMD(0X2A);
LCD_ILI9341_Parameter(x>>8);
LCD_ILI9341_Parameter(x&0xff);
LCD_ILI9341_Parameter(x>>8);
LCD_ILI9341_Parameter(x&0xff);
LCD_ILI9341_CMD(0X2B);
LCD_ILI9341_Parameter(y>>8);
LCD_ILI9341_Parameter(y&0xff);
LCD_ILI9341_Parameter(y>>8);
LCD_ILI9341_Parameter(y&0xff);
}
void LCD_OpenWindow(uint16_t x, uint16_t y, uint16_t width, uint16_t height)
{
LCD_ILI9341_CMD(0X2A);
LCD_ILI9341_Parameter( x >> 8 );
LCD_ILI9341_Parameter( x & 0xff );
LCD_ILI9341_Parameter( (x+width-1) >> 8 );
LCD_ILI9341_Parameter( (x+width-1) & 0xff );
LCD_ILI9341_CMD(0X2B);
LCD_ILI9341_Parameter( y >> 8 );
LCD_ILI9341_Parameter( y & 0xff );
LCD_ILI9341_Parameter( (y+height-1) >> 8);
LCD_ILI9341_Parameter( (y+height-1) & 0xff);
}
void LCD_SetPoint(uint16_t x , uint16_t y , uint16_t color)
{
LCD_SetCursor(x, y);
LCD_ILI9341_CMD(0x2c);
LCD_WR_Data(color);
}
uint16_t LCD_RD_data(void)
{
uint16_t R=0, G=0, B=0 ;
R = *(__IO uint16_t *)Bank1_LCD_D; /*FIRST READ OUT DUMMY DATA*/
R = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT RED DATA */
B = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT BLACK DATA*/
G = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT GREEN DATA*/
return (((R>>11)<<11) | ((G>>10)<<5) | (B>>11));
}
uint16_t LCD_GetPoint(uint16_t x , uint16_t y)
{
uint16_t temp;
LCD_SetCursor(x, y);
LCD_ILI9341_CMD(0x2e);
temp=LCD_RD_data();
return (temp);
}
void LCD_DispChar(uint16_t x, uint16_t y, uint8_t ascii, uint16_t color)
{
uint16_t page, column, temp, i;
i = ascii - ' ';
LCD_OpenWindow(x, y, STR_WIDTH, STR_HEIGHT);
LCD_ILI9341_CMD(0X2C);
for( page=0; page < STR_HEIGHT; page++ )
{
temp = asc2_1206[i];
for( column=0; column < STR_WIDTH; column++ )
{
if( temp & 0x01 )
{
LCD_WR_Data( color );
}
else
{
LCD_WR_Data( BACKGROUND );
}
temp >>= 1;
}
}
}
void LCD_DispStr(uint16_t x, uint16_t y, uint8_t *pstr, uint16_t color)
{
while( *pstr != '\0' )
{
if( x > (COLUMN-STR_WIDTH) )
{
x = 0;
y += STR_HEIGHT;
}
if( y > (PAGE-STR_HEIGHT) )
{
x = 0;
y = 0;
}
LCD_DispChar(x, y, *pstr, color);
x += STR_WIDTH;
pstr++;
}
}
void LCD_DisNum(uint16_t x, uint16_t y, uint32_t num, uint16_t color)
{
uint32_t length = 0, temp = 0;
temp = num;
if( temp == 0 )
{
LCD_DispChar(x, y, '0', color);
return;
}
while( temp )
{
temp /= 10;
length ++;
}
while( num )
{
LCD_DispChar((x+STR_WIDTH*(length--)-STR_WIDTH), y, (num%10)+'0', color);
num /= 10;
}
}
这个是我用的例程