新手入门
- 积分
- 27
- 金钱
- 27
- 注册时间
- 2013-4-23
- 在线时间
- 0 小时
|
从网上买的stm32f103zet6的最小板,ili9325的240*320液晶屏,因为板子和屏幕不是匹配的,而且最小板的管脚不连续,于是自己用洞洞板做了一个转接板,程序上把一些不连续的管脚虚拟出一个8位的X口,通过GPIO_WriteX(u8 data)送数据,但是前后弄了十多天,还是显示不了,感觉时序没有问题的,谁能帮帮我啊,先谢谢了
主函数
#include<stm32f10x_lib.h>
#include "initial.h"
#include "9325tp.h"
#define TOP 10
#define BOTTOM 10
#define LEFT 15
#define RIGHT 10
#define DISTANCE 20
/* LCD color */
#define White 0xFFFF
#define Black 0x0000
#define Blue 0x001F
#define Blue2 0x051F
#define Red 0xF800
#define Magenta 0xF81F
#define Green 0x07E0
#define Cyan 0x7FFF
#define Yellow 0xFFE0
int main(void)
{
u8 i;
RCC_Config();
GPIO_Config();
ILI9325_Initial(); //初始化LCD
CLR_Screen(Red);
while(1)
{
}
}
初始化的initial.c和initial.h
initial.h
#ifndef __INITIAL_H_
#define __INITIAL_H_
#include<stm32f10x_lib.h>
void RCC_Config(void);
void GPIO_Config(void);
void GPIO_WriteX(u8 t);
void delay_ms(u16 t);
void delay_13ns(u8 t);
#endif
initial.c
#include "initial.h"
static volatile ErrorStatus HSEStartUpStatus = SUCCESS;
u8 flag=0x00;
struct Portx{
struct XPin{
GPIO_TypeDef *GPIOX;
u16 pin;
} xp[8];
} px;
void RCC_Config(void)
{
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
/* RCC system reset(for debug purpose) */
RCC_DeInit();//将rcc寄存器只为缺省值
/* Enable HSE *///设置外部高速晶振
RCC_HSEConfig(RCC_HSE_ON);
//RCC_HSICmd(ENABLE);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//使能预取指令缓存
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
//设置代码延时值,2个周期
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//设置AHB时钟分频
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
//设置高速ahb时钟
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div4);
//设置低速ahb时钟
/* PLLCLK = 8MHz * 9 = 72 MHz *///设置时钟源和倍频系数
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
//使能或失能pll
/* Wait till PLL is ready *///检查指定的标志位设定与否
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{ //就绪
}
//设置系统时钟,pll作为系统时钟
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
| RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG
| RCC_APB2Periph_AFIO, ENABLE);
//Configure PB12 pin: TP_CS pin
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOF,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOG,&GPIO_InitStructure);
px.xp[7].GPIOX=GPIOE; px.xp[7].pin=GPIO_Pin_7;
px.xp[6].GPIOX=GPIOG; px.xp[6].pin=GPIO_Pin_0;
px.xp[5].GPIOX=GPIOF; px.xp[5].pin=GPIO_Pin_14;
px.xp[4].GPIOX=GPIOF; px.xp[4].pin=GPIO_Pin_12;
px.xp[3].GPIOX=GPIOB; px.xp[3].pin=GPIO_Pin_2;
px.xp[2].GPIOX=GPIOB; px.xp[2].pin=GPIO_Pin_0;
px.xp[1].GPIOX=GPIOC; px.xp[1].pin=GPIO_Pin_4;
px.xp[0].GPIOX=GPIOA; px.xp[0].pin=GPIO_Pin_6;
}
/*引脚定义
PA0--------------------RS
PA2--------------------RW
PA4--------------------RD
PE9--------------------CS
PE11-------------------RST
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
PE7 PG0 PF14 PF12 PB2 PB0 PC4 PA6
*/
void GPIO_WriteX(u8 t)
{
u8 i;
for(i=0;i<8;i++)
{
GPIO_WriteBit(px.xp.GPIOX,px.xp.pin,(0x01<<i)&t);
}
}
void delay_ms(u16 nms) {
u32 temp;
SysTick->LOAD = 9000*nms;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
void delay_13ns(u8 t)
{
while(t--);
}
tft函数部分
9325tp.h
#ifndef __ILI9325_H__
#define __ILI9325_H__
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//
//unsigned char code pic[];
/*----------------------------------------------------------------
定义硬件端口
PA0--------------------RS
PA2--------------------RW
PA4--------------------RD
PE9--------------------CS
----------------------------------------------------------------*/
#define RSL GPIO_ResetBits(GPIOA,GPIO_Pin_0);
#define RSH GPIO_SetBits(GPIOA,GPIO_Pin_0);
#define RWL GPIO_ResetBits(GPIOA,GPIO_Pin_2);
#define RWH GPIO_SetBits(GPIOA,GPIO_Pin_2);
#define RDL GPIO_ResetBits(GPIOA,GPIO_Pin_4);
#define RDH GPIO_SetBits(GPIOA,GPIO_Pin_4);
#define CSL GPIO_ResetBits(GPIOE,GPIO_Pin_9);
#define CSH GPIO_SetBits(GPIOE,GPIO_Pin_9);
void ILI9325_Initial(void);
void Write_Cmd_Data(unsigned char x, unsigned int y);
void Write_Cmd(unsigned char DH,unsigned char DL);
void Write_Data(unsigned char DH,unsigned char DL);
void Write_Data_U16(unsigned int y);
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1);
void CLR_Screen(unsigned int bColor);
#endif
9325tp.c
#include<stm32f10x_lib.h>
#include"9325tp.h"
#include "initial.h"
/*----------------------------------------------------------------
全局变量
----------------------------------------------------------------*/
#define WINDOW_XADDR_START 0x0050 // Horizontal Start Address Set
#define WINDOW_XADDR_END 0x0051 // Horizontal End Address Set
#define WINDOW_YADDR_START 0x0052 // Vertical Start Address Set
#define WINDOW_YADDR_END 0x0053 // Vertical End Address Set
#define GRAM_XADDR 0x0020 // GRAM Horizontal Address Set
#define GRAM_YADDR 0x0021 // GRAM Vertical Address Set
#define GRAMWR 0x0022 // memory write
#define DataPort P0 //数据口使用DataPort
/*----------------------------------------------------------------
清屏函数
输入参数:bColor 清屏所使用的背景色
----------------------------------------------------------------*/
void CLR_Screen(unsigned int bColor)
{
unsigned int i,j;
LCD_SetPos(0,240,0,320);//320x240
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
Write_Data_U16(bColor);
}
}
void Write_Cmd_Data (unsigned char x,unsigned int y)
{
unsigned char m,n;
m=y>>8;
n=y;
Write_Cmd(0x00,x);
Write_Data(m,n);
}
/*----------------------------------------------------------------
写16位数据
----------------------------------------------------------------*/
void Write_Data_U16(unsigned int y)
{
unsigned char m,n;
m=y>>8;
n=y;
Write_Data(m,n);
}
/*----------------------------------------------------------------
写命令
----------------------------------------------------------------*/
void Write_Cmd(unsigned char DH,unsigned char DL)
{
RSL;
delay_13ns(30);
CSL;
GPIO_WriteX(DH);
RWL;
RWH;
delay_13ns(30);
GPIO_WriteX(DL);
RWL;
RWH;
delay_13ns(30);
CSH;
}
/*----------------------------------------------------------------
写数据 双8位
----------------------------------------------------------------*/
void Write_Data(unsigned char DH,unsigned char DL)
{
RSH;
delay_13ns(30);
CSL;
GPIO_WriteX(DH);
RWL;
RWH;
delay_13ns(30);
GPIO_WriteX(DL);
RWL;
RWH;
delay_13ns(30);
CSH;
}
void ILI9325_Initial(void)
{
// CS=1;
CSL;
delay_ms(5);
// RES=0;
RSL;
delay_ms(5);
// RES=1;
RSH;
delay_ms(50);
Write_Cmd_Data(0x0001,0x0100);
Write_Cmd_Data(0x0002,0x0700);
Write_Cmd_Data(0x0003,0x1030);
Write_Cmd_Data(0x0004,0x0000);
Write_Cmd_Data(0x0008,0x0207);
Write_Cmd_Data(0x0009,0x0000);
Write_Cmd_Data(0x000A,0x0000);
Write_Cmd_Data(0x000C,0x0000);
Write_Cmd_Data(0x000D,0x0000);
Write_Cmd_Data(0x000F,0x0000);
//power on sequence VGHVGL
Write_Cmd_Data(0x0010,0x0000);
Write_Cmd_Data(0x0011,0x0007);
Write_Cmd_Data(0x0012,0x0000);
Write_Cmd_Data(0x0013,0x0000);
//vgh
Write_Cmd_Data(0x0010,0x1290);
Write_Cmd_Data(0x0011,0x0227);
//delayms(100);
//vregiout
Write_Cmd_Data(0x0012,0x001d); //0x001b
//delayms(100);
//vom amplitude
Write_Cmd_Data(0x0013,0x1500);
//delayms(100);
//vom H
Write_Cmd_Data(0x0029,0x0018);
Write_Cmd_Data(0x002B,0x000D);
//gamma
Write_Cmd_Data(0x0030,0x0004);
Write_Cmd_Data(0x0031,0x0307);
Write_Cmd_Data(0x0032,0x0002);// 0006
Write_Cmd_Data(0x0035,0x0206);
Write_Cmd_Data(0x0036,0x0408);
Write_Cmd_Data(0x0037,0x0507);
Write_Cmd_Data(0x0038,0x0204);//0200
Write_Cmd_Data(0x0039,0x0707);
Write_Cmd_Data(0x003C,0x0405);// 0504
Write_Cmd_Data(0x003D,0x0F02);
//ram
Write_Cmd_Data(0x0050,0x0000);
Write_Cmd_Data(0x0051,0x00EF);
Write_Cmd_Data(0x0052,0x0000);
Write_Cmd_Data(0x0053,0x013F);
Write_Cmd_Data(0x0060,0xA700);
Write_Cmd_Data(0x0061,0x0001);
Write_Cmd_Data(0x006A,0x0000);
//
Write_Cmd_Data(0x0080,0x0000);
Write_Cmd_Data(0x0081,0x0000);
Write_Cmd_Data(0x0082,0x0000);
Write_Cmd_Data(0x0083,0x0000);
Write_Cmd_Data(0x0084,0x0000);
Write_Cmd_Data(0x0085,0x0000);
//
Write_Cmd_Data(0x0090,0x0010);
Write_Cmd_Data(0x0092,0x0600);
Write_Cmd_Data(0x0093,0x0003);
Write_Cmd_Data(0x0095,0x0110);
Write_Cmd_Data(0x0097,0x0000);
Write_Cmd_Data(0x0098,0x0000);
Write_Cmd_Data(0x0007,0x0133);
// Write_Cmd_Data(0x0022);//
}
/*----------------------------------------------------------------
设置坐标
----------------------------------------------------------------*/
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)
{
Write_Cmd_Data(WINDOW_XADDR_START,x0);
Write_Cmd_Data(WINDOW_XADDR_END,x1);
Write_Cmd_Data(WINDOW_YADDR_START,y0);
Write_Cmd_Data(WINDOW_YADDR_END,y1);
Write_Cmd_Data(GRAM_XADDR,x0);
Write_Cmd_Data(GRAM_YADDR,y0);
Write_Cmd (0x00,0x22);//LCD_WriteCMD(GRAMWR);
}
连接效果
转接板原理图
|
-
-
|