51移植过来的STM32彩屏初始化程序没反应
这是一个由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模式配置是否正确,对应时钟有没有打开。
整理一下思路,再检查一下程序吧。
谢谢各位!我再整理下,看看能不能找出问题!