微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51移植过来的STM32彩屏初始化程序没反应

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

时间:10-02 整理:3721RD 点击:

这是一个由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进制数)的颜色数值
{  
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]);  //写入颜色数据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


32的运算速度远超51,你的延时函数改了没

你仿真试了吗?多设几个断点,,,,

我是菜鸟,是进来学习学习,

void NOP()
{ unsigned int i;
   for(i=0; i<1000; i++);
}
这个我改过,试着将i从1000一直改到1都不行,
void delay_ms(unsigned int ms)
{
   unsigned int k;
   while (ms--)
   {
     for (k = 0; k <50; k++);        
   }
}这个我改过,试着将k从50一直改到1都不行,
谢谢!

3.2寸LCD芯片是R61509V,谁有成功的例子,给发一个来参考一下!谢谢!
问题到底出哪里呢?
1.RCC函数
2.GPIO函数
3.GPIOB高8位赋值语句
4.延时函数
真的找不到问题出在哪儿?

delay_ms中50次for循环远比1ms短

LCD_Write写的貌似有问题吧,电路是怎么连接的呢,彩屏用的是么控制器?写16位的数据要以8位分两次发送吗?

LCD_CS(0);
LCD_RS(type);     // 0: command    1: data
LCD_WR(0);
//由于不知道接口电路,猜测貌似硬件是8位数据接口,如果D0-D7对应GPIOB0-GPIOB7则
//传送value高8位
GPIOB->ODR &=0xff00;
GPIOB->ODR  |=  (value>>8)&0x00ff;   
LCD_WR(1);  
NOP();
LCD_WR(0);
//2.传送value低8位
GPIOB->ODR &=0xff00;
GPIOB->ODR  |=  value&0x00ff;  
LCD_WR(1);
NOP();
LCD_CS(1);

我是菜鸟,过来学习

谢谢! 彩屏用的是R61509V的控制器,用的是8位数据接口,D0-D7对应GPIOB8-GPIOB15
我也觉得可能是赋值语句出了问题;
可就不知道错在哪儿了?谢谢!

谢谢! 彩屏用的是R61509V的控制器,用的是8位数据接口,D0-D7对应GPIOB8-GPIOB15
不好意思,白天没时间回复!

8位还是16位模式?      RST是否有效?   一步一步检查吧。

看看时序是否正确,IO口状态是否配置正确

我将8位数据接口D0-D7由PB7-PB15改到了PB0-PB7,用nyszx给我的语句:
//传送value高8位
GPIOB->ODR &=0xff00;
GPIOB->ODR  |=  (value>>8)&0x00ff;
//2.传送value低8位
GPIOB->ODR &=0xff00;
GPIOB->ODR  |=  value&0x00ff;
结果还是不行,难道是延时函数问题?
谢谢各位的回复。

把延时改大点再试试,慢一点没关系。测试么,时序没问题了再提速。

D0-D7由PB7-PB15改到了PB0-PB7,还要注意其他管脚是否连接正确,GPIO模式配置是否正确,对应时钟有没有打开。

整理一下思路,再检查一下程序吧。

谢谢各位!我再整理下,看看能不能找出问题!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top