新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2014-8-8
- 在线时间
- 0 小时
|
5金钱
下满是我写的程序硬件的连接时: B0-DB15 B7-15& A0-7
DB16,DB17分辨接的PA11和PA12
CS B0
RS B1
WR B2
REST A8
RD:接的VCC,3.3v
#include "stm32f10x.h"
#include"LCD_driver.h"
#include"chinese.h"
#include"char.h"
#include "delay.h"
void LCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//启动GPIO模块时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
//把调试设置普通IO口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //所有GPIO为同一类型端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出的最大频率为50HZ
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA端口
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ; // 选择PB3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //开漏输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出的最大频率为50HZ
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB端口
GPIO_Write(GPIOA,0xffff); //将GPIOA 16个端口全部置为高电平
GPIO_Write(GPIOB,0xffff); //将GPIOB 16个端口全部置为高电平
LCD_RST(1);
delay_ms(5);
LCD_RST(0);
delay_ms(5);
LCD_RST(1);
delay_ms(5);
LCD_CS(0); //打开片选使能
delay_ms(10);
LCD_Write_COM(0x00,0x83);
LCD_Write_DATA(0x00,0x02); //TESTM=1
LCD_Write_COM(0x00,0x85);
LCD_Write_DATA(0x00,0x03); //VDC_SEL=011
LCD_Write_COM(0x00,0x8B);
LCD_Write_DATA(0x00,0x01);
LCD_Write_COM(0x00,0x8C);
LCD_Write_DATA(0x00,0x93);//STBA[7]=1,STBA[5:4]=01,STBA[1:0]=11
LCD_Write_COM(0x00,0x91);
LCD_Write_DATA(0x00,0x01); //DCDC_SYNC=1
LCD_Write_COM(0x00,0x83);
LCD_Write_DATA(0x00,0x00); //TESTM=0
//Gamma Setting
LCD_Write_COM(0x00,0x3E);
LCD_Write_DATA(0x00,0xB0);
LCD_Write_COM(0x00,0x3F);
LCD_Write_DATA(0x00,0x03);
LCD_Write_COM(0x00,0x40);
LCD_Write_DATA(0x00,0x10);
LCD_Write_COM(0x00,0x41);
LCD_Write_DATA(0x00,0x56);
LCD_Write_COM(0x00,0x42);
LCD_Write_DATA(0x00,0x13);
LCD_Write_COM(0x00,0x43);
LCD_Write_DATA(0x00,0x46);
LCD_Write_COM(0x00,0x44);
LCD_Write_DATA(0x00,0x23);
LCD_Write_COM(0x00,0x45);
LCD_Write_DATA(0x00,0x76);
LCD_Write_COM(0x00,0x46);
LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x47);
LCD_Write_DATA(0x00,0x5E);
LCD_Write_COM(0x00,0x48);
LCD_Write_DATA(0x00,0x4F);
LCD_Write_COM(0x00,0x49);
LCD_Write_DATA(0x00,0x40);
//**********Power On sequence************
LCD_Write_COM(0x00,0x17);
LCD_Write_DATA(0x00,0x91);
LCD_Write_COM(0x00,0x2B);
LCD_Write_DATA(0x00,0xF9);
delay_ms(10);
LCD_Write_COM(0x00,0x1B);
LCD_Write_DATA(0x00,0x14);
LCD_Write_COM(0x00,0x1A);
LCD_Write_DATA(0x00,0x11);
LCD_Write_COM(0x00,0x1C);
LCD_Write_DATA(0x00,0x06); //0d
LCD_Write_COM(0x00,0x1F);
LCD_Write_DATA(0x00,0x42);
delay_ms(20);
LCD_Write_COM(0x00,0x19);
LCD_Write_DATA(0x00,0x0A);
LCD_Write_COM(0x00,0x19);
LCD_Write_DATA(0x00,0x1A);
delay_ms(40);
LCD_Write_COM(0x00,0x19);
LCD_Write_DATA(0x00,0x12);
delay_ms(40);
LCD_Write_COM(0x00,0x1E);
LCD_Write_DATA(0x00,0x27);
delay_ms(100);
//**********DISPLAY ON SETTING***********
LCD_Write_COM(0x00,0x24);
LCD_Write_DATA(0x00,0x60);
LCD_Write_COM(0x00,0x3D);
LCD_Write_DATA(0x00,0x40);
LCD_Write_COM(0x00,0x34);
LCD_Write_DATA(0x00,0x38);
LCD_Write_COM(0x00,0x35);
LCD_Write_DATA(0x00,0x38);
LCD_Write_COM(0x00,0x24);
LCD_Write_DATA(0x00,0x38);
delay_ms(40);
LCD_Write_COM(0x00,0x24);
LCD_Write_DATA(0x00,0x3C);
LCD_Write_COM(0x00,0x16);
LCD_Write_DATA(0x00,0x1C);
LCD_Write_COM(0x00,0x01);
LCD_Write_DATA(0x00,0x06);
LCD_Write_COM(0x00,0x55);
LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x02);
LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x03);
LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x04);
LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x05);
LCD_Write_DATA(0x00,0xef);
LCD_Write_COM(0x00,0x06);
LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x07);
LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x08);
LCD_Write_DATA(0x00,0x01);
LCD_Write_COM(0x00,0x09);
LCD_Write_DATA(0x00,0x8f);
LCD_Write_COM(0x00,0x22);
LCD_CS(1);
}
void LCD_Writ_Bus(char VH,char VL) //并行数据写入函数
{
GPIOA->BSRR = VH & 0x00ff; //高位P1口
GPIOA->BRR = (~VH) & 0x00ff;
GPIOB->BSRR = (VL<<8) & 0xff00; //低位P0口
GPIOB->BRR = (~(VL)<<8) & 0xff00;
LCD_WR(0);
LCD_WR(1);
}
void LCD_Write_COM(char VH,char VL) //发送命令
{
LCD_RS(0);
LCD_Writ_Bus(VH,VL);
}
void LCD_Write_DATA(char VH,char VL) //发送数据
{
LCD_RS(1);
LCD_Writ_Bus(VH,VL);
}
void LCD_Write_COLOR(char V1,char V2,char V3) //发送数据
{
LCD_RS(1);
LCD_DB17((V1 >> 5) & 0x01);
LCD_DB16((V1 >> 4) & 0X01);
LCD_Writ_Bus(((V2 >> 2) & 0x0f)+((V1 << 4)& 0xf0),((V2 << 6)& 0xc0) + (V3 & 0x3f)); //rgb 666 转 288
}
void Pant(char V1,char V2,char V3)
{
int i,j;
LCD_CS(0); //打开片选使能
Address_set(0,0,239,399);
for(i=0;i<400;i++)
{
for (j=0;j<240;j++)
{
LCD_Write_COLOR(V1,V2,V3);
}
}
LCD_CS(1); //关闭片选使能
}
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
LCD_Write_COM(0x00,0x02);LCD_Write_DATA(x1,x1>>8); //开始X
LCD_Write_COM(0x00,0x03);LCD_Write_DATA(x1>>8,x1);
LCD_Write_COM(0x00,0x06);LCD_Write_DATA(y1,y1>>8); //开始Y
LCD_Write_COM(0x00,0x07);LCD_Write_DATA(y1>>8,y1);
LCD_Write_COM(0x00,0x04);LCD_Write_DATA(x2,x2>>8); //结束X
LCD_Write_COM(0x00,0x05);LCD_Write_DATA(x2>>8,x2);
LCD_Write_COM(0x00,0x08);LCD_Write_DATA(y2,y2>>8); //结束Y
LCD_Write_COM(0x00,0x09);LCD_Write_DATA(y2>>8,y2);
LCD_Write_COM(0x00,0x22);
}
/**********************************************************
写汉字子函数
**********************************************************/
void ChineseChar(uint x,uint y,int size,uint For_color,uint Bk_color ,char c)
{
int e=0,i,j;
int ed;
unsigned int ncols;
unsigned int nrows;
unsigned int nbytes;
unsigned char *pfont;
unsigned char *pchar;
unsigned char *fonttable[]={(unsigned char *)hz12,(unsigned char *)hz16,(unsigned char *)hz24};
pfont=(unsigned char *)fonttable[size];
if(size==0)
{
ncols =12-1;
nrows =12-1;
nbytes =24; //(12*12)/72
}
else
if(size==1)
{
ncols =16-1;
nrows =16-1;
nbytes =32; //(16*16)/72
}
else
if(size==2)
{
ncols =24-1;
nrows =24-1;
nbytes =72; //(24*24)/72
}
pchar=pfont + (nbytes*(c-1));
Address_set(x, y, x+nrows, y+ncols);
for(i=0;i<nbytes;i++)
{
ed=*pchar++;
if(size==0)
{
if(i%2==0)
e=8;
else
e=4;
}
else
e=8;
for(j=0;j<e;j++)
if((ed>>j)&0x01)
{
LCD_Write_DATA(For_color>>8,For_color ); //textcolor
}
else
{
LCD_Write_DATA(Bk_color>>8,Bk_color); //backcolor
}
}
}
/*********************************************************/
/**********************************************************
字符显示子函数
**********************************************************/
void LCD_ShowChar(uint x,uint y,uint For_color,uint Bk_color, char ch)
{
unsigned char temp;
unsigned char pos,t;
unsigned char CHAR_W,CHAR_H;
CHAR_W = 8; //8*16
CHAR_H = 16;
if(x>(LCD_SIZE_X-CHAR_W)||y>(LCD_SIZE_Y-CHAR_H))
return;
Address_set(x, y, x+CHAR_W-1, y+CHAR_H-1);
ch = ch-32; //按照ASCII编码顺序的到相应字母的编码
for(pos=0;pos<CHAR_H;pos++)
{
temp= Font8x16[ch][pos];
for(t=0;t<CHAR_W;t++)
{
if(temp&0x80)
LCD_Write_DATA(For_color>>8 , For_color ); //textcolor
else
LCD_Write_DATA(Bk_color>>8 , Bk_color ); //backcolor
temp<<=1;
}
}
}
/**********************************************************
显示字符串子函数
x,y:起点坐标
*p:字符串起始地址
**********************************************************/
void LCD_ShowString(uint x,uint y,uint For_color,uint Bk_color,char *p)
{
while(*p!='\0')
{
LCD_ShowChar(x,y,For_color,Bk_color,*p);
// x+=8;
x+=8;
p++;
} }
*******************************************************
LCD_driver
*******************************************************
#define LCD_RST_PIN GPIO_Pin_8 //RST 对应单片机引脚定义 P3^2 / 对应STM32的 PA8
#define LCD_WR_PIN GPIO_Pin_2 //WR 对应单片机引脚定义 P2^5 / 对应STM32的 PB2
#define LCD_RS_PIN GPIO_Pin_1 //RD 对应单片机引脚定义 P2^6 / 对应STM32的 PB1
#define LCD_CS_PIN GPIO_Pin_0 //CS 对应单片机引脚定义 P2^7 / 对应STM32的 PB0
#define LCD_DB17_PIN GPIO_Pin_12 //DB17 对应单片机引脚定义 P3^4 / 对应STM32的 PA12
#define LCD_DB16_PIN GPIO_Pin_11 //DB16 对应单片机引脚定义 P3^3 / 对应STM32的 PA11
#define LCD_RST(x) x ? GPIO_SetBits(GPIOA, LCD_RST_PIN): GPIO_ResetBits(GPIOA, LCD_RST_PIN) //自己定义位操作函数
#define LCD_WR(x) x ? GPIO_SetBits(GPIOB, LCD_WR_PIN) : GPIO_ResetBits(GPIOB, LCD_WR_PIN)//三目运算,需经过判断
#define LCD_RS(x) x ? GPIO_SetBits(GPIOB, LCD_RS_PIN) : GPIO_ResetBits(GPIOB, LCD_RS_PIN)
#define LCD_CS(x) x ? GPIO_SetBits(GPIOB, LCD_CS_PIN) : GPIO_ResetBits(GPIOB, LCD_CS_PIN)
#define LCD_DB17(x) x ? GPIO_SetBits(GPIOA, LCD_DB17_PIN) : GPIO_ResetBits(GPIOA, LCD_DB17_PIN)
#define LCD_DB16(x) x ? GPIO_SetBits(GPIOA, LCD_DB16_PIN) : GPIO_ResetBits(GPIOA, LCD_DB16_PIN)
#define LCD_SIZE_X 240
#define LCD_SIZE_Y 400 //设置分辨率
//颜色设置
#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_ShowString(uint x,uint y,uint For_color,uint Bk_color,char *p);
void LCD_ShowChar(uint x,uint y,uint For_color,uint Bk_color, char ch);
void ChineseChar(uint x,uint y,int size,uint For_color,uint Bk_color ,char c);
void delayms(int count) ;
void LCD_Write_DATA18(char x,char y ,char VH,char VL);
void LCD_Writ_Bus(char VH,char VL);
void LCD_Writ_Bus(char VH,char VL);
void LCD_Write_COM(char VH,char VL);
void LCD_Write_DATA(char VH,char VL);
void LCD_Write_COLOR(char V1,char V2,char V3);
void Pant(char V1,char V2,char V3);
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2);
void display_pic(void);
****************************************************************************
main函数表
****************************************************************************
/*********************************************************************
* *
* STM32- 3.2寸TFT液晶屏字符和汉字显示程序 *
* ( 普中科技 ) *
***********************************************************************/
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "LCD_driver.h"
#include "math.h"
/******************************** 变量定义 ---------------------------------------------------------*/
int main(void)
{
LCD_Init();
LED_Init();
delay_init();
Pant(0x00,0x3f,0x00); //绿色
//    ant18(0,0,0x0f,0xc0);
LCD_CS(0); //打开片选使能
ChineseChar(14+46,10,2,BLACK,WHITE,1); //普
ChineseChar(46+46,10,2,BLACK,WHITE,2); //中
ChineseChar(78+46,10,2,BLACK,WHITE,3); //科
ChineseChar(110+46,10,2,BLACK,WHITE,4); //技
LCD_CS(1); //关闭片选使能
while(1);
}
这是我的部分程序,其它部分用的是原子的,现在不知道程序哪里有问题,找了一天了,求大神帮忙,我的液晶屏是240*400的,26万色
|
|