假期参加电赛崩了。。。闲的无聊,准备做一些底层的代码分享一下,也算是给自己磨炼一下吧。
这次做的是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
看起来还凑合,注意使用的时候长度要有一定的富余
关键字:LCD12864 Stm32F407
引用地址:
迁移51 的 LCD12864 到 Stm32F407
推荐阅读最新更新时间:2024-11-09 12:23
基于51单片机的UART串口通信
51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。 UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之
[单片机]
说一说学51时候躺过的坑——bit和sbit的区别
什么是bit和sbit?他们有什么区别? 在刚学51单片机的时候刚看到这个两个东西的时候就是一脸懵逼,脑子里面第一反应就是,这是什么鬼啊,C语言里面没说过啊,于是去B站看了51单片机视频教程,终于知道了这是一种数据类型,类似于int、float一样,但是某天自己写代码使用到的时候就一脸懵逼了,如下面函数返回值的类型应该怎么决定?为什么必须要这样? 函数返回值是应该这样写呢? 还是应该这样写? 于是,好奇的我两种情况都试了试,但是事实却是试试就逝世 试第二种的时候编译器报错了 这又是什么情况?难度两个不一样吗? 于是查了一下资料 bit和sbit都是C51扩展的变量类型。 bit bit编译时分配空间 sfr(特殊功能
[单片机]
C51单片机学习笔记之数码管
简介 数码管分为共阴数码管和共阳数码管。简单说就是所有阴极共用一个引脚或所有阳极共用一个引脚。 用共阴数码管举例:A,B,C,D,E,F,G对应数码管的段。1,2,3,4对应数码管的位。共阴数码管高电平时段有效,低电平时位有效。共阳数码管反之,低电平段有效,高电平位有效。 数码管对应的字符 共阴 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 0x77, // A 0x7C,
[单片机]
51单片机的最小系统应用说明
本文我们来谈一谈51单片机的最小化应用系统的问题,相信你做了这个简单的最小系统试验以后,会对单片机逐渐感兴趣起来的,单片机要正常运行,必须具备一定的硬件条件,其中最主要的就是三个基本条件:1.电源正常;2.时钟正常;3.复位正常。下面就以我们实验用的51单片机AT89S51为例介绍其硬件连接方法。 下图就是AT89S51单片机构成的最小系统(仅驱动1个发光二极管)的电路,在AT89S51单片机的40个引脚中:电源引脚2根,晶振引脚2根,控制引脚4根,可编程输入输出引脚32根。 《51单片机的最小化应用系统电路图》 1、工作电源:电源是单片机工作的动力源泉,废话!没有电源当然不能工作啦:),对应的接线方法为:40脚(VCC)
[单片机]
5. Stm32f407 key查询方式示例
硬件平台: stm32f407ve 软件平台: win10 (OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.18363 N/A Build 18363) Keil5 5.26.2 HAL库版本: 2.14.0(目前下载的最新的) 实验介绍: 本次是使用hal库进行按键循环查询实验。(根据之前建立的模板操作,这里不再建立工程模板) 首先看原理图,按键的原理比较简单,按下去,电路短路,松开,电路开路。在下图中,我们看到与cpu的连接时PE10,1
[单片机]
8051单片机串行口及串行通信
一、串行通信的基础知识 CPU与其他外部设备要进行信息交换,一台计算机与其他计算机之间有时也要交换信息,这些信息交换就称为通信。通信有并行通信和串行通信两种。 1、并行通信 并行通信是将数据字节的各位用多条数据线同时进行传送。 并行通信控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接受存在困难。 2、串行通信 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。 串行通信传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制要比并行通信复杂。 串行通信又可以分为异步通信与同步通信。 1)异步通信 异步通信是指通信的发送设备与接
[单片机]
单片机串行口介绍,8051单片机的通信方式
串行口是单片机与外界进行信息交换的工具,8051单片机的通信方式有两种: 并行通信:数据的各位同时发送或接收。 串行通信:数据一位一位次序发送或接收。 串行通信的方式 异步通信 用一个起始位0表示字符的开始,用停止位1表示字符的结束,中间夹着8个数据位,字符能一个接一个传送 CPU与外设之间必须有字符格式和波特率两项规定 字符格式规定能使双方把0和1串理解成同一种意义,原则上自由制定,通用角度使用标准如ASCII 波特率即数据传输速率,每秒传送的二进制位数,如120字符/s,每个字符10数位,则传送波特率为1200波特 同步通信 去掉了开始结束标志提高速度,但由于数据块传递开始要用同步字符来指示,同时要求由时钟来实现发送端
[单片机]
51单片机矩形键盘控制数码管显示0-F,以及LED灯的亮灭
电路图 总图 部分图1 部分图2 部分图3 元件清单 C语言程序 #include reg51.h #define uint unsigned int #define uchar unsigned char //共阳数码管编码表&LED灯 uchar code table = {0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //函数声明 void delay(uint time); //延时函数 void display(uchar k); //数码管显示0-F以及LED
[单片机]