STM32中如何在LCD中显示一个绝地求生左右摇摆bgm的指针

学STM32-算法-回调函数 - chenht7的日志 -
电子工程世界-论坛
学STM32-算法-回调函数
已有 684 次阅读 14:14
|个人分类:|
&学STM32-算法-回调函数
# 一、内容概述
1.&区分指针函数与函数指针
2.&了解回调函数的原理
3.&了解在实际生活中,回调函数在外卖领域的情景
4.&了解如何用C实现回调函数
# 二、内容阐述
## 2.1 指针函数与函数指针
在进行回调函数的阐述之前,上面这两个概念,可能会影响对回调函数理解。下面就先进行说明一下这些含义吧。以下内容主要参考(C Primer Plus)&&
指针(Pointer)是一个值为内存地址的变量(或数据对象)。既然是变量,那就是说明可以指向不同的地址。指针的类型,指的是被指向的内容的类型。&&
例如:int *pi 表明pi是指向int类型变量的指针。&&
指针函数:
char * fump(int) // 返回字符指针的函数
char * fump(char *);&&&&//这个与上面的进行对比,主要差别是其中的参数不同&&
函数指针:指向函数的指针。函数指针常用作另一个函数的参数,告诉该函数要使用哪一个函数。
例如:void (*pf) (char *);//pf是一个指向函数的指针,(*pf)是一个参数列表为(char *)、返回类型为void的函数。&&
## 2.2 回调函数定义
回调函数的定义,目前没在一些权威性的资料中找到对应的说明。就先参考一下百度百科中的定义吧。&&
回调函数是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。&&
在实际的生活例子中,回调函数就相当于,你今天通过淘宝买了个东西,然后你的个人信息就通过淘宝传递了商家。商家然后把你要的东西给准备好,发了快递。后来快递寄到了对应地址,快递小哥通过核对地址信息(调用你的个人信息),给你打电话,让你取快递。&&
在这个过程中,你的实际地址信息,就相当于地址变量,而呈现在快递小哥通过调用快递公司中你的信息,就相当于用函数指针调用你的地址。这个过程,就类似与函数的回调过程。&&&&
## 2.3 C语言实现
### 2.3.1 程序代码
函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。同比指针变量指向数组首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。&&&
回调函数参数可以空或者定义成void类型。方便不同类型的数据传入。通用性强。
&&&&#include&stdio.h&
&&&&// 方法指针的格式为:int (*ptr)(char *p) 即:返回值 (指针名) (参数列表)&
&&&&// 对回调函数进行声明,定义函数的类型名为 CallBackFun,形参为char *p 。
&&&&// 该函数相对于用CallBackFun代替了 int (* )(char *p)
&&&&typedef int (*CallBackFun)(char *p);
&&&&//下面是两个被调用者,就是回调函数的实现。回调函数是他们的统一格式。
&&&&//功能:Afun,格式符合 CallBackFun 的格式,主要原因是,参数和返回类型都符合上面函数定义。因此可以看作是一个 CallBackFun
&&&&//输入:*p指针参数
&&&&//输出:打印Afun回调信息
&&&&int Afun(char *p)
&&&&&&&&printf("Afun 回调打印出字符%s!\n", p);
&&&&&&&&return 0;
&&&&//功能:Bfun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun,理由同上
&&&&//输入:*p指针参数
&&&&//输出:打印Cfun回调信息
&&&&int Cfun(char *p)&
&&&&&&&&printf("Cfun 回调打印:%s, Nice to meet you!\n", p);
&&&&&&&&return 0;
&&&&/*********************************************************************/
&&&&//下面的这些是调用者:有几种方式,看你喜欢哪种
&&&&int call(CallBackFun pCallBack, char *p)
&&&&&&&&// 执行回调函数,方式一:通过命名方式
&&&&&&&&printf("call 直接打印出字符%s!\n", p);
&&&&&&&&pCallBack(p);
&&&&&&&&return 0;
&&&&/*********************************************************************/
&&&&int call2(char *p, int (*ptr)())
&&&&{&&&&&
&&&&&&&&// 执行回调函数,方式二:直接通过方法指针
&&&&&&&&printf("==============\n", p);&
&&&&&&&&(*ptr)(p);&&&&&
&&&&/*********************************************************************/
&&&&int call3(char *p, CallBackFun pCallBack)
&&&&&&&&// 执行回调函数,方式一:通过命名方式
&&&&&&&&printf("--------------\n", p);&&&&
&&&&&&&&pCallBack(p);&
&&&&/*********************************************************************/
&&&&int main()
&&&&&&&&char *p = "hello";&&&&//定义了一个指向常量的指针
&&&&&&&&//上面这个定义方式,存在着问题,很容易犯常量指针(const pointer)和指向常量的指针(pointer to const)的错误
&&&&&&&&//建议改成: char *const p = "hello";通过这修改,将其限制为指向常量的指针。&&
&&&&&&&&call(Afun, p);&&&//调用Afun回调函数,传递参数*P给Afun函数;&&&&&--1&&
&&&&&&&&&call(Cfun, p);&&&&&&//调用Cfun回调函数,传递参数*P给Cfun函数;&&&&&--2&&
&&&&&&&&call2(p, Afun);&&//调用Afun回调函数,传递参数*P给Afun函数;&&&&&--3&&
&&&&&&&&call2(p, Cfun);&&//调用Cfun回调函数,传递参数*P给Cfun函数;&&&&&--4&&
&&&&&&&&call3(p, Afun);&&//调用Afun回调函数,传递参数*P给Afun函数;&&&&&--5&&
&&&&&&&&call3(p, Cfun);&&//调用Cfun回调函数,传递参数*P给Cfun函数;&&&&&--6&&
&&&&&&&&// int i = getchar();
&&&&&&&&// printf("Input: %c \n", i);
&&&&&&&&return 0;
/*********************************************************************/
### 2.3.2 call(CallBackFun pCallBack, char *p)调用
用call来调用函数数据,主要是集中在第一个语句跟第二个语句。下面就分别对这个句子进行分析。
第一个语句分析:
&&&&`call(Afun,p);`&&&&&--1
因为后面的语句基本上是类似的,所以就对于第一个语句先进行详细的分析。&&
该语句先调用了call()函数,call函数的全称为`int call(CallBackFun pCallBack, char *p)`。从中可知,将实参p的地址赋值给了形参`char *p`用作初始化。函数开头对CallBackFun的声明为`typedef int (*CallBackFun)(char *p)`,从CallBackFun的声明中可以看到,这是定义了一个指向函数的指针,其中能被其指向的函数需满足的条件为,返回值类型要是int类型,并且形参要是指向char型数据的指针。从目前这个语句中,含义是说用一个指向函数的指针CallBackFun,指向了函数Afun的首地址。&&
好了,下面,可以看更深一层的含义了。当数据到了call函数的时候。先用CallBackFun这个类型声明,声明了一个指向函数的指针pCallBack。结合前一级Afun,则可理解为,用pCallFun指向了函数Afun的首地址。
&&&&int call(CallBackFun pCallBack, char *p)
&&&&&&&&printf("call 直接打印出字符%s!\n", p);
&&&&&&&&pCallBack(p);
&&&&&&&&return 0;
从调用中可以看到,这个语句的意思是,先直接输出了printf这个语句,p的地址是指向"hello"。然后第二句,则是通过指向函数的指针pCallBack,调用了函数Afun(p)。从而输出了。
&&&&call 直接打印出字符hello!
&&&&Afun 回调打印出字符hello!
OK,详细的第一个语句分析结束了。下面开始第二句语句。
&&&&call(Cfun, p);&&&&&--2
这个句子的调用方式,跟上面的调用是一样的。对Afun()和Cfun()的函数进行分析发现,两者其实没啥区别,也就是输出文字的不同,于是也便不再重复说明了。
这个实现输出的语句为:
&&&&call 直接打印出字符hello!
&&&&Cfun 回调打印:hello, Nice to meet you!
### 2.3.3 call2(char *p,int (*ptr)())调用
用call2()进行调用函数,主要是集中在第3句跟第4句,这种调用方法跟上面的call()有所不同。下面就分开理解理解。
&&&&call2(p, Afun);&&&&&--3
上面这是主函数中进行的函数调用。可以看到其中传递了两个函数到call2函数当中。为了方便理解,就多个冗余,复制下call2函数
&&&&int call2(char *p, int (*ptr)())
&&&&{&&&&&
&&&&&&&&printf("==============\n", p);&
&&&&&&&&(*ptr)(p);&&&&&
call2这个函数,
舍去了第一个函数中所采用的声明的方式。而是通过第一个将地址`p`赋值给指向字符型的指针,并且通过(*ptr)()这一个指向函数的指针,直接指向了函数`Afun()`的首地址。所以实现的输出结果为:
&&&&==============
&&&&Afun 回调打印出字符hello!
这个`==`这一行,是在call2中输出的。Afun回调这个是,在调用Afun时所出现。
OK,下面开始扯一扯类似的第四个语句了。
&&&&call2(p, Cfun);&&&--4
这个语句跟前面的语句实现的功能基本上一样,也就是Afun跟Cfun在输出的文字有所不同。其最终实现的效果为:&&&
&&&&==============
&&&&Cfun 回调打印:hello, Nice to meet you!
### 2.3.4 call3(char *p, CallBackFun pCallBack)调用
这个回调函数的实现,跟call函数所实现的回调基本上是一样的,就是移动了一下被调用的函数的形参的位置,也就不再细说了。具体实现见对call函数的说明。&&
### 2.3.5 DEV C++输出
对上面的函数,采用了DEV C++这个软件,在WIN7上进行了编译,其中的输出结果见下面:
call 直接打印出字符hello!
Afun 回调打印出字符hello!
call 直接打印出字符hello!
Cfun 回调打印:hello, Nice to meet you!
==============
Afun 回调打印出字符hello!
==============
Cfun 回调打印:hello, Nice to meet you!
--------------
Afun 回调打印出字符hello!
--------------
Cfun 回调打印:hello, Nice to meet you!
## 2.4 应用
对于这个回调函数的优势,我还是不是非常懂,等以后在实践中,涉及面更广,或者发现篇高手对于这个函数的说明后,再进行更好的补充吧。当然我看有些人也说函数进行回调跟直接调没啥区别。
而我目前的理解为,回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
而百度问答中,有人对其的回答为:
对普通函数的调用:调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用--&等待被调用函数执行完毕--&继续执行”
对回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。
跟同事在商量的时候,感觉这个就相当于对于多核多线程的处理的时候,能够比较好地提高效率。主要是用于并行处理的方式。&&
这个优点就相当于51中的中断服务程序ISR与主函数main()函数的关系一样,ISR函数,不能被main()函数所调用,能够独立的运行。当中断发生后,才开始回调中断处理函数,并且回调main()函数,使其停止运行。&&
# 三、总结
这两天时间,终于把遗留下来的这个"关于函数指针与指针函数所构成的回调函数"这个话题给进行了一下讨论。虽然其中的大部分内容都是参考网上的信息,但是稍微理一理感觉还是挺赞的。&&
最近在学STM32,貌似其中有很多很多的中断,看来以后在实战中,可以好好尝试下回调函数。&&&
针对回调函数的一些优点和实际应用,目前的理解也就这些,等以后再深入了,就再修改一下文章吧。
# 参考资料
[1] Stephen Prata [美], 姜佑 译.《C Primer Plus(第6版)中文版》.-北京:人民邮电出版社,2016.4.[M]
[2] 少占鱼-网易,回调函数使用方法--例子程序(转载).http://blog.163.com/ssou_1985/blog/static//
[3] 百度百科,回调函数.https://baike.baidu.com/item/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0/7545973?fr=aladdin
[4] protorock0627,百度知道.回调函数和普通函数有什么区别?.https://zhidao.baidu.com/question/.html
[5] 周理东,百度知道.为什么主函数和中断函数不能调用同一函数.https://zhidao.baidu.com/question/1163748.html
作者的其他最新日志
评论 ( 个评论)
EEWORLD 官方微信
Powered by基于STM32的TFT指针式时钟-360文档中心
360文档中心免费免积分下载,各行业
知识、技术、信息等word文档下载网站
基于STM32的TFT指针式时钟
基于 STM32的 TFT 指针式时钟
自时钟发明的那天起, 它就注定了与人们有着密不可分的关系, 但科学技术在不断发展, 人们随着时间的推移对时间计量的精度要求越来越高, 机械式时钟也越来越满足不了人们日 益增高的要求了。 取而代之的事具有高度准确性和直观性且无机械装置, 使用寿命更长更长 等优点的电子时钟。 电子时钟更具人性化,更能提高人们的生活质量, 更受人们欢迎, 机械 时代已经远去,电子时代已经到来。因此本设计是基于意法半导体公司(ST )的 STM32开 发平台实现一种高精度,智能化的指针式时钟系统 , 采用 STM32内部 RTC 设计电子时钟时 , 通常是数字显示 , 这是由于选用数码管和 1602等器件的显示能力有限。 而 12864是基于点阵 式的液晶屏 , 其像素点为 128×64, 但 12864自身像素较低 , 使其显示指针式时钟效果远低于 2.2寸 TFT-LCD 液晶 , 但两者所基于的原理相同。因此本设计采用 STM32为控制核心, 2.2寸 TFT-LCD 液晶作为显示芯片,构成了一个指针式电子时钟。
关键词:STM32; RTC ; TFT-LCD
免费下载该文档:
基于STM32的TFT指针式时钟的相关文档搜索
苏州科技学院本科生毕业设计(论文) 基于 TFT-LCD 的指针式时钟设计 摘 要 ...4.ICCAVR 是一个 32 位的程序,支持长文件名。 5.ICCAVR]是一个综合了编辑...基于TFT-LCD 的指针式时钟设计 摘 要 自时钟发明的那天起, 它就注定了与人们有着密不可分的关系,但科学技术 在不断发展, 人们随着时间的推移对时间计量的精度...1 课程设计内容 本文将利用 ALIENTEK 2.8 寸 TFTLCD 模块来显示日期时间,实现一个简单的 时钟。 2 STM32 芯片简介 2006 年 ARM 公司推出了基于 ARMv7 架构的...STM32时钟配置方法详解_计算机硬件及网络_IT/计算机_专业资料。STM32时钟配置方法详解 一、在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL。 ①HSI 是...STM32 的时钟树 对于广大初次接触 STM32 的读者朋友(甚至是初次接触 ARM 器件的读者朋友)来说, 在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。这...STM32 中的几个时钟 SysTick、 FCLK、 SYSCLK、 HCLK 的详解在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL。①、HSI 是高速内部时钟,RC 振荡器,...基于STM32的智能万年历---张作栋_信息与通信_工程科技_专业资料。课程设计说明...以其内部的RTC时钟模块作为时钟,用TFTLCD液晶显示器作为显示模块, 时钟电路能...1.4 GRAM 显示方向设置 1 基于 STM32 的 LCD 操作 1.5 TFTLCD 显示需要的相关...//先使能外设PORTB时钟 RCC-&APB2ENR|=1&&4;//先使能外设PORTC时钟 RCC-...STM32的QVGA TFT-LCD驱动实现在基于STM32的TFT-LCD驱动器使用的FSMC16位数据...FSMC的存储器接口写使能信号是用于在倒立配置为DCLK(像素时钟)的TFT,而FSMC片...成绩 课程论文题 目: 基于 STM32 的多功能电子时钟 学生姓名: 学生学号: 系...全双工 UART 串行通道、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电 标识...用指针输出数组的内容 求高手指导 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
用指针输出数组的内容 求高手指导
13:58:25  
#include &iostream&
#include &string.h&
#define EOD&&('\0')
int main()
& & & & int a[] = {10,15,56,89,101,854,66};
& & & & int *p = &a[0];&&//把数组首地址给指针
& & & & //
& & & & for(int j=0;j&7;j++)&&//输出数组数值正常
& & & & //for(;*p!='\0';*p++)&&//输出数组不正常 多输出后面无效数值
& & //for(;p!='\0';p++)&&//此方法不行直接导致电脑无限制输出
& & // for(;*p!='\0';p++)& &//不行和第二种一样
& & //while(*p)& && &//不行和第二种方法一样
& & & & //do& &while 不行
& & & & //while(*p!='\0')&&//不行 和上面的方法一样
&&// while(p-a&sizeof(a))& &
& & & & //此方法更不靠谱 输出错误
& &&&i = sizeof(a)/sizeof(a[0]);&&//这种方法正确
& & & &&&while(p-a&i)
& & & & //for(;*p++!='\0';)
& & & & //& & & & cout&&p&&&\t&;&&//输出p的地址
& & & & & & & & cout&&*p&&
& & & & & & & & *p++;
& & & & }//while(*p!='\0');&&//do while 不行
& & & & system(&pause&);
& & & & return 0;
试了好几种方法都无法输出,有能输出的在后面注释
高级工程师
13:29:32  
int a[] = {10,15,56,89,101,854,66};
& && &&&int *& && &&&p=a;&&//把数组首地址给指针
&&while(*p)
助理工程师
12:51:42  
你要区别输出字符串和输出数值,输出字符串才用到'\0',输出数值用‘\0’肯定会出错的
12:03:51  
工程师职场
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司}

我要回帖

更多关于 吃鸡mc左右摇摆 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信