单片机交流
直播中

张玉兰

7年用户 1383经验值
私信 关注
[问答]

请问如何迁移51的LCD12864到Stm32F407?

请问如何迁移51的LCD12864到STM32F407?

回帖(1)

朱小玲

2021-10-26 11:24:37




假期参加电赛崩了。。。  闲的无聊,准备做一些底层的代码分享一下,也算是给自己磨炼一下吧。
这次做的是Stm32F407ZGT6 驱动LCD12864 的代码 测试的时候使用的是正点原子的探索者 STM32F4开发板、 LCD 插在 清翔的51单片机开发板上  注意 我是用的是 带有中文字库的版本      代码的下载地址在这里




这里注意  驱动LCD  需要给模块一个参考电压  也就是上图的VO  否则LCD 显示会出异常(颜色过深或者过浅) 我也是因为这个
所以才使用了成品开发板的威廉希尔官方网站





程序是从51单片机的程序上迁移过来的,咱们不做深究,只是注重一些迁移的细节。





以上是三个控制引脚的设置,其实还有几个是 PSB  需要设置,这个是一直拉高  我就没用IO了 就直接接到VCC了
在51中 IO的输入输出是由 C语言的读取和写入决定的, P0 = 0xff  是输出  data = P0是 读取
但是在STM32F407 中确不是这样的,STM32 有自己的输入数出模式, 不同的时刻需要对输入输出的寄存器进行配置。
我的实现过程大概是这样的:









输出和输入分别使用一个函数来实现,函数中有切换 IO输入输出模式的操作 也有 读取和写入的操作
实现了这两个函数以后剩下的代码几乎就可以全部迁移过去了,只要注意一下 函数名称就可以了










































以上就实现了对LCD12864 的驱动, 我测试用的 LCD是带有中文字库的,显示汉字很方便,至于绘图, 描点、反白、显示数字等等的暂时还没有实现,看心情吧。如果有更新的话后期大家应该可以看得到。

更新的代码来了,  我编写了一些常用的显示代码,





大概是这样的  显示int(带符号)  double 还有hex 和bin

int 显示的函数 请使用这个   后面的那个是有问题的
void LCD_12864_show_int(u8 x,u8 y,int num,u8 len)
{
    u32 temp=1;
    u8 i=0;
    u8 flag=1;
    LCD_12864_pos(x,y);
    if(num <0)
    {
        LCD_12864_write_data('-'); //显示符号
        num *=-1;
    }
    for(i=0;i
        temp *=10;
    for(i=0;i
    {   
        if(flag &&(num/temp == 0))
        { //flag == 1 并且 num/temp == 0
          //证明这是我们不想要的开头部分的0
            LCD_12864_write_data(' ');// 填充空格
        } else
        {
            flag = 0;//  第一次进入就会置0  之后就不会进到上面的逻辑
            LCD_12864_write_data((num/temp)+'0');
            
            
        }
        num%=temp;
        temp/=10;
    }   
}





这是显示int 的实现方法(自己写的可能会有bug   我这边测试暂时没有发现问题)





这是显示string的方法,  可以直接显示汉字!
double 的显示比较长。。。。 而且这个代码存在一定的精度的误差 比如你要显示123456.654321  可能实现的不是这个数字!!!










其实 显示 double和 hex  bin 都是先合成一个string  然后在现实string   主要的难点就是合成string了










以上就是显示的过程了





这是显示的效果图  对应于 main中





显示bin的话  LCD的长度不是很够 看着就是比较难受





这是显示 字符串和 int





看起来还凑合  ,  注意使用的时候长度要有一定的富余

















代码大概是这样的,我会上传, 写的比较匆忙 错误支持在做难免,希望您的不吝赐教!

代码下载地址
举报

更多回帖

×
20
完善资料,
赚取积分