51移植过来的STM32彩屏初始化程序没反应

2019-07-14 22:12发布

本帖最后由 tbnet 于 2015-7-31 21:38 编辑

这是一个由51移植过来的STM32彩屏初始化程序,51的程序可用,但是STM32的程序没反应,各位大神帮忙看看问题出在哪里?附上STM32的程序,谢谢!

/**********************************************************
*                              *
*       3.2寸彩屏驱动程序-LCD32.c"       *
*                *
**********************************************************/               
#include"stm32f10x_lib.h"  //包含所有的头文件
#include"LCD32.h"

/**********************************************************
0.延时子函数
**********************************************************/
void delay_ms(unsigned int ms)
{
  unsigned int k;
  while (ms--)
  {
    for (k = 0; k <50; k++);        
  }
}
/**********************************************************
0.短延时子函数
**********************************************************/
void NOP()
{ unsigned int i;
  for(i=0; i<1000; i++);
}
   
/**********************************************************
1.写命令与数据子函数
**********************************************************/
void LCD_Write(unsigned char type, unsigned int value) //变量type判定写入的是command还是data,变量value(为16位二进制(4位16进制数))表示写入的内容
{  
LCD_CS(0);
LCD_RS(type);     // 0: command    1: data
LCD_WR(0);

// GPIOB->BSRR = value & 0xff00;      //    DATA  = (uchar)(value>>8) ; //传送value高8位
// GPIOB->BRR  = (~value) & 0xff00;
/**1.传送value高8位*******DATA  = (uchar)(value>>8) ;*******************************寄存器ODR操作方式*/
GPIOB->ODR  &= 0X00FF;       //a)将0X00FF同ODR相与;使ODR=0X00FF
// 与运算,1&1=1;1&0=0;0&0=0
GPIOB->ODR  |=  value;    //b)将value同ODR相或 (目的是取value的高8位赋值给GPIOB高8位)
// 或运算,1|1=1;1|0=1;0|0=0
LCD_WR(1);   //
NOP();
LCD_WR(0);
// GPIOB->BSRR = value<<8 & 0xff00;  //将数据送到P0口// DATA  = (uchar)value;    //传送value低8位
// GPIOB->BRR = ((~value)<<8) & 0xff00;
/*2.传送value低8位******DATA  = (uchar)value;********************************寄存器ODR操作方式*/
GPIOB->ODR  &= 0X00FF;       //a)将0X00FF同ODR相与;使ODR=0X00FF
// 与运算,1&1=1;1&0=0;0&0=0
GPIOB->ODR  |=  (value <<8);    //b)将value左移8位后同ODR相或:将value低8位赋值给GPIOB高8位
// 或运算,1|1=1;1|0=1;0|0=0
LCD_WR(1);
NOP();
LCD_CS(1);   
}
/**********************************************************
2. 写16位数据子函数
**********************************************************/
void LCD_Wirte_Data16(unsigned int value)  //变量value表示16位二进制(4位16进制数)的颜 {MOD}数值
{  
LCD_CS(0);
LCD_RS(1);
LCD_WR(0);
   // DATA  = (uchar)(value>>8) ; //传送value高8位
//    GPIOB->BSRR = value & 0xff00;   
//    GPIOB->BRR  = (~value) & 0xff00;
///*1.传送value高8位*******DATA  = (uchar)(value>>8) ; *******************************寄存器ODR操作方式*/
GPIOB->ODR  &= 0X00FF;       //a)将0X00FF同ODR相与;使ODR=0X00FF
// 与运算,1&1=1;1&0=0;0&0=0
GPIOB->ODR  |=  value;    //b)将value同ODR相或 (目的是取value的高8位赋值给GPIOB高8位)
// 或运算,1|1=1;1|0=1;0|0=0
LCD_WR(1);
//NOP();
LCD_WR(0);
// GPIOB->BSRR = (value)<<8 & 0xff00;   
//    GPIOB->BRR  = ((~value)<<8) & 0xff00;

     // DATA  = (uchar)value;   //传送value低8位
/*2.传送value低8位******DATA  = (uchar)value; ********************************寄存器ODR操作方式*/
GPIOB->ODR  &= 0X00FF;       //a)将0X00FF同ODR相与;使ODR=0X00FF
// 与运算,1&1=1;1&0=0;0&0=0
GPIOB->ODR  |=  (value <<8);    //b)将value左移8位后同ODR相或:(目的是将value低8位赋值给GPIOB高8位)
// 或运算,1|1=1;1|0=1;0|0=0 //左移后最右位补0,右移后最左位补
LCD_WR(1);
LCD_CS(1);  
}
/*********************************************************
3.写寄存器子函数
**********************************************************/
void Reg_Write(unsigned int reg,unsigned int value)
{
LCD_Write(TYPE_LCD_COMMAND,reg);     //写命令与数据子函数,TYPE_LCD_COMMAND为0 ,0: command  //reg表示写入的command内容
LCD_Wirte_Data16(value);     //写16位数据子函数
}
/**********************************************************
4.设置显示窗口子函数
**********************************************************/
void LCD_SetRamAddr(unsigned int xStart, unsigned int xEnd, unsigned int yStart, unsigned int yEnd)
{
Reg_Write(0x200, xStart);  //写寄存器子函数//0x200表示写入的命令值,xStart表示写入的数据
    Reg_Write(0x201, yStart);
    Reg_Write(0x0210, xStart);
    Reg_Write(0x0212,yStart);
   
    Reg_Write(0x211,xEnd);
    Reg_Write(0x213,yEnd);
LCD_Write(TYPE_LCD_COMMAND,0x0202);
}
/**********************************************************
5.初始化子函数
**********************************************************/
void LCD_init(void)
{
    LCD_RST(1);
    delay_ms(5);
LCD_RST(0);
delay_ms(5);
LCD_RST(1);
delay_ms(5);
LCD_CS(0);  //打开片选使能
Reg_Write(0x000,0x0000); delay_ms(5);    //写寄存器子函数; 延时子函数
Reg_Write(0x000,0x0000); delay_ms(5);
Reg_Write(0x000,0x0000);delay_ms(5);
Reg_Write(0x000,0x0000); delay_ms(5);
delay_ms(100);
    LCD_Wirte_Data16(0x0000);delay_ms(5);   ////写16位数据子函数
    LCD_Wirte_Data16(0x0000);delay_ms(5);
    LCD_Wirte_Data16(0x0000);delay_ms(5);
    LCD_Wirte_Data16(0x0000); delay_ms(5);
   delay_ms(100);

Reg_Write(0x400,0x6200);delay_ms(5);
  Reg_Write(0x008,0x0808); delay_ms(5);
// Reg_Write(0x010,0x0010);

Reg_Write(0x300,0x0c0c);delay_ms(5);//GAMMA
Reg_Write(0x301,0xff13); delay_ms(5);
Reg_Write(0x302,0x0f0f); delay_ms(5);
Reg_Write(0x303,0x150b); delay_ms(5);
Reg_Write(0x304,0x1020); delay_ms(5);
Reg_Write(0x305,0x0a0b); delay_ms(5);
Reg_Write(0x306,0x0003);delay_ms(5);
Reg_Write(0x307,0x0d06);  delay_ms(5);
Reg_Write(0x308,0x0504);  delay_ms(5);
Reg_Write(0x309,0x1030);  delay_ms(5);
Reg_Write(0x010,0x001b);delay_ms(5);   //60Hz
  Reg_Write(0x011,0x0101);delay_ms(5);
Reg_Write(0x012,0x0000);delay_ms(5);
Reg_Write(0x013,0x0001);delay_ms(5);
Reg_Write(0x100,0x0330);delay_ms(5);//BT,AP 0x0330
Reg_Write(0x101,0x0247);delay_ms(5);//DC0,DC1,VC
Reg_Write(0x103,0x1000);delay_ms(5);//VDV //0x0f00
Reg_Write(0x280,0xbf00);delay_ms(5);//VCM
Reg_Write(0x102,0xd1b0);delay_ms(5);//VRH,VCMR,PSON,PON
delay_ms(1220);
Reg_Write(0x001,0x0100);delay_ms(5);
Reg_Write(0x002,0x0100);delay_ms(5);
Reg_Write(0x003,0x1030); delay_ms(5);
Reg_Write(0x009,0x0001);delay_ms(5);
Reg_Write(0x0C,0x0000);delay_ms(5); //MCU interface
Reg_Write(0x090,0x8000);delay_ms(5);
Reg_Write(0x00f,0x0000);delay_ms(5);

    Reg_Write(0x210,0x0000);delay_ms(5);
Reg_Write(0x211,0x00ef);delay_ms(5);
Reg_Write(0x212,0x0000);delay_ms(5);
Reg_Write(0x213,0x018f); delay_ms(5);
Reg_Write(0x500,0x0000); delay_ms(5);
Reg_Write(0x501,0x0000); delay_ms(5);
Reg_Write(0x502,0x005f); delay_ms(5);
Reg_Write(0x401,0x0001); delay_ms(5);
Reg_Write(0x404,0x0000); delay_ms(5);
delay_ms(500);
    Reg_Write(0x0007,0x0100);delay_ms(5);
delay_ms(1000);
    Reg_Write(0x200,0x0000);delay_ms(5);
Reg_Write(0x201,0x0000);delay_ms(5);
   delay_ms(500);
   LCD_Write(TYPE_LCD_COMMAND,0x0202);
  delay_ms(500);

}  
/**********************************************************
6.清屏子函数
**********************************************************/
void  LCD_clear(unsigned char x)
{
unsigned int com,seg;
LCD_SetRamAddr(0,239, 0,399);
// delay_ms(100);   
for(com=0;com<400;com++)    //Y轴400点
{
  for(seg=0;seg<240;seg++)     //X轴240点
  {
   LCD_Wirte_Data16(colors[x]);  //写入颜 {MOD}数据X
  }
}
}


LCD32_H文件

#ifndef __LCD32_H
#define __LCD32_H
#include"stm32f10x_lib.h"

//#define  TYPE_LCD_DATA  1
#define  TYPE_LCD_COMMAND 0     //定义TYPE_LCD_COMMAND为常量0
#define  LCD_SIZE_X  240    //定义LCD_SIZE_X为240   (原值为128)
#define  LCD_SIZE_Y  400   //定义LCD_SIZE_Y为400(原值为160)
/*********************************宏定义-----------------------------------------------*/
#define LCD_RS_PIN     GPIO_Pin_8   //RS  对应单片机引脚定义 P3^2 / 对应STM32的 PA8
#define LCD_RST_PIN    GPIO_Pin_11  //RST 对应单片机引脚定义 P3^3 / 对应STM32的 PA11
#define LCD_WR_PIN     GPIO_Pin_2  //WR  对应单片机引脚定义 P2^5 / 对应STM32的 PB2
#define LCD_RD_PIN     GPIO_Pin_1  //RD  对应单片机引脚定义 P2^6 / 对应STM32的 PB1
#define LCD_CS_PIN     GPIO_Pin_0  //CS  对应单片机引脚定义 P2^7 / 对应STM32的 PB0
#define    LCD_RS(x)   x ? GPIO_SetBits(GPIOA, LCD_RS_PIN) :   GPIO_ResetBits(GPIOA, LCD_RS_PIN)
#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_RD(x)   x ? GPIO_SetBits(GPIOB, LCD_RD_PIN) :   GPIO_ResetBits(GPIOB, LCD_RD_PIN)
#define    LCD_CS(x)   x ? GPIO_SetBits(GPIOB, LCD_CS_PIN) :   GPIO_ResetBits(GPIOB, LCD_CS_PIN)  
//#define LcdData(x) GPIOB->ODR=(GPIOB->ODR&0xff00)|(x&0x00FF);
//#define LcdData(x) GPIOB->ODR=(GPIOB->ODR&0xc03f)|((x<<6)&0x3fc0);
/*********************************声明函数 -----------------------------------------------*/
extern  unsigned int colors[];
extern  void  LCD_init(void);
extern  void  LCD_clear(unsigned char x);
#endif





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
浩淼、一毛
1楼-- · 2019-07-15 21:21
 精彩回答 2  元偷偷看……
tbnet
2楼-- · 2019-07-16 00:15
本帖最后由 tbnet 于 2015-8-1 22:25 编辑

谢谢! 彩屏用的是R61509V的控制器,用的是8位数据接口,D0-D7对应GPIOB8-GPIOB15
我也觉得可能是赋值语句出了问题;
可就不知道错在哪儿了?谢谢!
tbnet
3楼-- · 2019-07-16 00:34
nyszx 发表于 2015-7-31 22:33
LCD_CS(0);
LCD_RS(type);     // 0: command    1: data
LCD_WR(0);

谢谢! 彩屏用的是R61509V的控制器,用的是8位数据接口,D0-D7对应GPIOB8-GPIOB15
不好意思,白天没时间回复!
流年wang烦
4楼-- · 2019-07-16 02:33
8位还是16位模式?      RST是否有效?   一步一步检查吧。。。
郑其墉
5楼-- · 2019-07-16 05:47
看看时序是否正确,IO口状态是否配置正确
tbnet
6楼-- · 2019-07-16 06:49
 精彩回答 2  元偷偷看……

一周热门 更多>