• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

还是12864显示乱码问题

幻月星辰 2018-06-19 浏览量:921

硬件新做了一个板子,试了下显示还是乱码,布线改了,但是没改原理图,原理图公司一直在用,没出过问题。现在来分析分析软件的原因

这是数据接口程序,由于DB0-DB7分布在三组GPIO上所以用了位操作,

//数据命令引脚设置
void Screen_GPIO(u8 byte)
{

GPIOB->BSRR = (byte&0x0f) << 6 | ((~byte)&0x0f) << 22 ;
 GPIOC->BSRR = (byte&0x30) << 4 | ((~byte)&0x30) << 20 ;
GPIOA->BSRR = (byte&0xc0) << 5 | ((~byte)&0xc0) << 21 ;

// GPIOE->BSRR = byte | ~byte << 16;

}



​程序的原因我只能是猜想,我因为数据不在一组口上,对数据口的控制时间有细微的差别,可能会影响到显示,

//写命令
void ST7567_Write_Cmd(u8 cmd)
{

LCD_CS1 = 0;
LCD_A0 = 0;
LCD_RW = 0;

Screen_GPIO(cmd);
LCD_E = 1;
LCD_E = 0;
LCD_CS1 = 1;

Screen_GPIO(0x00);
delay_us(2);
}

这是写命令时序,按理说写入数据是在LCD_E从1变为0的过程,对数据口赋值有时间间隔应该不影响显示才对

而且最后两句命令是为了减轻乱码才加上的,在别的单片机上使用屏幕不需要加置0和延时操作,加上以后乱码减少,但是还是存在

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 不同的单片机平台,机器周期不同,需要微调时序,我最近用proteus仿真也遇到了这种情况,后来发现还是时序有问题,有示波器可以看一下时序图是否有问题,此外显示算法也要报这个没问题才行。

    delay();

     LCD_E = 1;

    delay();
     LCD_E = 0;

    这两句中间加点延时试试。

    乱码一般也很可能是你现实函数有问题。​

    • 发布于 2018-06-19
    • 举报
    • 评论 3
    • 0
    • 0
幻月星辰 回复了 hayden:加过了,上面的每句话之间都加过延时,几个__NOP__到几十微妙都试过了还是不行 回复
hayden 回复了 hayden:那就上示波器看看有没有问题 回复
hayden 回复了 幻月星辰:那就上示波器看看有没有问题 回复

其他答案 数量:5
  • 你显示乱码有没有可能是字符编码问题?
    • 发布于2018-06-19
    • 举报
    • 评论 1
    • 0
    • 0
幻月星辰 回复了 xdsnet :应该不会,全屏填黑也会有漏掉的点 回复

  • 这种情况一般都是你的驱动时序有问题,你要检查一下驱动时序还有写入的寄存器是不是正确的
    • 发布于2018-06-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 要检查一下你的字库是不是正常的,很多时候乱码都是字库的原因
    • 发布于2018-06-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 楼主先试试显示一个点看看有没有问题,再显示多个点看看,一步一步排查。

    • 发布于2018-06-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 首先要确定你的单个显示是不是正常,然后确定一下驱动的时序问题
    • 发布于2018-07-14
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

还是12864显示乱码问题