Jeff
发表于 2025-1-4 22:29:40
第十三集:简易多任务处理上 冲哥
1、理清程序的逻辑编程思路,
2、应用模块化编程(C+h)
1)LED&数码管 --led_seg.c,led_seg.h
2)按键 --key.c,key.h
3)蜂鸣器 --beep.c,beep.h
4)定时器 tim.c tim.h
函数的编写:命名规范,函数头
3、创建程序文件三步,新建文件并保存,添加到工程,添加应用路径。
4、引脚定义都在.h文件;sbit 名称 = P10;#define 名称 P10;
5、函数定义三步:定义,声明,调用。
6、修饰符extern用在变量或者函数的声明前,用来说明:此变量是在别处定义的,要在此处引用。
注意:extern修饰的变量不能赋初值。
7、bdata位寻址变量的使用。除了用sfr,还可以用bdata位寻址。
8、编程练习:多任务模块化编程,LED显示。
9、在程序中添加相应的文件夹,在添加相应的文件,然后保存到对应的文件夹,在工程里面add添加C文件地址,双击工程名添加多线程指定文件夹地址(在选择选项卡A251include地址文件夹添加)
10、在.h文件声明通用的引脚定义,包含P40,P6.P7,声明LED的通用参数名。
11、在上面对应的C文件中声明LED声明调用参数的初始值,更改刷新数码管函数的逻辑显示计算步骤。
12、在工程主程序文件DEMO中声明LED声明调用参数的初始值,然后调试。
本课程完结。
Jeff
发表于 2025-1-14 16:47:47
第十三集:简易多任务处理中 冲哥
1、批量替换 选中目标函数命,CTRL+F批量替换,搜索范围选择Current Project(整个工程)
2、寻址变量,要在变量名前加一个bdata 声明,这样可以直接按位修改,这样可用用sbit直接声明寻址变量管脚,格式为LED_DATA^0,1,2,3,4,5,6,7,
3、跨列局部选择方法,鼠标光标放在起始行位置,按住alt+shift,然后按住鼠标左键拖动选择目标行和目标列的选择区域。然后复制到预留位置(目标粘贴区域要预留出足够行数,因为这个选择KIEL5不会自增行)
4、跨行跨列选择区域后,可以根据选择成一条直线,然后在前面输入声明参数比如extern 编译器会自动根据选择行,逐行匹配添加,增加效率。尾部同样操作。
5、数码管多任务编程控制变量,.h文件声明管脚SEG,可以单独控制数码位显示,----主要作用避免刷新乱码与闪屏干扰。
6、自定义函数头的设置。
7、工程子文件的分配,为可移植提供便捷。
8、按键处理:在对应文件夹新建C文件和H文件,然后设置路径(双击工程名-C251选项卡-include Paths)
9、新文件头文件中的#defindef 与#endif的作用域,#include引用的公共头文件,新建的KEY,H文件在key.c与demo.c中的引用。---切记切记。
10、按键功能分析:
按键要满足的功能:
1、按键消抖 10ms
2、按键按下的瞬间(下降沿或上升沿的电平跳变)
3、按键松开的瞬间,。
4、按键长按3秒的扩展功能操作(比如开关机,激活隐藏功能)
按键没有按下,高电平;按键有按下,低电平。10ms检测一次, <30ms 消抖 = 30ms 单击水煎 <3000ms 单击结束,=3000,长按3秒;>3000ms,长按结束;
本课时结束。
Jeff
发表于 2025-1-14 18:23:01
第十三集:简易多任务处理 下 冲哥
1、编写有返回值的声明函数.
2、熟悉KEY函数声明写法。
3、熟悉状态的枚举函数写法与逻辑。
4、熟悉多位数组状态的控制与归零。
5、熟悉for函数写法与作用。
6、熟悉左移、与运算、取反对比状态。
7、熟悉左移、或运算、取反对比状态。
8、熟悉if...else if....函数运算逻辑。
9、熟悉|=或等于左移、&=与等于(右侧运算先取反)、左移运算的赋值与清除。
本课时完结。
Jeff
发表于 2025-1-14 20:27:24
第十三集:简易多任务处理 终结 冲哥
1、蜂鸣器使用
2、新建文件--保存在指定文件夹--添加文件--添加路径。
3、beep.c\demo.c中引用beep。H文件。
4、声明H文件的三个函数。
5、在beep.c文件中实现蜂鸣器管脚定义,
6、在beep.c文件中实现蜂鸣器三个函数定义
7、demo.c文件中引用蜂鸣器三个函数。
8、定时器操作
9、新建文件--保存在指定文件夹--添加文件---添加路径。
10、先写头文件,然后tim0.c,demo.c里面引用他,tim0.h文件。
11、实现定时器初始化移植到tim0.c并在H文件声明。
12、demo.c文件里面写main函数和中断函数时间判断。
13、测试间隔时间。
第十三课时总完结。
Jeff
发表于 2025-1-17 07:20:04
第十四集:矩阵按键
一、矩阵按键是什么?
二、矩阵按键的原理。
三、矩阵按键程序的编写。
1、矩阵按键的扫描法组合选择控制原理。IO口串联301电阻。上拉电阻10K。
2、矩阵按键的控制原理,上拉电阻10K,拉到3.3V。默认高电平,按下低电平。IO口为准双向输出输入。
3、矩阵测试程序编写。
4、先在key.h文件里#define声明 P0端口。声明读取矩阵函数MateixKEY_Read;
5、key.c文件里面实现MateixKEY_Read函数。增加MateixKEY_Delay矩阵函数专用延时函数MateixKEY_Delay.
6、MateixKEY_Read函数要点:实现列选择,现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下;注意本步骤计算采用异或求值,并要注意运算优先级(加括号区分);
7、MateixKEY_Read函数要点:实现行选择,现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下;注意本步骤计算结果采用异或求值,并要注意运算优先级(加括号区分),赋值运算采用或等于求值(|=);
8、函数最后printf输出按键结果。
9、demo.c文件中main函数中调用MateixKEY_Read()函数,调试成功,然后输出按键的十六位值。
10、为了简介明了的输出明文按键值,优化MateixKEY_Read函数,使用switch函数体输出明文键值,函数内增加一个局部变量key_val记录键值码,MateixKEY_Read函数return经过switch处理后的键值码。
11、demo.c文件中初始化数码管显示位SEG7,增加嘛 main函数内局部变量KEY_NUM并初始化赋值0,下面再函数运行时,先将函数MateixKEY_Read计算结果赋值为局部变量KEY_NUM,再将局部变量赋值给数码管先参数SEG7,调试显示1-8按键数字显示,完成。
矩阵密码锁程序的编写:
密码锁需求:
1.通过LED0模拟门锁状态,LED点亮表示门锁打开,熄灭表示门锁锁上;
2.增加8位数码管,可以动态显示8位的密码,无密码时显示 “- - - - - - - -”;
3.通过矩阵按键可以输入1-8的数字表示密码,并依次显示在数码管上;
4.每输入一个数字,蜂鸣器响20ms表示有数字按下;
5.密码正确打开LED0,密码错误蜂鸣响2秒;
6、先在demo.c文件中main函数关闭所有LED=OxFF。
7、seg_led.c文件里面seg_tab数组位数增加一位中间“-”点亮的十六进制数0xbf,不要忘记本数组总数+1.
8、按键排重(只输入一次),在key.c文件中函数MateixKEY_Read内增加一个静态变量keustate_last,静态变量修饰符用static标识;在switch循环前在包裹一层if,判断本次输入是否与前面如数相同,不同才执行switch内部循环。
9、demo.c文件中main函数内增加两个变量分别为按键值KEY_NUM和按键位数KEY_Str同时赋值为零,第一个位输出的,注意按键值循环完以后要清空,读取的按键值通过Show_Tab数组保存到数码管显示。
10、密码输够8位执行密码判断,正确点亮LED0,错误蜂鸣报警,并回复数码管统一显示“-”。
本课时完结。
Jeff
发表于 2025-1-18 10:08:37
第十五集:外部中断 冲哥
一、中断和中断系统。
二、什么是外部中断。
三、外部中断的用法。
STC32G手册第十二章详细讲解中断理论。
简论:当中央处理CPU正在处理某件事外界突然发紧急事件请求,暂停当前主线程命令,进入中断,然后处理请求,再返回主线程继续工作,中断有独立优先级。有总中断开关和独立控制的,可以用软件控制。
1、各型号中断源截图,略。
2、外部中断int0--int4共五个。
3、什么是外部中断,由于外部因素导致单片机的一个引脚导致电平变化。只能使用固定型号的固定引脚才能触发中断。
4、引脚查询手册检索STC32G中断图解。
5、int0触发中断, int0=0,上升或下降都触发一次,int0=1,只有下降沿可以触发中断。
6、IE0,外部中断0请求标志,中断程序中,硬件自动清零。在程序中最好手动清零,防止误进入中断操作。
7、EX0:外部中断0中断允许位,0禁止int0中断,1允许int0中断。
8、代码编写练习优先级的外部中断在工业中的应用。
9、新建中断文件夹EXIT,里面新建exit.h,exit.两个文件。
10、添加两个文件到项目中。
11、点击 Options for Target快捷图标,选择C251选项卡,添加上面两个文件的应用路径。
12、填写exit.h文件,并在,exit.c,demo.c中#include引用这个文件。
13、exit.h中声明外部中断函数初始化 INT0_Init函数。
14、exit.c文件中实现INT0_Init函数,中断发生规范IT0,是否允许中断EX0,IE0清除中断。
15、demo.c文件main函数中调用中断。
16、demo.c文件中添加外部中断void INT0_Isr(void) interrupt 0里面的执行动作,开发标准应该写在exit.c里面,这样方便编写和调试。
17,调试通过-并演示外部中断的紧急干预与实际应用讲解--比如自动化设备的紧急急停按钮。
本课时完结。
Jeff
发表于 2025-1-18 10:22:19
截止今天为止完成了冲哥的课时要求,当然后面还要继续学习一遍其他课程,温故而知新。
Jeff
发表于 2025-1-30 21:13:01
第十六集:IO中断冲哥
一、什么是IO中断?
二、IO中断的用法。
三、中断优先级的设置。
四、实战练习。
1、普通IO口均可中断,不是传统外部中断。----STC原创独有的领先功能。
2、支持四种中断模式:下降沿、上升沿、低电平、高电平。
3、每组IO口都有独立中断入口地址,且每个IO口可独立设置中断模式。 32G-BETA版本的下降沿中断孼上升沿中断暂时不要用。
4、IO中断的用法:端口中断模式配置寄存器(PxIM0.PxIM1)图略。中断模式四种00、01、10、11
5、端口中断使能寄存器(PxINTE),PxINTE.x:端口中断使能控制位(N=0~7,x=0~7)0:关闭Pn.x口的中断功能,1:使能Pn.x口使能中断。
5、端口中断使能寄存器(PxINTF),PxINTF.x:端口中断使能控制位(N=0~7,x=0~7)0:没有Pn.x口的中断功能,1:Pn.x有中断请求。若使能中断则会进入中断服务程序。标志位需要软件清0。
6、关于中断号大于31在KEIL中编译出错的处理(目前KEIL只支持32位0-31)。需要借用保留中断号13。
7、安装《拓展KEIL的C代码中断号(支持0-254)》,网站下载安装。
8、代码练习
9、exit里面增加P3Exit_Init低电平中断初始化化函数,demo里面增加P3Exit_Isr(void) interrupt 40中断入口函数,在main里面EA中断前面引用P3Exit_Init初始化。
10、演示效果中断里面增加了500MS延时,实际项目千万千万千万不要在中断里面加延时,切记!!!。
11、端口中断优先级控制:相同优先级:靠前的中断先执行,执行完后再执行低中断,且一个中断在执行的时候不能被打断。
12、在tim0.c文件中定时器初始化函数Timer0_Init中增加优先级IP =0x02;//设置为最高优先级IPH = 0x02;避免被打断。
13、想让数码管刷新不被打断两个方法:1、定时器0优先级提高,让定时器可以打断P3口中断。2定时器0工作模式设置为模式3,不可屏蔽中断。
14、简易中央门锁控制系统。
15、DEMO.C文件main函数增加门锁状态参数 LOCK_State。
16、初始化LED = LOCK_State; 原始位置,。
17、按键算法“异或等于”求值LOCK_State ^= (1<<(KEY_NUM-1));//获取当前第一个按钮按下,{1~8}->> 异或算法。
18、重新输出LED计算后的状态。
19、按键5秒倒计时逻辑分析。
20,单独按键增加蜂鸣2.
21、数码管中断优先级的注意。
本课时完结。
Jeff
发表于 2025-2-2 18:47:05
这两天没有更新是因为在测试STC32G12K128实现箱V9.62(2023-5-19)测试内部IO中断(第十六集:IO中断冲哥)发现一个问题。
调试本节课程正常,但是当手机靠近实验箱时会自动激活P35按钮(手机息屏点亮屏幕就激活),估计与手机发射频率有关,琢磨了两天也没解决这个问题,白浪费时间。
本次回复做个备注,后面电路复建的时候再考虑这个问题。
Jeff
发表于 2025-2-2 18:51:48
上面没说具体,是自动激活IO中断中的密码锁全开5秒倒计时那个功能,好神奇。