假期参加电赛崩了。。。 闲的无聊,准备做一些底层的代码分享一下,也算是给自己磨炼一下吧。
这次做的是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<len-1;i++) // 最高位 除以len -1
temp *=10;
for(i=0;i<len;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
看起来还凑合 , 注意使用的时候长度要有一定的富余
代码大概是这样的,我会上传, 写的比较匆忙 错误支持在做难免,希望您的不吝赐教!