完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
第一次用彩屏,用IO口模拟16位的8080时序。写了个清屏函数测试下,差不多300ms这样才刷完一次。不是说16位并口速度很快吗??网上有人说用SPI都能30帧/s怎么做到的???
还有那个时序函数也有点问题,为什么那些例程里,放上数据后都不需要延时,我这个没延时就出问题了???
补充内容 (2018-1-15 12:27): /*------- 写命令时序 ----------*/ void LCD_WR_CMD(unsigned short dat) { LCD_CS_0;//片选拉低 LCD_RS_0;//RS为0是写命令 LCD_WR_0;//写操作,先拉低以便产生上升沿 LCD_RD_1;//写操作时,RD要拉高 DATAOUT(dat)//往数据口放数据 delay_ns(1);//延时,不然会白屏或花屏 LCD_WR_1;//拉高产生上升沿 LCD_CS_1;//片选拉高 } /*------- 写数据时序 --------*/ void LCD_WR_DAT(unsigned short dat) { LCD_CS_0; LCD_RS_1;//RS为1是写数据 LCD_WR_0;//写操作,先拉低以便产生上升沿 LCD_RD_1;//写操作时,RD要拉高 DATAOUT(dat) delay_ns(1);//延时,不然会白屏或花屏 LCD_WR_1; LCD_CS_1; } /*-------- 读数据时序 -----------*/ unsigned short LCD_RD_DAT(void) { u16 dat = 0; Input_mode();//IO口模式设置为输入模式以便接收数据 LCD_CS_0; LCD_RS_1;//数据 LCD_WR_1;//读操作时,WR要拉高 LCD_RD_0;//读操作,先拉低以便产生上升沿 delay_us(5); dat = DATAIN//取出IDR里的数据 LCD_RD_1; LCD_CS_1; Output_mode();//IO口模式换回输出模式 return dat; } |
|
相关推荐
17个回答
|
|
你的程序这部分看不出什么问题,另外向9341写数据不需要延时,只要把数据写入9341就可以了,不需要等待结果或向1602等需要查忙,所以如果你的程序里有延时,那么假设每一个字节一个延时,76800个延时的时间也够长了。
你应该查查其他部分的程序和硬件电路,例程的代码一般都没什么问题的,除了硬件连接有可能不一样,例程都是能正确运行的 |
|
|
|
记得下次提问要选择“问答”类别
|
|
|
|
人中狼 发表于 2018-1-15 10:10 我把时序函数贴出来了,你看看。 那个延时函数就是一个 while(i--); 而已,汇编代码也就一两指令周期吧,而且延时可以替换成别的操作比如++,--或者给个if判断之类的,然后就正常了,很奇怪。 |
|
|
|
从你的描述来看,应该还是代码的问题,比如i的初始值是多少,有没有被改变。
另外还是那个问题,对于9341,单片机向9341写入数据是不需要加延时操作的,我用51和STM32F103操作9341,都不需要加延时的,也是参考例程修改使用的。 |
|
|
|
人中狼 发表于 2018-1-15 12:42 i 是手动赋值的,delay_ns(1); 那 i 就是1。 既然能刷屏了那硬件连接应该是没问题的吧,现在问题就是那个延时不懂什么情况。 就算加上那个延时,也就延迟一两个指令周期而已吧,怎么会对刷屏速度有那么大影响? |
|
|
|
延时不止一两个指令周期,C语言的while(i--)至少有一个减法指令和一个比较指令,就算是一个指令周期,按51算,12兆晶振,12分频,一个指令周期1us,刷屏76800个点,就是76800us,即76毫秒,这还是按一个指令周期算的。
查查代码吧,看看跟例程的区别再哪 |
|
|
|
人中狼 发表于 2018-1-15 13:19 好吧,我再看看代码,不行再来问。 我是用32的,算过了刷76800个点大概也就2-5毫秒这样吧? |
|
|
|
人中狼 发表于 2018-1-15 13:19 没有那个延迟,单步调试都没用。加上延迟什么都正常了,真是无解了 |
|
|
|
找个32的例程对比看看吧,应该是程序问题,可能是引脚设置或时序的问题
|
|
|
|
搞了半个月。换了块f103ZET6板,数据口改用PD口,没有那个延时也能正常用了。 不过又有问题了,填充屏幕如果白色(也就是PD口输出0xFFFF),一开始只会填充一行像素点,然后卡住一会,接着就花屏了,改用其他颜色比如0x00FF或0xFF00,或者红绿蓝黑这些就正常。。这又是什么情况啊 PD2口有板载的外部上拉电阻,不知道是不是这个引起的 |
|
|
|
彩屏的8位和16位操作是不一样的,如果单片机使用16位端口连接彩屏,数据是16位一次写入的,如果是使用8位端口连接彩屏,则是16位数据分两次写入彩屏,这需要确定彩屏使用的16位还是8位接口,然后单片机采用相应的控制方式进行控制
|
|
|
|
本帖最后由 feier567 于 2018-1-30 20:00 编辑
[url=]人中狼 发表于 2018-1-30 19:21[/url] 彩屏是16位的接口,所以才说用16位8080接口啊 |
|
|
|
不知道你的程序改了没有,不过下面的代码应该是8位的,16位的接口,数据不需要写两次
LCD_WR_CMD(LCD_CMD_COLADDR);//设置列地址 LCD_WR_DAT(0x00); //列开始地址0(0x0000),先写高8位 LCD_WR_DAT(0x00); //后写低8位 LCD_WR_DAT(0x00); //列结束地址239(0x00ef),先写高8位 LCD_WR_DAT(0xef); //后写低8位 |
|
|
|
人中狼 发表于 2018-1-30 20:09 不是吧?彩屏的数据手册上说了每个16位地址要分两次写入,先写高8位再写低8位。而颜色数据才是16位整个写入。 那个所谓的高8位低8位只是对液晶的寄存器而言的,和单片机IO口的8位16位没关系吧, |
|
|
|
不好意思,那部分我没注意看,9341的基础控制方面我是直接从例程修改过来的,我的写命令和写数据部分直接贴给你,这部分代码里我的都没有延时,所以你可能需要查一下端口操作部分的程序,16位端口我用的是C端口
void TFT_9341_Write_data(u16 TFT_9341_DATA) { TFT_9341_RS_ON(); TFT_9341_RD_ON(); TFT_9341_WR_ON(); GPIO_Write(TFT_9341_DATA_PORT, TFT_9341_DATA); TFT_9341_WR_OFF(); TFT_9341_WR_ON(); } void TFT_9341_Write_command(u16 TFT_9341_COMMAND) { TFT_9341_RS_ON(); TFT_9341_RS_OFF(); TFT_9341_RD_ON(); TFT_9341_WR_ON(); GPIO_Write(TFT_9341_DATA_PORT, TFT_9341_COMMAND); TFT_9341_WR_OFF(); TFT_9341_WR_ON(); TFT_9341_RS_ON(); } |
|
|
|
人中狼 发表于 2018-1-30 22:12 写时序没问题的了。。 花屏感觉是并口线信号干扰的问题,我用杜邦线连接的,有时候动一下线就正常,有时候就花屏,已经用临时的办法解决了,到时候用FSMC看看还花不花屏。 一般IO模拟时序的刷屏帧率有多少,我用定时器测了下有14-18帧正常吧? |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1085 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1041 浏览 2 评论
2145 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1240 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1660 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 02:38 , Processed in 1.217108 second(s), Total 107, Slave 89 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号