自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 C学习-回调函数

①大致的过程是在应用层或者主函数中,定义一个函数,将函数(函数名就是函数地址)赋给封装好的库里面的指针变量,我们下面这个例子就是通过调用库里面的注册函数。KEY_LONG_PRESS, //按键长按。KEY_PRESS, //按键短按。③库函数就会在有该指针的位置对注册函数进行调用。KEY_IDLE, //空闲。KEY_RELEASE,//按键释放。1.关于回调函数的使用。

2022-12-14 22:22:48 223 1

原创 C语言学习-队列2

3.如果首尾指针指向同一个位置 ,那么就把首指针往后挪一位。(这个时候其实,首指针指向的数据已经被新写入的数据覆盖了,我们把它抛弃)4.注意:和尾指针一样,首指针也要做判断,步骤3中如果首指针也移动到了队列尾部,那么也需要重新挪到队首。2.如果尾指针指向队尾,就把尾指针挪到队头。(本质上说,这个队列是在同一个区域重复循环使用)2.如果头指针指向队尾,就把头指针挪到队头。(本质上说,这个队列是在同一个区域重复使用)3.执行成功就返回1,执行失败返回0。1.将数据从队列中取出。1.将数据放入队列中。

2022-12-11 20:40:12 268

原创 C语言学习-指针3

第二个就是关于结构体中变量的调用,在调用结构体变量中的字符串的时候,不用加字符串的大小。在使用过程中不用重新添加 *号,它定义的变量就是指针变量,加 * 就会变成二重指针。通过typedef 定义的指针类型。1.学习过程中踩到两个坑。

2022-12-10 22:38:31 188

原创 C语言学习-结构体2

1.学习了结构体之后,我们可以使用结构体的嵌套。下面的例子涉及到结构体的嵌套,以及嵌套结构的使用。在第二个结构体中,我们创建了嵌套的结构体,stuinfo里面嵌套了date结构体。

2022-12-08 22:48:04 162

原创 C语言学习 - 结构体

1.结构体有两种定义方式,结构体定义后,需要拿来定义结构体变量后进行使用。两种结构体定义方式可以随时互换,所以使用上没有任何区别,只看个人偏好实际情况中后者要更好用一些#include "stdio.h"//下面这种定义后,需要通过 struct data 变量名 来进行定义struct data{ unsigned int year; unsigned char mon ; unsigned char day ;};//而下面这种定义后,可以直接 stu_in

2022-12-07 23:20:52 252

原创 C语言学习-指针2

1.我们这里说到函数指针数组。它可以将多个同类型的函数定义到一起,通过指针进行调用,后面还能和枚举一块使用,这样就可以提供可读性和函数的紧凑性。下面这个函数就是在定义指针函数,通过函数的下标来进行调用,注意调用格式,和直接使用函数的格式是一样的。func[1](); 这里最开始忘记写后面的()了,编译器不会报错,但是函数没有正确调用,不会有结果,还有一点,func[2],里面的数字2对应的是func3,因为数组是从0开始数的#include "stdio.h"void func1(){ pr

2022-12-06 21:48:37 62

原创 C语言学习-枚举

1.关于枚举,枚举是将同类型的值全部列出的一种行为。枚举可以自行赋值,赋值后声明的量就可以直接拿来当值使用,下面就是一个例子STM32的库将GPIO端口的类型进行枚举后,我们再初始化的时候,就可以直接拿来使用。这样做有一个最大的好处是,可读性要更强。下面两个是相同操作,但是前者要更加明确。GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Mode = 0x10; typedef enum{ GPIO_Mode_

2022-12-05 22:28:39 461

原创 C语言学习-指针

1.函数声明,不能在主函数里面。(脑子秀逗了)写在主函数里面报错。2.关于 void SetData(unsigned char* p) 这个函数的变量是一个指针地址变量,函数的作用也非常简单,就是往输入的地址里面写数据。3.主函数打印两次a的结果,第一次输出初始值,第二次输出 SetData(unsigned char* p)往变量地址里面写入的值。#include "stdio.h" void SetData(unsigned char* p){ *p = 10; }int m

2022-12-05 22:08:50 323

原创 STC8--字库加载

/发送24bit地址。/* Addr:开始写入的地址(24bit) *//* Addr:开始读取的地址(24bit) */

2022-11-27 18:55:49 365

原创 STC8 --显示汉字

以“学”字为例,我们的字是16*16大小的,输入汉字后,就会对像素点染色,从而组成汉字。像素点染色函数,逐位比较最高位用到的又是for循环加 (val &0x80),每个字节我们都按位逐个进行比较,是1就染白色,是0就染黑色。这里我的理解是数组名不带后面的方括号,直接使用就表示的是变量地址,然后加一就是增加1个变量长度,例子里面是char,即增加8位。这个函数设置我们的汉字放在哪里以及设置区域的大小,注意16*16是包含x,y本身的,所以终点是x+15,y+15。

2022-11-26 19:56:27 583

原创 STC8--EEPROM

先使能IAP, 然后设置 IAP_CMD = 1;(1读,2写,3擦除),接着是地址16位地址分别放入两个8位地址寄存器里面,然后触发命令执行后等待一个_nop_();关于在字节上写0来进行赋值,比如给一个0xFF写0x02,就会将倒数第二为以外的位全部清0,写位数据后,再就只能往里面写0了(后面写了0,就彻底不能写其他数)//设置IAP擦除命令。//设置IAP低地址。//设置IAP高地址。//设置IAP写命令。//设置IAP低地址。//设置IAP高地址。//设置IAP低地址。//设置IAP高地址。

2022-11-26 13:31:06 2705

原创 STC8--休眠唤醒

void INT2_lsr(void) interrupt 10 //只要有interrupt10就可以代表这个是INT2口的中断检测。void INTX_lsr(void) interrupt 11 //只要有interrupt11就可以代表这个是INT3口的中断检测。就是确保休眠前没有没有执行其他操作),按下K1/K2后INT2或者INT3检测到中断后,先跳转到中断函数,执行完中断函数后,继续执行上次那个_nop_();),设置INT中断或者是Timer,然后就可以了。

2022-11-25 19:54:55 3116

原创 STC8学习--看门狗

2.看门狗测试函数是一个T0中断延时函数修改的,关于这个T0延时函数,我们这里复习一下,设备的主频是35MHz,周期是1/35000000s,计时器每过一个周期就会加一,累加时间达到1ms之后就会进入interrupt 1中断,设置好频率之后,执行语句后,定时器会在启动一定时间之后,让设备复位。② 注释掉喂狗语句后,到了喂狗时间没有喂狗就会重启,所以会看到绿灯在闪,红灯才开始交替一次,就重启了。我们管这个叫做对看门狗进行喂狗操作,如果我们的设备跑飞或者卡死了,看门狗没有喂,它就会把我们的设备进行重启。

2022-11-25 14:48:12 1409

原创 STC8学习 --并口通信

染色函数就是发送16位数据,R(RED)G(GREEN)B(BLUE) ,前面5位控制红色,中间6位控制绿色,后面5位控制蓝色。3.学习机上的硬件连接:① P2.0到P2.7 的8个引脚作为数据传输引脚 ②四个控制引脚 CS是片选引脚,和SPI通信一样,RD 是读取控制,WR是写入控制,RS控制我们传输的内容是 数据还是命令。4.并口通信用的8位口来进行,但是仍然不够用,比如说在做染色的时候,输入的颜色数据是16位的,所以传输数据要连续传输两次。P3.4的引脚电平控制背光灯的亮灭。

2022-11-23 22:00:35 1055

原创 STC学习--SPI 2

2.和之前的情况一样,SPI通信依靠时钟的上下沿来对数据进行发送和读取,所以我们可以在一个周期内把对一个bit位数据的发送和读取同时完成。//把接收的数据放到,dat的最低位,dat左移后最低位补0,//刚开始这里定义的是char 变量,读取的结果总是00 00,坑死。1.SPI根据电平空闲时的状态,以及读取第一个数据是在什么时候,一共有4种模式。//左移一位,因为SPI通信是从最高位开始发送的。//把时钟拉高,出现上升沿,数据发送出去。//拉低时钟,出现下降沿。// 4.在时钟上升沿发送,下降沿接收。

2022-11-22 22:53:11 797

原创 STC8学习-- SPI通信1

串口传输的时候TXD,RXD两个引脚,一个引脚传输的时候,另外一个引脚就会拉高,只能实现半双工。SPI通信有四个引脚,选片只用拉低CS引脚,而且不用发送地址,优势很大。1.根据GD25Q64芯片芯片手册,和SPI通信相关的引脚有4个,CS,SCLK,MISO,MOSI这四个引脚。CS引脚是选片引脚,引脚拉低之后就可以开始通信了,SCLK引脚是时钟引脚,MISO,MOSI这两个引脚都是数据传输引脚,在这个模式下,SCL时钟信号的上升沿,芯片接收信号,SCL时钟信号的下降沿,芯片发送信号。

2022-11-20 17:02:46 3591

原创 STC8学习-- IIC通信3

大部分是通过配置主机寄存控制器I2CMSCR 来进行的,I2CMSCR的低四位按照特定要求置为0和1可以实现IIC的启动,停止,发送,接收以及应答。//发送读ACK命令。,不要通过 |=操作来进行,与或操作多次之后,寄存器低四位都有可能被置为1,这样就不是预期的配置结果了。,启动,停止,发送,接收以及应答函数写完了,就可以按照之前的顺序拼接成,读数据写数据函数。//使能I2C功能,单片机工作在主机模式,设置时钟为63。

2022-11-20 11:54:41 1159

原创 STC8学习--I2C通信2

按照时序图如下,函数中涉及到两处地址,第一处是从机地址(因为IIC总线可以连多个从机,从机地址可以确定是哪个从机),第二处是从机中的寄存器地址(就可以确定是写在从机里面哪个寄存器的地址),(前者不用作为函数参数输入,因为学习机上只有一个从机,调用前就已经确定了,如果有多个从机的话,就可以把它作为参数带上)2.发送字节函数,就是将字节变量按位赋予SDA引脚,通过引脚的高低电平变化,将字节发送出去。接收字节函数,即接收SDA上的引脚电平变化,将接收到的结果存放到字节上,最后将结果返回。/* I2C应答 */

2022-11-19 17:42:16 763

原创 STC8学习-- I2C通信

2.关于I2C通信,它和串口相似的地方,都是两个端口进行通信。但是串口通信时,只有一个传输数据,另一个就会拉高,因为串口通信时已经提前约定好了波特率,所以通信时可以只用一个端口。而I2C 通信就需要同时使用两个端口。3. I2C通信有固定的输出格式,启动,I2C设备地址,应答,写入数据的单片机地址,应答,写入的数据,应答,结束。其中启动,应答还有结束,需要SDA和时钟信号SCL信号按照固定格式输出。1.关于qma7981芯片。拿到新的芯片需要关注的有两点,一个是引脚定义,另一个是手册上的电路图。

2022-11-14 23:02:59 760

原创 STC8学习-ADC2

如果我在 void Fetch_VDDA(void) 函数里面定义局部变量VDDA,然后在主函数里面调用会报错,如果接着在主函数里面定义另一个VDDA变量,那么主函数里面的VDDA查询结果就为0.要像解决这个问题,就要定义一个全局变量VDDA,那么void Fetch_VDDA(void) 函数中的计算结果就可以在主函数中调用。//串口1选择定时器2为波特率发生器。//定时器2时钟为Fosc,即1T。//设置P0.0~P0.7为双向口模式。/* 发光二极管引脚定义 *//* 串口初始化函数 */

2022-11-14 22:27:38 990

原创 STC8学习--设置.h文件

uart.h头文件,头文件的写法 #ifndef __UART_H表示如果没有定义 , #define __UART_H表示定义__UART_H 定义uart.h头文件 , #endif结束定义。1.设置.h文件的好处有 可以使得main.c文件可以起来更干净,可读性要好。//串口1选择定时器2为波特率发生器。//定时器2时钟为Fosc,即1T。c文件里面要包含uart.h文件 ,因为涉及到SCON等寄存器配置,所以也要有。

2022-11-12 19:48:27 1320

原创 STC8学习 ——ADC 1

1.普通的IO口只能识别0和1,以STC8的IO口为例,输入0.7V识别为0,输入3.3V识别为1,输入一个0.7 ~3.3 V的电压,IO口的输入结果就是随机的了。2.STC8有10位的ADC模数转换口,10位指的是将0到3.3V电压进行分割的份数,即1024份,位数越多,测量结果越精确,因为分割的份数多。3. 因为要通过串口观察查询到的结果,所以串口初始化函数要保留。//设置采集到的数据右对齐,采集速度为16分频。4.串口自带的输出功能太麻烦,这里要用的printf函数。

2022-11-09 21:21:35 3487 2

原创 STC8学习6 ——串口

1.串口通信,硬件上是通过 USB转TTL实现的,USB传输数据用 USB协议,TTL使用的是串口协议,不能直接进行通信,需要用CH340芯片进行转换。SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。2.STC-ISP上有串口配置生成器,下面就是按照35MHz,波特率115200,8位可变数据,定时器1自动重装产生的配置。//串口1选择定时器1为波特率发生器。用if(RI ==1)来判断是否有输入,接受的数据会存放到。

2022-11-07 22:21:23 2497

原创 STC8学习5 - 定时器

3. 计算初始置,以定时1ms为例,1ms = 1000us 计数间隔是1/35 us,那么需要1000/(1/35) = 35000个间隔 ,就是说经过35000个计数后,时间间隔为1ms,那么就设置初始置为65536 - 35000 = 30536,转换16进制就是 0x7748 ,按高低为分给TL0,TH0.AUXR |= 0x80;//启动定时器0计数。//使能定时器0中断。4.使能定时中断,还有总中断。

2022-11-05 18:25:33 3144

原创 STC8学习4 ——PWM波形应用

2.PWM控制LED灯亮度,肉眼无法识别PWM波形带来的LED灯明灭交替,看到效果就是LED的亮度变暗。通过PWM波形占空比的大小调整,就可以控制LED灯的明暗程度了。// ENO=1把P0.5引脚设置为PWM引脚 INI=0初始电平是低电平。3.PWM的使用,通过控制占空比从0变到100再变到0,来控制LED从暗变为明,又由明变暗,达到呼吸灯的显示效果。// PWM0CEN=1开启PWM定时器开始计数。// 最高位EAXFR置1 允许访问XFR寄存器。// 选择PWM0的时钟为系统时钟。

2022-11-05 10:21:54 2716

原创 STC8单片机学习3

4.还是应用到中断函数,老样子,中断函数名可以自定义。函数内部本质上是一个检测法,不是检测的电平,而是检测的标志位。CCFn共用一个中断函数,区别方式就是CCFn捕获到中断,那么就会调到中断函数里,对应的标志位会被置为1。单片机支持CCF功能的引脚有3组,我们要将P3.5/6/7切换至CCF功能引脚。里面的不同位来实现使能CCF的中断(第8位),设置为下降沿中断。1. 捕获中断也是中断的一种,需要设置总中断EA,才能执行。标志位寄存器,将标志位CCFn初始化为0。然后是PCA的时钟源,将其设置位系统时钟。

2022-11-03 21:49:52 899

原创 STC8单片机学习2

1. P35 .P36. P37三个引脚上各自并联了1个电容,所以设备在上电的时候,会短暂的导通。扫描法要判断引脚电平,就会出现误判。时延可以去除掉这个干扰。2.注意按下按键,循环会不停执行。那样就会不断发生位倒换计算,结果不一定是预期结果。所以要确保按键抬起前,循环没有结束。这个就需要while();

2022-11-02 20:46:31 1312

原创 STC8学习day1

nop_()是在intrins.h头文件中进行定义的,所以要在首部加上这个头文件。知识点1 关于引脚的位定义,有两种方式。知识点2 关于 _nop_();后者要注意 等号和分号。

2022-11-01 22:51:00 246

原创 STC8单片机学习1

1.定义函数来创造时延,当函数中有void,编译可以通过,但是下载到设备中现象和预期不一致。//现象就是绿灯一直亮着,没有闪烁。就是这里的void导致函数现象和预期不一直,删除后现象正常。删除后现象正常,但是搞不懂为什么?感觉是一直卡在循环第一条语句。

2022-11-01 22:45:05 321 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除