完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 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进制数)的颜色数值 { 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 |
|
相关推荐
18个回答
|
|
32的运算速度远超51,你的延时函数改了没
|
|
|
|
你仿真试了吗?多设几个断点,,,,
|
|
|
|
我是菜鸟,是进来学习学习,
|
|
|
|
本帖最后由 tbnet 于 2015-7-31 21:40 编辑
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都不行, 谢谢! |
|
|
|
本帖最后由 tbnet 于 2015-7-31 21:43 编辑
3.2寸LCD芯片是R61509V,谁有成功的例子,给发一个来参考一下!谢谢! 问题到底出哪里呢? 1.RCC函数 2.GPIO函数 3.GPIOB高8位赋值语句 4.延时函数 真的找不到问题出在哪儿? |
|
|
|
delay_ms中50次for循环远比1ms短
|
|
|
|
|
|
|
|
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); |
|
|
|
我是菜鸟,过来学习
|
|
|
|
本帖最后由 tbnet 于 2015-8-1 22:25 编辑
谢谢! 彩屏用的是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模式配置是否正确,对应时钟有没有打开。
|
|
|
|
整理一下思路,再检查一下程序吧。
|
|
|
|
谢谢各位!我再整理下,看看能不能找出问题!
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
969 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
954 浏览 2 评论
2066 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1162 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1587 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 08:42 , Processed in 0.892876 second(s), Total 75, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号